移動 web 1px 邊框解決方案

綾丶宇發表於2019-03-04

在移動端web頁面開發中,為了使css中使用的尺寸與設計稿一致,通常會採用 rem 單位配合 lib-flexible 來實現移動端的適配,在IOS裝置上 flexible.js 會根據裝置的解析度動態的調整 viewportwidthscale 來達到目的。

但是,現在很多的安卓手機也是高解析度的螢幕,有些1px邊框的按鈕和列表會顯得特別粗,flexible.js 只處理了IOS的手機,所以安卓手機需要我們自己處理。

JS處理

首先,可以通過 window.devicePixelRatio 拿到裝置的畫素比,然後給 html 標籤加上的相應的樣式。

function retina () { // 高解析度螢幕處理
    if (navigator.userAgent.toUpperCase().indexOf(`IPHONE OS`) !== -1) return; // IOS會縮放,不處理
    var classNames = [];
    var pixelRatio = window.devicePixelRatio || 1;
    classNames.push(`pixel-ratio-` + Math.floor(pixelRatio));
    if (pixelRatio >= 2) {
        classNames.push(`retina`);
    }

    var html = document.getElementsByTagName(`html`)[0];

    classNames.forEach(function (className) {
        html.classList.add(className);
    });
}複製程式碼

這樣一來我們可以通過, html.pixel-ratio-2 給不同解析度的螢幕加上特殊的樣式處理。

單個邊的1px方案

由於andorid不能設定0.5px畫素的邊框,所以需要通過偽元素來模擬邊框,先使偽元素的高度為1px,然後使用transform: scale(.5)縮小相應的大小即可。具體實現程式碼如下:

.item {
    position: relative;
    &:before{
        content: ``;
        position: absolute;
        left: 0;
        top: 0;
        bottom: auto;
        right: auto;
        width: 1px;
        height: 100%;
        background-color: @color;
        display: block;
        z-index: 1;
        html.pixel-ratio-2 & {
          .transform(scaleX(0.5));
        }
        html.pixel-ratio-3 & {
          .transform(scaleX(0.33));
        }
    }
}複製程式碼

然後不同方向的邊框,只需要跳轉偽元素的位置和縮放位置即可。該實現方案來自Framework7

邊框按鈕的1px方案

除了當個方向的邊框外,還有一種全邊框的按鈕,如果不做處理會顯得特別粗,但是偽元素只有 beforeafter 顯然剛才的單邊的方案不能用,所以只能採用其他方案。

當然還是利用偽元素畫邊框然後通過縮小,達到邊框變細的目的。首先我們使用偽元素畫四條邊,在將寬高調整到200%,最後再縮小50%,由於邊框是1px不會因寬高的改變而改變,所以我們縮小時邊框也會跟著變細。

.block-line {
    position: relative;
    border: 1px solid #000;  // 正常情況下
    html.pixel-ratio-2 & {
        border-color: rgba(0, 0, 0, 0);
        &:before {
            content: "";
            width: 200%;
            height: 200%;
            position: absolute;
            top: 0;
            left: 0;
            border: 1px solid #000;
            transform: scale(0.5);
            transform-origin: 0 0;
            padding: 1px;
            box-sizing: border-box;
            pointer-events: none;
        }
    }

    html.pixel-ratio-3 & {
        border-color: rgba(0, 0, 0, 0);
        &:before {
            content: "";
            width: 300%;
            height: 300%;
            position: absolute;
            top: 0;
            left: 0;
            border: 1px solid #000;
            transform: scale(0.33);
            transform-origin: 0 0;
            padding: 1px;
            box-sizing: border-box;
            pointer-events: none;
        }
    }
}複製程式碼

此解決方案來自Frozen UI

相關文章

相關文章