H5移動端適配方案-rem


為什么移動端要適配: 由於移動設備的尺寸不一,所以移動端的頁面要能夠適應不同尺寸的設備,即頁面的自適應,讓頁面在視覺上保持一致。

rem:rem 是css3的一種相對單位,參考是根元素HMTL的font-size的值,即html的font-size:10px;那么 1rem = 10px;
先看下面的rem書寫示例

<!DOCTYPE html>
<html lang="en" style='font-size: 10px;'>
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    #box {
      width: 10rem;
      height: 10rem;
      background: red;
    }
  </style>
</head>
<body>
  <div id="box"></div>
</body>
</html>

元素box的大小是多少px呢?根據公式算,1rem = html 的 font-size 的值,那么 10rem = 10 * (html font-size的值) = 10 * 10 = 100px;所以box大小是100px * 100px;

image

知道了rem 怎么用了,那到底移動端是怎么適配的呢?我們知道用了rem作為單位,元素的大小就會根據根元素font-size的值進行計算,如果我們監聽窗口的大小去動態的設置根元素的font-size,不就能適應不同尺寸的設備了嘛,來看看下面的一段js
  (function (doc, win, undefined) {
    var docEl = doc.documentElement,
      resizeEvt = 'orientationchange' in win ? 'orientationchange' : 'resize', 
      recalc = function () {
        var clientWidth = docEl.clientWidth;
        if (clientWidth === undefined) return;
        docEl.style.fontSize = 10 * (clientWidth / 750) + 'px'; // 設置 根元素html的font-size
      };
    if (doc.addEventListener === undefined) return;
    win.addEventListener(resizeEvt, recalc, false);// 監聽窗口改變
    doc.addEventListener('DOMContentLoaded', recalc, false) // 初始HTML加載和解析完成時
  })(document, window);

這段代碼什么意思呢?就是頁面初始化的時候和窗口改變的時候,根據當時窗口的大小動態設置根元素html的font-size值,再配合使用相對單位rem,來達到自適應的效果。

最為核心的是這句代碼
 docEl.style.fontSize = 10 * (clientWidth / 750) + 'px'; // 設置 根元素html的font-size
 // docEl => 是 元素html
 // clientWidth => 是當前窗口的寬度
 // 750 => 是 設計稿的寬度

假如我們的開發環境的窗口和設計稿一樣也是750,那個當前根元素的font-size值就是10px;此時,我們量得一個元素的寬設計稿是750px,那么我們就要寫成 75rem;這樣通過換算 (75rem * 10px) 就會得到正確的 750px;簡單點就是 我們量的設計稿元素的寬 除以 根元素的font-size值,就是我們要寫成的rem的值,仔細想想是不是這樣的

基於我們上面的假設,如果此時窗口變成了375px,根元素font-size 就變成了 5px,我們響應設置的 75rem 實際上會渲染成 75rem* 5px = 375px;頁面也會保持同時縮放,印證了我們動態設置的沒有問題,保證了頁面的一致性


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM