天天看點

移動端适配方案小結

雲栖号資訊:【 點選檢視更多行業資訊

在這裡您可以找到不同行業的第一手的上雲資訊,還在等什麼,快來!

流式布局

流式布局是一套典型的彈性布局,它的關鍵特點是:頁面中的關鍵(布局)元素的寬高和位置都不會變化,隻有容器元素在做拉伸變化,簡單來說就是寬度的拉伸,快級盒子預設就能适應容器的寬度。這種布局對于頁面簡單的web app是足夠了,比如拉鈎的頁面:

移動端适配方案小結
移動端适配方案小結

從上面的圖檔我們可以看到:

  • 頂部與底部的bar不管分辨率怎麼變,它的高度和位置都不變
  • 中間每條招聘資訊不管分辨率怎麼變,招聘公司的圖示等資訊都位于條目的左邊,薪資都位于右邊,且高度也沒有變化。

是以,對于這類簡單的web app頁面,我們如果要使用流式布局的話,隻需要記住一個開發原則就可以了:文字流式、控件彈性,圖檔有需要等比縮放。 這種布局适配螢幕尺寸大于設計稿的裝置是沒有問題的,但是如果對于螢幕分辨率小于設計稿的裝置,那麼容器盒子裡的内容可能放不小,需要媒體查詢單獨适配下。

rem布局

rem布局,開發過web app頁面的童鞋,應該都很熟悉了。當分辨率變化的時候,我們通過js來改變html的font-size,然後我們就可以使用rem代替px了。

我們可以看到淘寶的頁面在不同的螢幕下,頁面有明顯的等比變化。

移動端适配方案小結
移動端适配方案小結

直接上操作:

  • 先拿設計稿豎着的橫向分辨率除以100(這個基數是為了計算友善而自己設定的,或者postcss-plugin-px2rem自動轉換)得到body元素的寬度
  • 盒子高度為210px,寫樣式的時候css應該這麼寫:height: 2.1rem
  • 在header标簽中加入,下面代碼
var deviceWidth = document.documentElement.clientWidth
// 大于設計稿的橫向分辨率時,始終按設計稿的寬來
if(deviceWidth > 750) deviceWidth = 750;

document.documentElement.style.fontSize = deviceWidth / 7.5 + 'px';           

這裡寫這麼多,其實有個更好的方案,那就是

font-size: 100vw / 750 * 100;
}           

某些情況font-size不能使用rem,需要額外的媒介查詢單獨設定

.m-navlist{font-size:15px}
}

@media screen and (min-width:321px) and (max-width:400px){
    .m-navlist{font-size:16px}
}

@media screen and (min-width:400px){
    .m-navlist{font-size:18px}
}           

flexible

flexible實作web app布局的前提是viewport的scale根據devicePixelRatio動态設定:

  • devicePixelRatio為2的時候,scale為0.5
  • devicePixelRatio為3的時候,scale為0.33333

這樣設好了之後,頁面的大小和設計稿上保持一緻了,以設計稿為750為例,iphone6的devicePixelRatio為2,是以此時它的布局視口就是750px,我們就可以設定一個基數把頁面尺寸轉成rem了

var scale = 1 / window.devicePixelRatio;
document.querySelector('meta[name="viewport"]').setAttribute('content','initial-scale='+scale+',maximum-scale='+scale+',minimum-scale='+scale+',user-scalable=no')

// 動态計算html的font-size
var baseFontSize = document.documentElement.clientWidth / 10;
document.documentElement.style.fontSize =  baseFontSize + 'px'
// 這樣設定後,布局的時候css 的rem計算公式: css尺寸=設計稿标注尺寸/baseFontSize           

less 函數轉換rem

.px2rem(@name,@px) {
  @{name}: @px / @baseFontSize * 1rem
}           

scale的處理

var isAndroid = win.navigator.appVersion.match(/android/gi);
    var isIPhone = win.navigator.appVersion.match(/iphone/gi);
    var devicePixelRatio = win.devicePixelRatio;
    if (isIPhone) {
        // iOS下,對于2和3的屏,用2倍的方案,其餘的用1倍方案
        if (devicePixelRatio >= 3 && (!dpr || dpr >= 3)) {                
            dpr = 3;
        } else if (devicePixelRatio >= 2 && (!dpr || dpr >= 2)){
            dpr = 2;
        } else {
            dpr = 1;
        }
    } else {
        // 其他裝置下,仍舊使用1倍的方案
        dpr = 1;
    }
    scale = 1 / dpr;
}           

對安卓裝置預設按dpr為1處理,而ios裝置這樣設定後,可以使用布局視口的寬度等于實體的分辨率,這意味着布局視口中的像素機關是和實體像素一一對應的,解決了 1px border 問題和高清圖檔的問題。另外淘寶的方案将 body 的 width 設為 100% 并對 overflow 進行 hidden,這個 100% width 會計算為布局視口的寬,也是 10rem,那麼 body 内布局超出 10rem 的元素不會導緻布局視口出現滾動條。

字型處理

字型使用px機關,需要對不同的視口寬度(dpr)的裝置适配,flexible是将dpr 數值設定為 html 的 data-dpr 屬性,通過css選擇器選擇不同 dpr 裝置下的元素

width: 1rem; 
    height: 0.4rem;
    font-size: 12px; // 預設寫上dpr為1的fontSize
}
[data-dpr="2"] div {
    font-size: 24px;
}
[data-dpr="3"] div {
    font-size: 36px;
}           

less 簡寫方案

font-size: @fontSize
  [data-dpr="2"] & {
    font-size: @fontSize * 2;
  }

  [data-dpr="3"] & {
    font-size: @fontSize * 3;
  }
}           

【雲栖号線上課堂】每天都有産品技術專家分享!

課程位址:

https://yqh.aliyun.com/live

立即加入社群,與專家面對面,及時了解課程最新動态!

【雲栖号線上課堂 社群】

https://c.tb.cn/F3.Z8gvnK

原文釋出時間:2020-04-17

本文作者:前端小閑魚

本文來自:“

掘金

”,了解相關資訊可以關注“掘金”

繼續閱讀