1. 程式人生 > 其它 >08-移動端開發教程-移動端適配方案

08-移動端開發教程-移動端適配方案

由於移動端的特殊性,螢幕的尺寸碎片化嚴重,要想很好的適配不同的尺寸的裝置,需要我們前端開發相比PC端要做一些基層的適配方案。

1. 常見的適配方案

  1. 百分比+固定高度佈局方案
    • 固定螢幕為理想視口寬度
    • 少許的媒體查詢設定字型
    • 水平百分比佈局
    • 水平方向部分也可以使用彈性佈局
  2. Rem解決方案
    • Rem的大小取值:根據頁面的dpr動態改變
    • Rem的取值: 1rem = 100px 或者 1rem = 1/10 * 理想視口的寬度
    • chrome瀏覽器字型小於12px(會被重置為12px)
  3. 固定設計稿的寬度開發+根據裝置動態適配縮放
    • 開發直接按照設計稿編寫固定尺寸元素
    • 頁面載入完成後用js動態根據dpr改變頁面的縮放值
    • 推薦使用: flexible方案

2. 百分比與固定高度佈局方案

此方案的前提是設定螢幕為理想視口,然後通過水平百分比佈局或者彈性佈局,垂直方向一般用固定畫素。

優點:佈局快速簡單方便、在移動裝置中水平表現良好差異不大。 缺點:由於垂直方向畫素恆定,可能水平很寬的螢幕會被拉伸變形嚴重,另外在高倍螢幕上1畫素可能被多倍的物理畫素顯示,會變的非常粗。

2.1 橫向百分比 + 縱向高度固定

首先看案例: 拉勾網移動端首頁頂部的logo區域,不管如何變化瀏覽器的寬度,高度不變化,寬度自適應。

參考程式碼:

htm設定meta標籤
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">

<style>
#header {
    /* 寬度預設不設定,就是100% */
    height: 45px;
    line-height: 45px;
    background-color: #00b38a;
    color: #fff;
    font-size: 1.8rem; /* 也可以根據媒體查詢適當調整字型大小 */
    text-align: center;
    position: relative;
}
</style>
<div id="header"> </div>

2.2 彈性盒子+高度固定佈局

logo下面一行的左右兩個盒子,高度不變,寬度雖然有變化,但是左右兩個盒子都基本上靠在兩側,可以用浮動實現,也可以用彈性盒子實現。

參考程式碼:

  <style>
    .container {
      height: 40px;
      display: flex;
      justify-content: space-between;
      line-height: 40px;
    }
  </style>
  <div class="container">
    <span class="info">10秒鐘定製職位</span>
    <a href="#" class="go">去登陸</a>
  </div>

某些場景下也需要固定畫素的佈局,比如:頭像一般會用固定的寬高進行排版。

3. rem佈局方式

rem是css3中新增加的長度單位,之前我們接觸過em單位,em表示1em代表1個字型的寬度。而rem是根元素字型的大小,在網頁中也就是設定的html根元素的字型大小。

html {
  font-size: 16px;
}
/* html根元素的字型大小是16px,
 * 那麼 1rem = 1* 16px  = 16px
 *      2rem = 2 * 16px = 32px 
*/

比如,如下需求:隨著裝置尺寸的變寬,元素高度和寬度都相應放大,比如下圖中彈出的拉鉤下載的app連結的層。

隨著裝置尺寸的變寬,元素高度和寬度都相應放大

可以通過設定元素的寬高直接用rem單位,然後根據不同的螢幕的寬度設定不同的html字型的大小,來實現自動適配不同螢幕的目的。

3.1 媒體查詢改變根元素的字型大小

CSS3新增加了媒體查詢功能,也就是可以根據裝置媒體的屬性做相關的判斷,然後執行不同的CSS規則。 媒體查詢細節參考。

/* 媒體查詢以@media開頭,然後後面可以跟上 判斷的條件,比如:screen表示螢幕裝置, and是並且的意思, min-width是最小寬度的意思。 */
@media screen and (min-width: 320px) {
    html {font-size: 50px;}
}
 
@media screen and (min-width: 360px) {
    html {font-size: 56.25px;}
}
 
@media screen and (min-width: 400px) {
    html {font-size: 62.5px;}
}
 
@media screen and (min-width: 440px) {
    html {font-size: 68.75px;}
}
 
@media screen and (min-width: 480px) {
    html {font-size: 75px;}
}
 
@media screen and (min-width: 640px) {
    html {font-size: 100px;}
}

以上參考程式碼的意思是: 根據CSS的媒體查詢裝置的螢幕的寬度,根據寬度的大小設定密集的html根元素的字型大小。

由於rem根據不同列舉的螢幕尺寸設定了不同的大小值,所以根據rem佈局的元素會根據螢幕自動適配。

缺點:媒體查詢不能完全列舉,畢竟android的螢幕尺寸碎片化嚴重,各種尺寸都有,不能完全覆蓋,只能大體覆蓋。如果想要精確覆蓋要麼通過js實現,要麼用最新的瀏覽器已經支援的calc實現。

以上假設設計圖是640畫素。然後在640畫素的裝置上,1rem = 100px方便計算盒子的尺寸,可以直介面算。

3.2 js實現動態改變根元素的字型大小

通過js動態獲取螢幕的寬度(document.clientWidth)然後根據螢幕寬度動態計算出rem的實際值。

假設,640px的裝置 1rem = 100px 公式: rem = document.clientWidth / 640 * 100px;

!(function(doc, win) {
    var docEle = doc.documentElement,
        evt = "onorientationchange" in window ? "orientationchange" : "resize",
        fn = function() {
            var width = docEle.clientWidth;
            width && (docEle.style.fontSize = 100 * (width / 640) + "px");
        };
     
    win.addEventListener(evt, fn, false);
    doc.addEventListener("DOMContentLoaded", fn, false);
 
}(document, window));

4. 組合佈局方式

其實以上講的兩種方式,一般都會混用,並不是用一種方案寫到頭,而是什麼情況下適合就用什麼方式。

比如:

  1. 頭像在不同裝置上一般都會設定固定畫素的大小
  2. 寬度可能超過50%的盒子儘量用百分比或者彈性盒子佈局
  3. 高度和寬度需要同時根據螢幕自動縮放的時候,推薦使用rem佈局

5. 縮放自適應佈局方式(推薦***)

簡單點說就是,開發的時候根據設計搞完全還原畫素,然後根據螢幕的寬度通過js動態改變頁面的縮放,恰好是理想視口的大小。

原理核心就是修改頁面mate標籤的縮放。

這樣優點非常多,首先開發人員直接畫素還原,開發效率很高,也沒有移動端1畫素的問題。也是老馬推薦大家使用的方式。

當然縮放佈局方式也可以跟rem等方式結合,比如淘寶的flexible方案就是利用頁面的縮放和rem模擬vw的方案,使用起來非常簡單,稍微有點不爽的就是要畫素和rem之間要進行轉換。

原理圖:

具體程式碼案例參考:https://github.com/amfe/article/issues/17

另外推薦:基於 flexible方案的 hotcss

6. 總結

目前由於瀏覽器相容等問題,還有很不錯的未來方案,比如:vw 佈局方案等。就目前工程實踐來看,還是淘寶的flexible方案最靠譜,應用也最廣泛。老馬強烈推薦。