疑难杂症:运用 transform 导致文本模糊的现象探究

简介: 疑难杂症:运用 transform 导致文本模糊的现象探究

在我们的页面中,经常会出现这样的问题,一块区域内的文本或者边框,在展示的时候,变得特别的模糊,如下(数据经过脱敏处理):

4b65d7b8651041268f0373d24d90d3cd_tplv-k3u1fbpfcp-zoom-1.png

正常而言,应该是这样的:


892bd3d729fd4c3f965a5cd787e784a2_tplv-k3u1fbpfcp-zoom-1.png


emmm,可能大图不是很明显,我们取一细节对比,就非常直观了:

01da86a2cbf3421396ab09e34fd4e505_tplv-k3u1fbpfcp-zoom-1.png


何时触发这种现象?



那么?什么时候会触发这种问题呢?在 Google 上,其实我们能搜到非常多类似的案例,总结而言:


  1. 当文本元素的某个祖先容器存在 transform: translate() 或者 transform: scale() 等 transform 操作时,容易出现这种问题

当然,这只是必要条件,不是充分条件。继续深入探究,会发现,必须还得同时满足一些其它条件:

  1. 元素作用了 transform: translate() 或者 transform: scale() 后的计算值产生了非整数

譬如,上述案例触发的 CSS 代码如下:


.container {
    position: absolute;
    width: 1104px; 
    height: 475px;
    top: 50%;
    transform: translateY(-50%);
    // ...
}


由于元素的高度为 475px,translateY(-50%) 等于 237.5px,非整数,才导致了内部的字体模糊。


但是,需要注意的是,并非所有产生的非整数都会导致了内部的字体模糊。

这里有个简单的示意:

150341331-3c591701-a95b-4cb4-8c3c-131a073a2c11.gif


还是上述的例子,当高度从 477px 一直调整到 469px 的过程中,只有 477px 和 475px 导致了模糊,而 473, 471, 469 则没有。所以,这也只是引发模糊的一个必要条件。


  1. 文本内容是否模糊还与屏幕有关,高清屏(dpr > 2)下不容易触发,更多发生在普通屏幕下(dpr = 1)


在我实测的过程中还发现,这个现象基本只会发生在 dpr 为 1 的普通屏幕下。

类似于 MAC 的高清屏幕则不太会触发这个问题。


dpr = 物理像素 / 设备独立像素,表示设备像素比。这个与我们通常说的视网膜屏(多倍屏,Retina屏)有关。设备像素比描述的是未缩放状态下,物理像素和设备独立像素的初始比例关系。


  1. 并非所有浏览器都是这个表现,基本发生在 chromium 内核。


为何发生这种现象呢?



那么,为何会发生这种现象?针对这个问题,没有找到特别官方的回答,普遍的认为是因为:


由于浏览器将图层拆分到 GPU 以进行 3D 转换,而非整数的像素偏移,使得 Chrome 在字体渲染的时候,不是那么的精确。


关于这个问题,感兴趣的可以再看看这两个讨论:



如何解决?



那么针对这个问题,我们该如何解决呢?社区里给出的一种方案:


  1. 给元素设置 -webkit-font-smoothing: antialiased

font-smooth CSS 属性用来控制字体渲染时的平滑效果,该特性是非标准的,我们应该尽量不要在生产环境中使用它。并且在我的实测中,这个方法不太奏效。

  1. 保证运用了 transform: translate() 或者 transform: scale() 的元素的高宽为偶数

如果你赋予给元素的 transform 的值非常明确,譬如我上文例子中的利用其来对元素进行水平垂直居中 -- transform: translate(-50%, -50%),让元素的高宽为偶数这个方法是可行的,但如果当你无法确定transform 的值,譬如 transform: translateX(-31.24%) 或者是 transform: scale(1.05)`,那这个方法依旧无法奏效。

  1. 弃用 transform

如果这个问题对你的页面非常致命,那么只能弃用 transform,寻找替代方案。大部分的时候,我们还是可以找到不使用 transform 的替代方案的。

总结一下,本文简单探究了在 Chromium 内核下,使用了 transform 导致内部文本模糊的现象,并且给出了一些可尝试的解决方案,实际遇到,需要多加调试,尝试最优的解决方案。

目录
相关文章
|
7月前
|
存储 安全 编译器
C++学习过程中的一些值得注意的小点(1)
C++学习过程中的一些值得注意的小点(1)
|
机器学习/深度学习 人工智能 自然语言处理
一文尽览 | 开放世界目标检测的近期工作及简析!(基于Captioning/CLIP/伪标签/Prompt)(上)
人类通过自然监督,即探索视觉世界和倾听他人描述情况,学会了毫不费力地识别和定位物体。我们人类对视觉模式的终身学习,并将其与口语词汇联系起来,从而形成了丰富的视觉和语义词汇,不仅可以用于检测物体,还可以用于其他任务,如描述物体和推理其属性和可见性。人类的这种学习模式为我们实现开放世界的目标检测提供了一个可以学习的角度。
一文尽览 | 开放世界目标检测的近期工作及简析!(基于Captioning/CLIP/伪标签/Prompt)(上)
|
2月前
|
人工智能 安全
要求CHATGPT高质量回答的艺术:提示工程技术的完整指南—第 4 章:控制温度和 Top-p 采样
要求CHATGPT高质量回答的艺术:提示工程技术的完整指南—第 4 章:控制温度和 Top-p 采样
23 1
|
7月前
|
存储 算法 搜索推荐
错位处理技术探究
错位处理技术探究
|
7月前
|
机器学习/深度学习 编解码 并行计算
【传知代码】用二维图像渲染3D场景视频-论文复现
mip-NeRF是针对NeRF(Neural Radiance Fields)的改进模型,旨在解决NeRF在不同分辨率下渲染图像时的模糊和伪影问题。mip-NeRF通过引入多尺度表示和圆锥体采样,减少了图像伪影,提升了细节表现力,同时比NeRF快7%,模型大小减半。相比NeRF,mip-NeRF在标准数据集上的错误率降低17%,多尺度数据集上降低60%。此外,它的渲染速度比超采样NeRF快22倍。该模型适用于3D场景渲染和相关应用,具有广阔的发展前景。
103 2
|
6月前
|
机器学习/深度学习 监控 算法
傻傻分不清目标检测、语义分割和实例分割,看这篇就够了
傻傻分不清目标检测、语义分割和实例分割,看这篇就够了
406 0
|
7月前
|
机器学习/深度学习 编解码 自动驾驶
目标检测 | Soft Anchor匹配与事件相机检测相互成就,无label也不在话下
目标检测 | Soft Anchor匹配与事件相机检测相互成就,无label也不在话下
248 0
|
机器学习/深度学习 编解码 算法
CV之NoGAN:利用图像增强技术(图片上色)实现对旧图像和电影片段进行着色和修复(爱因斯坦、鲁迅旧照/清末官员生活场景等案例)
CV之NoGAN:利用图像增强技术(图片上色)实现对旧图像和电影片段进行着色和修复(爱因斯坦、鲁迅旧照/清末官员生活场景等案例)
CV之NoGAN:利用图像增强技术(图片上色)实现对旧图像和电影片段进行着色和修复(爱因斯坦、鲁迅旧照/清末官员生活场景等案例)
|
传感器
如何利用波段组合解决同物异谱和异物同谱现象?
如何利用波段组合解决同物异谱和异物同谱现象?
290 0
|
存储 编解码 C++
实验分析非常精彩 | Transformer中的位置嵌入到底改如何看待?(二)
实验分析非常精彩 | Transformer中的位置嵌入到底改如何看待?(二)
582 0