浏览器小于1px渲染的差异

探讨了在非Retina屏幕下,如何使用CSS技巧实现小于1px的边框效果,包括使用border、图片模拟、scale和box-shadow等方法。通过实验对比不同属性的影响,揭示浏览器渲染亚像素边框的机制。

前言

穷,太多东西没法测,有错误的地方可以来喷哦~~~

在非retina屏下,如果设计让我们弄个.5px的边框啥的其实很麻烦,貌似只有safari(ios8+)支持使用border: .5px;,所以我们有了如下四种方法:

  1. border: < 1px:听天由命,通常会被美工锤死
  2. 图片模拟:同上
  3. scale(本文要说的)
  4. box-shadow,我更喜欢这个,其实原理和scale一样还不占位置,还不知道为什么不用但是网上没什么人说用这个模拟,maybe是兼容性问题?

好了进入正题,就是同事说用border模拟.5px比height更细,我当时觉得这不可能啊,结果看上去真的细了,那么作为一个刚听完匠心的人,一定要试试!

测试案例

分类杂乱看看就好,下面分类分析


// 单个通用属性
div {
    width: 200px;
    transform: scaleY(.5);
    height: 1px;
    border-width: 1px
}
复制代码

分析

第一组(左一)

属性第一个第二个第三个第四个
background-colorgreenblackblacknone
border-colorblackgreennoneblack

对比上面发现:

  1. 1,2 组:border-color受到background-color颜色的影响
  2. 4组证明了为什么border比background看起来更细(受到背景色的影响)
  3. 2,3 组:background-color受到border-color颜色的影响

结论: 浏览器在小于1px时,会让颜色变淡形成视觉上的缩小,border-color和bakcground-color互相影响,颜色相互接近,具体计算我不知道T_T,但是由2,3,4组可推测bakcground-color对border-color的影响大于border-color对background-color的影响

第二组(左二)

背景色替换成绿色,发现和第一组比所有都偏绿,所以我倾向于渲染小于1px像素的像素点颜色时浏览器会根据XXXX算法,根据周边颜色计算出一个视觉上更小的颜色。

第三组 (左三)

调整scale大小,对比第一组颜色变淡,说明有关

结论

浏览器渲染小于1px像素时,会更具你设置的大小和像素点周边颜色去动态计算视觉上小于1px的颜色,并且background-color的计算权重大于border-color

下面都是写别的测试

剩下的两组

style第一个第二个第三个第四个
height1.4px1.8px1.7px1.9px

我以前写过浏览器对于小数渲染采用四舍五入的方式,上一个元素舍去的部分会和下一个元素相加,这句话不全对第四组第一个明明就是1.4px为什么入了呢?我一直调整到1.15px才会渲染1px,其实这个和css匹配顺序一样从后往前,从下往上计算:

  1. 第四个: 1.9px + 0.1px (-0.1)
  2. 第三个: 1.7px - 0.1px = 1.6px + 0.4px (-0.4)
  3. 第二个: 1.8px - 0.4px = 1.4px -0.4px(+0.4)
  4. 第一个: 1.4px + 0.4px = 1.8px => 2px

第四组结论

  1. 浏览器对于小数渲染采用四舍五入,精度为小数点后两位(maybe)
  2. 上一个元素舍去的部分会和下一个元素相加
  3. 顺序同css匹配(从后往前,从下往上)

第五组结论

计算以border-box高度为基准

对于shadow

box-shadow: 0 0 .5px 0 black;

很神奇,这个颜色非常淡,甚至接近第三组第四个..........

挠破头都想不明白为什么是这么计算的....臣妾真的不知道,但是可以推测的是阴影需要有一个扩散的过程所以颜色会慢慢变淡,所以可能在计算时颜色更丹

结论

做浏览器真的厉害,然后这个结果只是在我电脑上的,应该都是大同小异,当然如果时ratine屏...

(`・ω・´) 当我没写,我猜测dpr高的话对于这个效果就会好很多,但是如果高度小于1px / dpr 无法完整渲染时像素点的颜色应该还是如上情况一致

咳咳....其实我只是太奇怪border模拟为什么比height模拟更细而已

有什么想说的请留言

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值