1. 程式人生 > >移動端前端適配方案20170707

移動端前端適配方案20170707

and rect() keyword 不同 響應 屏幕 win rect class

1.Meida Queries

meida queries 的方式可以說是我早期采用的布局方式,它主要是通過查詢設備的寬度來執行不同的 css 代碼,最終達到界面的配置。核心語法是:

@media screen and (max-width: 600px) { /*當屏幕尺寸小於600px時,應用下面的CSS樣式*/
  /*你的css代碼*/
}

優點

  • media query可以做到設備像素比的判斷,方法簡單,成本低,特別是對移動和PC維護同一套代碼的時候。目前像Bootstrap等框架使用這種方式布局
  • 圖片便於修改,只需修改css文件
  • 調整屏幕寬度的時候不用刷新頁面即可響應式展示

缺點

  • 代碼量比較大,維護不方便
  • 為了兼顧大屏幕或高清設備,會造成其他設備資源浪費,特別是加載圖片資源
  • 為了兼顧移動端和PC端各自響應式的展示效果,難免會損失各自特有的交互方式


彈性布局

它的viewport是固定的:<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no">

根據rem將頁面放大dpr倍, 然後viewport設置為1/dpr.

  • 如iphone6 plus的dpr為3, 則頁面整體放大3倍, 1px(css單位)在plus下默認為3px(物理像素)
  • 然後viewport設置為1/3, 這樣頁面整體縮回原始大小. 從而實現高清。

這樣整個網頁在設備內顯示時的頁面寬度就會等於設備邏輯像素大小,也就是device-width。這個device-width的計算公式為:

設備的物理分辨率/(devicePixelRatio * scale),在scale為1的情況下,device-width = 設備的物理分辨率/devicePixelRatio

通過以下代碼來控制rem基準值(設計稿以720px寬度量取實際尺寸)

!function (d) {
    var c = d.document;
    var a = c.documentElement;
    var b = d.devicePixelRatio;
    var f;

    function e() {
      var h = a.getBoundingClientRect().width, g;
      if (b === 1) {
        h = 720
      }
      if(h>720) h = 720;//設置基準值的極限值
      g                = h / 7.2;
      a.style.fontSize = g + "px"
    }

    if (b > 2) {
      b = 3
    } else {
      if (b > 1) {
        b = 2
      } else {
        b = 1
      }
    }
    a.setAttribute("data-dpr", b);
    d.addEventListener("resize", function () {
      clearTimeout(f);
      f = setTimeout(e, 200)
    }, false);
    e()
  }(window);

移動端前端適配方案20170707