移動(dòng)端適配方案rem(附適配封裝的js文件)

一、rem是什么

rem(font size of the root element)是指相對(duì)于根元素html的字體大小的單位。
如果html的font-size16px
那么1rem = 16px

二、應(yīng)用場景

多應(yīng)用于移動(dòng)端網(wǎng)頁的適配(不同機(jī)型不同設(shè)備寬度)

三、如何進(jìn)行rem適配

3.1、添加meta應(yīng)對(duì)移動(dòng)端適配

  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <!-- 添加meta標(biāo)簽進(jìn)行移動(dòng)端適配(讓html的寬度正好等于設(shè)備的寬度) -->
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>移動(dòng)端適配</title>
  </head>

3.2、動(dòng)態(tài)獲取當(dāng)前設(shè)備寬度

<body>
    <script>
      // 定義一個(gè)函數(shù)獲取當(dāng)前設(shè)備的寬度
      function getWinSize() {
        let width = document.documentElement.clientWidth;
        console.log(width);
      }
      //進(jìn)入頁面默認(rèn)獲取一次
      getWinSize();
      //當(dāng)頁面窗口視圖改變的時(shí)候再次執(zhí)行,獲取設(shè)備寬度
      window.onresize = getWinSize;
    </script>
  </body>

3.3、根據(jù)獲取到的設(shè)備寬度,設(shè)置html的font-size為多少合適?

假設(shè)設(shè)計(jì)稿寬度是750px,我們獲取到的設(shè)備寬度為width

那么有等式1:750px = width

那么有等式2:1px = width/750

假設(shè)我們想實(shí)現(xiàn) 1rem = 100px,根據(jù)等式二,得出
1rem = 100px = 100*(width/750)

最后給html的根元素設(shè)置字體大小值就為100*(width/750)

注意

  • 這里的 1rem = 100px,好處是:
  • 只需要根據(jù)設(shè)計(jì)稿給的px直接縮小100倍,改單位為rem即可
<script>
      // 定義一個(gè)函數(shù)獲取當(dāng)前設(shè)備的寬度
      function getWinSize() {
        let width = document.documentElement.clientWidth;
        // 假設(shè)設(shè)計(jì)稿寬度為750px
        // 假設(shè)已知根元素我們設(shè)置為100px(這里設(shè)置100方便后續(xù)我們好計(jì)算)
        // 動(dòng)態(tài)設(shè)置根元素html的fontSize
        document.documentElement.style.fontSize =
          100 * (width / 750) + "px";
      }
      //進(jìn)入頁面默認(rèn)獲取一次
      getWinSize();
      //當(dāng)頁面窗口視圖改變的時(shí)候再次執(zhí)行
      window.onresize = getWinSize;
    </script>

3.4、如何使用(px到rem的轉(zhuǎn)換)

如果設(shè)計(jì)稿給我們一個(gè)盒子寬是 350px 高是 400px
那么我們只要在數(shù)值的基礎(chǔ)上縮小 100倍即可
寬是 3.5rem高是 4rem

四、優(yōu)化

當(dāng)我們做的移動(dòng)端適配以后,這個(gè)網(wǎng)頁仍然有可能在PC端打開,這時(shí)候我們就需要對(duì)body元素設(shè)置最大寬度和居中,來適配pc端

     * {
        padding: 0;
        margin: 0;
      }
      body {
        /* 750根據(jù)設(shè)計(jì)稿寬度設(shè)計(jì) */
        max-width: 750px;
        /* 居中 */
        margin: 0 auto;
      }

四、進(jìn)階

4.1、封裝一個(gè)phone.js文件,專門用于移動(dòng)端適配

代碼如下

(function (doc, win) {
  var docEL = document.documentElement,
    resizeEvt = "orientationchange" in window ? "orientationchange" : "resize",
    recalc = function () {
      // 獲取當(dāng)前設(shè)備的寬度
      var clientWidth = docEL.clientWidth;
      if (!clientWidth) return;
      if (clientWidth >= 750) {
        //寬度大于750,根元素字體大小不能超過100px(不能大于設(shè)計(jì)稿的最大寬度)
        docEL.style.fontSize = "100px"; //設(shè)置根元素大小
      } else {
        docEL.style.fontSize = (clientWidth / 750) * 100 + "px";
      }
    };
  if (!doc.addEventListener) return;
  //添加窗口變動(dòng)監(jiān)聽
  win.addEventListener(resizeEvt, recalc, false);
  //dom加載的時(shí)候執(zhí)行一次
  doc.addEventListener("DOMContentLoaded", recalc, false);
})(document, window);


4.2、引入

    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <!-- 添加meta標(biāo)簽進(jìn)行移動(dòng)端適配 -->
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <script src="./phone.js"></script>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容