前言
窮,太多東西沒法測,有錯誤的地方可以來噴哦~~~
在非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模擬更細而已
有什麼想說的請留言