前言
穷,太多东西没法测,有错误的地方可以来喷哦~~~
在非retina屏下,如果设计让我们弄个.5px
的边框啥的其实很麻烦,貌似只有safari
(ios8+)支持使用border: .5px;
,所以我们有了如下四种方法:
border: < 1px
:听天由命,通常会被美工锤死- 图片模拟:同上
scale
(本文要说的)box-shadow
,我更喜欢这个,其实原理和scale一样还不占位置,还不知道为什么不用但是网上没什么人说用这个模拟,maybe是兼容性问题?
好了进入正题,就是同事说用border模拟.5px比height更细,我当时觉得这不可能啊,结果看上去真的细了,那么作为一个刚听完匠心的人,一定要试试!
测试案例
分类杂乱看看就好,下面分类分析
// 单个通用属性
div {
width: 200px;
transform: scaleY(.5);
height: 1px;
border-width: 1px
}
复制代码
分析
第一组(左一)
属性 | 第一个 | 第二个 | 第三个 | 第四个 |
---|---|---|---|---|
background-color | green | black | black | none |
border-color | black | green | none | black |
对比上面发现:
- 1,2 组:border-color受到background-color颜色的影响
- 4组证明了为什么border比background看起来更细(受到背景色的影响)
- 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 | 第一个 | 第二个 | 第三个 | 第四个 |
---|---|---|---|---|
height | 1.4px | 1.8px | 1.7px | 1.9px |
我以前写过浏览器对于小数渲染采用四舍五入的方式,上一个元素舍去的部分会和下一个元素相加,这句话不全对第四组第一个明明就是1.4px为什么入了呢?我一直调整到1.15px才会渲染1px,其实这个和css匹配顺序一样从后往前,从下往上计算:
- 第四个: 1.9px + 0.1px (-0.1)
- 第三个: 1.7px - 0.1px = 1.6px + 0.4px (-0.4)
- 第二个: 1.8px - 0.4px = 1.4px -0.4px(+0.4)
- 第一个: 1.4px + 0.4px = 1.8px => 2px
第四组结论
- 浏览器对于小数渲染采用四舍五入,精度为小数点后两位(maybe)
- 上一个元素舍去的部分会和下一个元素相加
- 顺序同css匹配(从后往前,从下往上)
第五组结论
计算以border-box高度为基准
对于shadow
box-shadow: 0 0 .5px 0 black;
很神奇,这个颜色非常淡,甚至接近第三组第四个..........
挠破头都想不明白为什么是这么计算的....臣妾真的不知道,但是可以推测的是阴影需要有一个扩散的过程所以颜色会慢慢变淡,所以可能在计算时颜色更丹
结论
做浏览器真的厉害,然后这个结果只是在我电脑上的,应该都是大同小异,当然如果时ratine屏...
(`・ω・´) 当我没写,我猜测dpr高的话对于这个效果就会好很多,但是如果高度小于1px / dpr 无法完整渲染时像素点的颜色应该还是如上情况一致
咳咳....其实我只是太奇怪border模拟为什么比height模拟更细而已
有什么想说的请留言