屏幕分辨率测试

把「屏幕分辨率」拆成四组宽度加一个 DPR 来看:screen 是整块屏,innerWidth 含滚动条,clientWidth 不含,outerWidth 是窗口外框。物理像素 = CSS 像素 × devicePixelRatio,必须取整。

默认取本页检测到的 screen.width
用来算百万像素与宽高比
Win 125% = 1.25、150% = 1.5、175% = 1.75
四组宽度(本页在 1920×1080、DPR 2 的环境下测得,实际值以你打开本页时的读数为准)
screen.width × height      1920 × 1080 CSS px   整块屏幕,不含浏览器边框与地址栏
innerWidth × innerHeight   1920 × 900  CSS px   视口宽高,含垂直滚动条占位
clientWidth × clientHeight 1905 × 900  CSS px   视口宽高,不含滚动条
outerWidth × outerHeight   1936 × 1040 CSS px   整个浏览器窗口外框

设备像素比 devicePixelRatio = 2(设备像素 ÷ CSS 像素)
物理像素 = CSS 像素 × DPR = 1920 × 2 = 3840 × 2160(Math.round 取整)
百万像素 = 3840 × 2160 ÷ 1e6 = 8.29 MP
宽高比 = 1920 : 1080 = 16 : 9
滚动条占位 = innerWidth − clientWidth = 15 CSS px

色域 srgb|触摸点数 0|视口方向 横屏

(以上为服务端直出的演示值;脚本会用你真实的 window 读数覆盖它)

常见逻辑分辨率 × DPR → 物理像素对照(12 行)

逻辑分辨率DPR物理像素宽 × DPR高 × DPR说明
1920×108011920×1080192010801080p 显示器 / 笔记本原生
1920×10801.252400×1350240013501080p + Windows 125% 缩放
1920×10801.52880×1620288016201080p + Windows 150% 缩放
1920×108023840×2160384021601080p 笔记本 Retina / 高清屏
1366×76811366×7681366768老款笔记本原生
1366×7681.52049×115220491152768 屏 + 150% 缩放,2.36 MP
2560×144012560×1440256014402K 显示器 100%
2560×144025120×2880512028802K + Retina
3840×216013840×2160384021604K 显示器 100%
3840×21601.55760×3240576032404K + 150%,工作区 2560 宽
3840×216027680×4320768043204K 高分笔记本原生
768×102421536×204815362048iPad 竖屏

使用方法

  1. 屏幕分辨率测试打开即自动检测,无需点任何按钮。默认示例按 1920×1080、DPR 2 的环境直出,脚本会用你真实的 window 读数覆盖。
  2. 「逻辑宽 / 逻辑高」默认取检测到的 screen.width/height,你可以改成任何 1~16000 的值来算别的屏幕。「缩放档位」默认取实测 devicePixelRatio,也可以手填 0.1~10。
  3. 点「重新检测」或改动任一输入框都会重算(单行输入裸按 Enter 立即触发)。四张卡给出逻辑分辨率、物理像素、百万像素与宽高比。
  4. 「色域 / 触摸点 / 视口方向」三行是附加信息:广色域屏在同 DPR 下观感更细,触摸点数能判断是不是触屏设备。
  5. 下方 12 行对照表覆盖 5 种逻辑分辨率 × 6 档 DPR,可导出 CSV;点「复制结果」把整份读数带走。

这个屏幕分辨率测试能解决什么问题

一是回答「我的屏幕到底多少」这个被问错的问题。同一台机器上「分辨率」至少有三种答案:Windows 显示缩放 125% 时,系统把 1920×1080 的物理屏暴露为 1536×864 CSS 像素;浏览器再按 Ctrl+ 加到 150%,视口又变成 1280×720。你去任何一个分辨率检测网站,看到的往往是第三种。本页把四组宽度一次列全,并明确标出每个数字的来源,你自己判断哪个才是你要的。

二是解释「为什么同一张截图在不同设备上尺寸不一样」。一张 3840×2160 的图片,在 DPR 1 的屏上占满窗口,在 DPR 2 的屏上只占四分之一——因为 CSS 像素是布局单位,设备像素才是屏幕上的小格子。物理像素 = CSS 像素 × DPR 这条等式一旦看懂,图片模糊、按钮太小、@media 断点不生效就都不神秘了。

三是给「浏览器缩放导致横向滚动条」一个确切解释。width: 100vw 包含垂直滚动条宽度,而 width: 100% 不包含——这就是为什么用 100vw 的页面会多出 15 像素横向溢出。Windows Chrome/Edge 的经典滚动条是 15 CSS 像素,本页面板里的 innerWidth − clientWidth 就是这个差值。你可以直接看到自己机器上是 15、17 还是 0(macOS 默认 overlay 滚动条常为 0)。

屏幕分辨率测试不做这些事:不告诉你显示器是几寸、什么面板——那是屏幕尺寸计算器的活,需要你自己填物理宽高;不测刷新率、色深、HDR 亮度这些需要用户授权或专用 API 的指标;也不判断「这个分辨率好不好」。如果你要的是CSS 尺寸单位之间的换算(如 1rem 等于多少像素),请用em 转像素。

原理:CSS 像素、参考像素,与四组宽度各自的含义

什么是 CSS 像素,它和英寸是什么关系。CSS Values and Units Level 3 规定「参考像素」为 1 CSS px = 1/96 inch,这是一个约定而非物理事实:CSS 像素的物理大小取决于观看距离与设备密度。devicePixelRatio(由 CSSOM View 规范定义)就是设备像素数 ÷ CSS 像素数这个比值。DPR = 2 表示一个 CSS 像素对应 2×2 个设备像素。所以物理像素 = CSS 像素 × DPR,且因为屏幕上的像素格必须是整数,乘出来的结果要用 Math.round 取整。

为什么 DPR 会有 1.25、1.5、1.75 这种非整数。Windows 的显示缩放档位是 100%、125%、150%、175%、200%、250%、300%,对应的 DPR 就是 1、1.25、1.5、1.75、2、2.5、3。Mac 的非整数缩放同理。这个非整数值带来一个实际后果:物理像素宽不一定是 CSS 宽的整数倍。1366 × 1.5 = 2049 恰好整数,但 1920 × 1.25 = 2400 也整除;真正会出问题的是 175% 这类 7/4 的档位,1920 × 4/7 = 1097.14,落到 1097。这也是本页强调「必须取整」的原因。

四组宽度分别是什么,这是本页最核心的区分。

四者的关系可以直接用来诊断问题。outerWidth > screen.width 告诉你窗口确实比屏幕小(没全屏);innerWidth − clientWidth 告诉你滚动条有多宽;screen.width − clientWidth 则大致等于「窗口边框 + 侧边栏 + 滚动条」的总和。本页在默认环境(1920 宽屏)下的实测是:outerWidth 1936、screen.width 1920、innerWidth 1920、clientWidth 1905,滚动条占位 15 CSS 像素。

缩放如何改变测量结果,这是最容易误解的地方。浏览器缩放(Ctrl +/−)会改变 devicePixelRatio:100% 时 DPR=1,125% 时 1.25,150% 时 1.5,200% 时 2。而同一块 1920 物理像素的屏幕,在这些档位下暴露的 CSS 宽度分别是 1920、1536、1280、960。复算:1920 ÷ 1.25 = 1536(整除)、1920 ÷ 1.5 = 1280(整除)、1920 ÷ 1.75 = 1097.14(不整除,落到 1097)。这就是为什么 Windows 175% 档在 1080p 屏上会出现「可用高度只剩 617」这种反直觉数字——1080 ÷ 1.75 = 617.14,取整 617。

DPR 大不等于屏幕分辨率高,这是本页最想纠正的误解。1366×768 的笔记本,浏览器缩放 200% 后 DPR = 2,和 4K 屏的 DPR 一样是 2,但它的 CSS 可视区只剩 1366 ÷ 2 = 683×384,面积是 4K 屏 CSS 可视区(1920×1080)的 1/7.9。物理像素没变,「看起来更清晰」只是因为单位 CSS 像素变小了。判断屏幕大小要看 screen.width,判断清晰度要看 DPR,两个维度互相独立。

为什么物理像素要 Math.round 而不能直接显示小数。屏幕上的像素格是整数,1366 × 1.5 = 2049 是整数,但 1097.14 这样的值在物理上不存在。本页统一用 Math.round(css × dpr),并在下表里把「宽 × DPR」「高 × DPR」两列单独列出,让你能看到取整前后的差异。1366 × 1.5 = 2049.0 是整的,但如果换成 1367 × 1.5 = 2050.5,取整就是 2051(Math.round 对 .5 向上)。

用 matchMedia 精确查询 DPR 档位。CSS 媒体查询支持 resolution 单位,window.matchMedia('(resolution: 2dppx)').matches 能逐档匹配实际 DPR,(min-resolution: 2dppx) 做阶梯判断。dppx 的定义是「每 CSS 英寸多少点」,1dppx 即 DPR 1、2dppx 即 DPR 2,因为 1 CSS 英寸 = 96 CSS px,DPR 2 时 1 CSS 英寸就含 192 个设备像素。本页的「缩放档位」输入框就是让你手填这个值来对照。

跨屏拖动时数值会变,页面必须能重算。把窗口从 Retina 屏拖到普通屏,Chrome 会重新计算 DPR 并触发 resize 与 matchMedia 的 change 事件;此时 devicePixelRatio 和 screen.width 都会变。本页监听 resize 自动重算,所以你拖窗口时看到的数字会跟着变——这不是 bug。另外 screen 只报告主屏,副屏的尺寸要用各屏自己的 matchMedia 判断,本页不做多屏枚举。

触点数与色域是附赠的两条线索。navigator.maxTouchPoints 的典型值是 0(无触屏)、5(手机)、10(双屏折叠设备);window.matchMedia('(color-gamut: p3)').matches 为真表示广色域屏。它们与分辨率无关,但能解释「同样的分辨率为什么这台看着更舒服」。

完整示例(数值仅作演示)

示例条件:逻辑宽 1920、逻辑高 1080、缩放档位 2。逐项核对:

这六个数字都能在下方对照表里印证:第 1 行(1920×1080 @ DPR 1 → 1920×1080)与第 4 行(1920×1080 @ DPR 2 → 3840×2160)是同一块屏在两档缩放下的对照;第 6 行(1366×768 @ DPR 1.5 → 2049×1152)说明取整后仍是整数;第 11 行(3840×2160 @ DPR 2 → 7680×4320)是全表最大的物理分辨率,33.18 MP。

输入范围与对照表

下面这张对照表是全站最常被引用的分辨率换算基准,12 行覆盖 5 种逻辑分辨率与 6 档 DPR:

逻辑分辨率DPR物理像素百万像素工作区 CSS 宽常见设备
1920×108011920×10802.07 MP19201080p 显示器,100% 缩放
1920×108023840×21608.29 MP1920MacBook Pro 14/16 英寸
1920×10801.52880×16204.67 MP12801080p + Win 150%
1366×76811366×7681.05 MP1366老款笔记本,100%
1366×76822732×15364.20 MP683同屏缩放到 200%,可视区仅 683 宽
2560×144012560×14403.69 MP25602K 显示器,100%
2560×14401.253200×18005.76 MP20482K + Win 125%
3840×216013840×21608.29 MP38404K 显示器,100%
3840×21601.55760×324018.66 MP25604K + Win 150%,等价 2K 工作区
3840×216027680×432033.18 MP38404K 高分笔记本原生
768×102421536×20483.15 MP768iPad 竖屏
1080×192033240×576018.66 MP360手机竖屏 DPR 3

最后一行值得注意:1080×1920 是物理分辨率,乘 DPR 3 得 3240×5760,逻辑宽只有 360(1080 ÷ 3)。这就是为什么手机网页的 CSS 断点从不见 1080——1080 那是物理像素,360 才是布局用的数字。同理第 4、5 行的对比最直观:同一块 1366×768 的屏,DPR 1 时可视区 1366 宽,DPR 2 时只剩 683 宽,物理像素完全没变。表里第 2 行与第 10 行也是同一类:1920×1080 @ DPR 2 的物理像素是 3840×2160,工作区 CSS 宽 1920;3840×2160 @ DPR 2 的物理像素是 7680×4320,工作区仍是 3840。

边界与精度说明

常见问题

为什么我看到的分辨率和买显示器时标的不一样?

因为「标称分辨率」是物理像素,而网页里的 CSS 像素要乘 DPR。27 寸 4K 屏的标称是 3840×2160,但 Windows 默认 150% 缩放时 screen.width 报的是 2560(3840 ÷ 1.5),网页作者看到的也是 2560。要拿物理值,把 screen.width 乘上 devicePixelRatio,也就是本页表格里「物理像素」那一列。

devicePixelRatio = 2 是不是就等于 Retina 屏?

不是。DPR 是一个比值,任何原因让它变成 2 都会报 2:Retina 屏在 100% 缩放下是 2;普通 1080p 屏在浏览器缩放 200% 下也是 2;Windows 系统缩放 200% 同样是 2。想判断物理分辨率,必须把 DPR 乘回去看 screen.width × DPR,而不是看 DPR 本身。

innerWidth 和 clientWidth 到底该用哪个?

做布局用 clientWidth。它不含垂直滚动条,而 innerWidth 含——这就是 width: 100vw 会比可用宽度多出 15 像素(Windows 经典滚动条)进而产生横向滚动条的原因。判断视口大小时两者都行,判断布局边界时必须用 clientWidth 或 100%。

我把浏览器缩放调大,DPR 就变了,这正常吗?

正常,这是设计如此。浏览器缩放改变的正是「一个 CSS 像素对应多少设备像素」,所以 DPR 会跟着变。100% 时 DPR=1,125% 时 1.25,150% 时 1.5,200% 时 2。物理像素总数始终不变——变的只是你用多大的格子在描述它。所以 DPR 变大不代表屏幕变清晰了,只代表每个 CSS 像素变小了。

为什么 1366×768 缩放到 200% 后可视区只剩 683 宽?

因为 CSS 宽 = 物理宽 ÷ DPR = 1366 ÷ 2 = 683。物理像素一个没少,但描述它用的 CSS 格子变大了一倍,能装下的格子数就减半。这时 screen.width 报 1366(屏幕没变),innerWidth 报 683(视口真的变窄了)。这两个数字同时出现,正好说明「屏幕尺寸」和「可用布局空间」是两件事。

页面为什么每次打开数字都不一样?

因为它读的是你当前这台设备、当前这个窗口的真实状态:窗口大小、是否全屏、有没有滚动条、屏幕缩放档位、是否触屏。别人截的图和你打开时看到不同是正常的。本页顶部的四组宽度与 DPR 就是用来消解这个疑问的——你能看到每个数字的来源,不必猜。

多屏 setups 下这些数值是哪块屏的?

screen 对象只报告主屏,副屏的尺寸需要枚举各屏或用各自的 matchMedia 判断,网页无法拿到完整的多屏列表。把窗口拖到副屏时 screen.width 与 DPR 可能不变,但 innerWidth 会变(视口确实换了),且 DPR 变化时浏览器会触发 resize,本页会自动重算。要精确知道每块屏的参数,用系统自带的显示设置而不是网页。

检测会读取我的隐私或上传信息吗?

不会。全部读数来自 window.screen、window.innerWidth、document.documentElement.clientWidth、navigator.maxTouchPoints 和 matchMedia 这些本地属性,没有任何网络请求,也不写 Cookie 或 localStorage。本页是纯静态页面,你可以断网打开。它也不会申请任何权限——不像摄像头、剪贴板那类 API 会弹授权框。

相关工具