天天看點

移動端Retina螢幕1px邊框問題

起因

  • 設計師給出設計稿上明明是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螢幕上面會被相應的縮小
    • 方案2
      • 如果在head裡寫

        <meta name="viewport" content="initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no">

      • flexible.js就不會自動建立meta标簽了,縮放比固定為1
      • 這樣無法解決1px邊框問題,但也是基于rem的一套手機端适配方案
    • 方案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;
            }
        }
                   

效果

  • ios(可以看到ios可以識别小于1的像素)
    移動端Retina螢幕1px邊框問題
  • 安卓(可以看到安卓無法識别小于1的像素)
    移動端Retina螢幕1px邊框問題

參考

  • 7種方法解決移動端Retina螢幕1px邊框問題
  • 移動端1px的邊框