前端頁面的移動端適配

前言

移動端高度適配一般使用px單位即可。

本文著重說明如何實現(xiàn)移動端寬度的適配:方法是使用CSS3新增的一個相對單位rem來實現(xiàn)的。

rem是一個相對于HTML 根元素的長度單位,可以做到只修改根元素就成比例地調(diào)整所有尺寸大小 * 詳解

前端頁面使用rem作為尺寸單位,根據(jù)移動設(shè)備屏幕尺寸大小不同動態(tài)設(shè)置HTML根元素的font-size,這樣就能夠?qū)崿F(xiàn)頁面內(nèi)容隨著屏幕尺寸大小進行成比例的變化。

步驟

1. 選擇一款機型作為開發(fā)基準

我一般會選擇iPhone6/7/8:


2. 設(shè)置HTML 根元素的font-size

為了簡化運算,我將根元素的font-size設(shè)為100px。此時1rem = 100px,后續(xù)內(nèi)容全部使用rem作為尺寸單位。設(shè)計稿給的尺寸一般都是以px為單位,根據(jù)設(shè)計稿給的尺寸轉(zhuǎn)換成rpm即可。

html {
    font-size: 100px;
  }

3. 將手機瀏覽器布局視口設(shè)置成屏幕的寬度

<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no;">

原理詳見:移動端適配 — 細節(jié)補充(一)、移動端適配 — 細節(jié)補充(二)

4. 用JS動態(tài)設(shè)置根元素的font-size

在JS代碼中首先拿到當前設(shè)備屏幕的尺寸,然后計算當前屏幕尺寸是基準開發(fā)機型的幾倍,然后根據(jù)倍數(shù)來設(shè)置根元素的font-size的大?。?/p>

//使用IIFE(立即調(diào)用函數(shù))實現(xiàn)在js加載時對根元素的font-size賦值
(function (doc, win) {
         //1.獲取根元素
     let docEl = doc.documentElement,
         //2.判斷移動端屏幕發(fā)生變化時發(fā)生的事件(是翻轉(zhuǎn)屏幕還是只是調(diào)整了瀏覽器窗口大?。?         resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize',
         //3.獲取當前設(shè)備屏幕的尺寸,計算根元素的font-size的大小并賦值
         recalc = function () {
             let clientWidth = docEl.clientWidth;
             if (!clientWidth) return;
             docEl.style.fontSize = (clientWidth / 375)*100 + 'px';
         };
     //4.對屏幕發(fā)生變化時發(fā)生的事件進行監(jiān)聽,若發(fā)生變化就重新計算font-size
     if (!doc.addEventListener) return;
     win.addEventListener(resizeEvt, recalc, false);
     doc.addEventListener('DOMContentLoaded', recalc, false);
 })(document, window);

至此,已經(jīng)實現(xiàn)了移動端適配的效果。

Vue項目中如何使用

使用vue-cli搭建好項目框架后,在目錄結(jié)構(gòu)的index.html文件中添加上述代碼即可:

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
  <title>Vue項目移動端適配</title>

  <script> 
      (function (doc, win) {
          let docEl = doc.documentElement,
              resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize',
              recalc = function () {
                  let clientWidth = docEl.clientWidth;
                  if (!clientWidth) return;
                  docEl.style.fontSize = (clientWidth / 375) * 100 + 'px';
              };
          if (!doc.addEventListener) return;
          win.addEventListener(resizeEvt, recalc, false);
          doc.addEventListener('DOMContentLoaded', recalc, false);
      })(document, window);
  </script>

</head>
<body>
<div id="app"></div>
</body>
</html>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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