CSS 渐变锯齿消失术,你学会了吗?

网站建设4年前发布
9 0 0

20230306135835787cdc0972901faec0a712b15d47e55237744d481,在 CSS 中,渐变(Gradient)可谓是最为强大的一个属性之一。,但是,经常有同学在使用渐变的过程中会遇到渐变图形产生的锯齿问题。,那么,什么是渐变图形产生的锯齿呢?,简单的一个 DEMO:,效果如下:,2023030613583777c26a07230156b7836638116f024678daf52c343,其实,锯齿感已经非常明显了,我们再放大了看,其内部其实是这样的:,20230306135837567a78f92d543ed1693706886c0bebe4c867b1352,又或者是这样:,20230306135903c6b103245737e58896e2926d9637f41a798cac750,有意思的是,锯齿现象在 DPR 为 1 的屏幕下特别明显,而在一些高清屏(dpr > 1)的屏幕下,感受不会那么明显。,那么为啥会产生锯齿感呢?,传统网页的呈现是基于像素单位的,对于这种一种颜色直接过渡另外一种颜色状态的图片,容易导致可视质量下降(信息失真)。因而对于普通的渐变元素,像是上述写法,产生了锯齿,这是非常常见的在使用渐变过程中的一个棘手问题。,解决失真的问题有很多。这里最简单的方式就是不要直接过渡,保留一个极小的渐变过渡空间。,上述的代码,我们可以简单改造一下:,仔细看其中的变化,我们从 50% --> 50% 的直接过渡,变化成预留了 1% 的渐变过渡空间,效果如下:,20230306135839c679b42100a8458306e5999a59652a2844c9d1719,可以看到,效果立马有了大幅提升!,当然,如果不想修改原代码,也可以通过叠加一层伪元素实现,这里给出 3 种方式的对比图:,通过伪元素叠加的意思是,在产生锯齿的地方,实现一个平滑过渡进行覆盖:,202303061358397679d6d39ccd1fb4a1b915adc1a24a96b25a25137,效果如下:,2023030613590442fef6d439a9d73d2d7449d96d7407671978e7461,划重点!此方法适用于线性渐变、径向渐变、角向渐变,是最为简单的消除 CSS 锯齿的方式。,当然,也还有其他更为高阶的锯齿消除法。,在仿生狮子[1]的这篇文章中 -- CSS 幻术 | 抗锯齿[2],还介绍了另外一种有意思的消除锯齿的方式。以下内容,部分摘录至该文章。,我们可以建立一种边缘锯齿边缘->重建锯齿边缘的锯齿消除方法。,我们需要做的,就是在锯齿处,叠加上另外一层内容,让锯齿感不那么强烈。称为像素偏移抗锯齿(Pixel-Offset Anti-Aliasing,POAA)。,在 Implementing FXAA[3] 这篇博客中,解释了 FXAA 具体是如何运作的。对于一个已经被找到的图形边缘,经过 FXAA 处理后会变成这样,见下两幅图:,2023030613584053e68f454ecdc5220020898b7a41759eaf6513313,2023030613590543121971800dcab38b4011eb5b460b6c0f0698543,我们可以轻易找到找到渐变的边缘地方,就是那些渐变的颜色改变的地方。有了边缘信息后,接着就要重建边缘。重建边缘也许可以再拆分,分为以下几个步骤:,这就是大体思路,我们并没有参与浏览器的渲染,而是通过像 FXAA 一样的后处理的方法。在已渲染的图像上做文章。,比如说,我们有这样一张图:,2023030613584099184e1540fcded5f9808499e8bd6b4c9a2253227,边缘信息如下:,20230306135841c7cab1610d1636dd30d2026797681a287b0a59350,我们要做的,就是在它的边缘处,利用渐变再生成一段渐变,通过准确叠加,消除渐变!原理图如下:,20230306135906d41719648360093951d048a098f3cbdf04d2da358,原理可行,但是实操起来非常之复杂,计算量会比较大。感兴趣的可以拿这段代码尝试一下:,简单总结一下,本文介绍了几种 CSS 中可行的消除渐变锯齿的方法。,好了,本文到此结束,希望本文对你有所帮助 :),[1]仿生狮子: https://juejin.cn/user/289926800227694​。,[2]CSS 幻术 | 抗锯齿: https://juejin.cn/post/6844904180776173581​。,[3]Implementing FXAA: https://link.juejin.cn/?target=http%3A%2F%2Fblog.simonrodriguez.fr%2Farticles%2F30-07-2016_implementing_fxaa.html​。

© 版权声明

相关文章