之前一直使用公司发的 1080P 瞎眼屏,实在是受不了,自费买了红米的 a27u Type-C 版。完美,它简直就是 MacBook 的绝配。
在查看显示器分辨率时,我发现自动设置的是「1920x1080(默认)」,当手动调整至「3840x2160」之后,所有 UI 都变得非常小,文字反而小到没法看了。
这是因为设备的 devicePixelRatio,以下简称 dpr。
Mac 的屏幕自称「视网膜显示器」,在网页缩放比例为 100% 的情况下,它的 dpr 值是 2,表示它在单个方向上使用 2 个物理像素点渲染 1 个网页 css 像素。
而其他普通显示器的 dpr 通常为 1。
使用「1920x1080(默认)」,并不能显示出更多的内容,但是肉眼看会非常清晰。
说回正题。
正因为我使用了这台与 MacBook 屏幕表现一致(指 dpr 值都为 2)的显示器,所以在开发一个新的需求时,没有发现 dpr 发生变化时 Canvas 变模糊的问题。
当把一个网页从低倍率(dpr为 1)显示器拖动到高倍率(dpr 为 2)的显示器上时,假如上面的 Canvas 绘制逻辑未做适配,没有重绘,则会发现上面的文字、图片都会变模糊。
基于 Canvas 的富文本编辑器通常会设计一套自己的缩放系统,它不仅要考虑自身的缩放功能、设备的 dpr 变化,还要考虑网页浏览器的缩放功能。这里后续我会单独写篇文章介绍如何设计。
关于这个 bug,我通过媒体查询实现了对 dpr 变化的监听逻辑,dpr 变化时,对整个 Canvas 的缩放比例进行一次校正和重绘。所有文字绘制时,字体大小的计算应该包含一个当前 dpr 的比例系数。