显示器参数检测

把浏览器能看到的屏幕参数一次读全:分辨率、像素比、色深、色域、刷新率和触控能力,再按标称尺寸算出 PPI 和点距。

这些数值能说明什么,不能说明什么

报告色深不是面板位深。浏览器给出的 colorDepth 描述的是它自己那块帧缓冲区的位深,跟面板原生是 8 位还是 10 位没有必然关系。一块 8 位面板跑在 10 位输出管线上,读到的照样是 30;反过来,10 位面板在没有开启高位深的系统上只会报 24。所以这个数字能用来判断「当前输出管线开到多少位」,不能用来给面板定性。想验证面板,得看灰阶和渐变测试的实际表现。

色域等级只说明「浏览器认为能到哪一档」。媒体查询只会返回 srgb、p3、rec2020 三档,不会给具体覆盖率。所以一块覆盖 82% P3 的屏和一块覆盖 99% P3 的屏,在这里可能都显示 p3。反过来,读到 srgb 也不代表屏幕一定是窄色域——系统色彩管理没正确识别时也会回落。要准确测色域覆盖率,只能靠色度计。

刷新率实测值的上限受浏览器限制。requestAnimationFrame 的回调频率就是浏览器准备提交帧的频率,它会被显示器刷新率限制,但也会被节能模式、窗口失焦、以及页面自身的计算量拖低。所以测出 59.5 而不是 60,是正常的测量误差;测出 30,多半是省电模式或者页面在忙。另外,Windows 上如果没在显示设置里把刷新率调上去,浏览器也只能按 60 走。

页面缩放和系统缩放是两件事。这里的「页面缩放」是按像素比和屏幕宽度反推出来的近似值,浏览器自己的缩放会被算进设备像素比,所以调整缩放会让这个数字变化;滚动条出现时读数会偏低一两个百分点。而「像素比」反映的是系统缩放加浏览器缩放的叠加结果。想知道分辨率有没有设到原生值,把「视口(物理像素)」和系统显示设置里的分辨率对一下最快。

换个屏幕就要重新检测。笔记本电脑外接显示器、或者把浏览器窗口拖到另一块屏上,screen 的读数和 devicePixelRatio 都会立刻变,但页面不会自动重算。这时候点一下「重新检测」就能拿到新屏幕的参数。多屏且两块屏缩放比例不同的情况下,像素比是跟着窗口所在的那块屏走的。