起因
- 設計師給出設計稿上明明是1px的邊框在移動端retina屏上顯示很粗(2倍屏上顯示為2px,3倍屏上顯示為3px)
- 裝置像素比
注意
- 安卓不支援小于1的像素,是以通過設定border-width=0.5px不适用安卓
解決
- 通過高度為1px的div,再通過scaleY縮小可以實作(不能做圓角,而且做4條邊很麻煩,排除)
.border-line { height: px; -webkit-transform: scale(.); transform: scaleY(.); background: blue; overflow: hidden; }
- 通過僞元素寬、高放大後,再通過scale縮小可以實作(可以做圓角,代碼量過大,可以配合scss減少代碼量,但是在3倍屏下縮放後寬度不太精确,比如縮放0.33會顯小,縮放0.333會顯長,排除)
@media (-webkit-min-device-pixel-ratio: ) { .border-line:after { content: ''; display: block; position: absolute; top: ; left: ; width: %; height: %; border: px solid blue; } } @media (-webkit-min-device-pixel-ratio: ) { .border-line:after { content: ''; display: block; position: absolute; top: ; left: ; width: %; height: %; border: px solid blue; -webkit-transform: scale(.); transform: scale(.); -webkit-transform-origin: ; transform-origin: ; } } @media (-webkit-min-device-pixel-ratio: ) { .border-line:after { content: ''; display: block; position: absolute; top: ; left: ; width: %; height: %; border: px solid blue; -webkit-transform: scale(.); transform: scale(.); -webkit-transform-origin: ; transform-origin: ; } }
- 使用Flexible實作手淘H5頁面的終端适配
- 方案1
- 如果不在head裡寫
<meta name="viewport" content="initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no">
- flexible.js會自動在head裡建立一個meta标簽,具體的縮放比根據Retina螢幕裝置像素比而不同,可能為1、0.5或0.3333333333333333,如下圖:
移動端Retina螢幕1px邊框問題 - 這樣能解決手機端1px問題,但是帶來了一個新問題,就是你的項目用到的所有插件都要能适應這種規範。舉個例子,你項目中用到了layer.js,那就gg了,因為這個插件顯示的彈層尺寸在Retina螢幕上面會被相應的縮小
- 如果不在head裡寫
- 方案2
- 如果在head裡寫
<meta name="viewport" content="initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no">
- flexible.js就不會自動建立meta标簽了,縮放比固定為1
- 這樣無法解決1px邊框問題,但也是基于rem的一套手機端适配方案
- 如果在head裡寫
- 方案3
- 方案2提供了基于rem的手機端适配方案,在此基礎上我們隻要解決Retina螢幕1px問題就行了
- 了解ios可以識别小于1的像素,而安卓不能,是以我們放棄對安卓端的1px問題的解決,隻考慮ios端
/* ios端2倍屏下寬度設為.5px */ @media (-webkit-min-device-pixel-ratio: ) { .ios .g-border { border-width: .px !important; } } /* ios端3倍屏下寬度設為.4px */ @media (-webkit-min-device-pixel-ratio: ) { .ios .g-border { border-width: .px !important; } }
- 方案1
效果
- ios(可以看到ios可以識别小于1的像素)
移動端Retina螢幕1px邊框問題 - 安卓(可以看到安卓無法識别小于1的像素)
移動端Retina螢幕1px邊框問題
參考
- 7種方法解決移動端Retina螢幕1px邊框問題
- 移動端1px的邊框