前端學習筆記—移動端web開發

一、移動端視口

  • 視口(viewport):就是瀏覽器顯示頁面內容的屏幕區域。視口可以分為布局視口、視覺視
    口和理想視口。我們要最終使用的是理想視口。
  • 一般移動設備的瀏覽器都默認設置了一個布局視口,用于解決早期的 PC 端頁面在手機上顯示的問題。
  • iOS, Android 基本都將這個視口分辨率設置為 980px,所以 PC 上的網頁大多都能在手機上呈現,只不過元素看上去很小,一般默認可以通過手動縮放網頁。
  • 現在市場常見的移動端web頁面通常有兩種,單獨制作移動端頁面響應式頁面兩種方案。主流還是PC和移動端各自單獨制作一套頁面。
    image.png

    image.png
    <meta name="viewport" content="width=device-width,initial-scale=1.0, maximum-scale=1.0,minimum-scale=1.0, user-scalable=no" />
image.png

二、響應式布局ui,非主流,一般按公司需要開發

響應式網站:即pc和移動端共用一套網站,只不過在不同寬度的屏幕下,樣式會自動適配。配合媒體查詢監聽,通過判斷屏幕寬度來改變樣式,以適應不同終端。例如:三星電子官網: www.samsung.com/cn/
缺點:制作麻煩,需要花很大精力去調兼容性問題

image.png

image.png

  • 設置根布局的font-Size ,優點是可以根據設計稿尺寸寬度合理設置DESIGN_WIDTH進行比較完美的適配
; (function (doc, win) {
    if (doc==null||!doc.addEventListener) {
        return;
    }
    // 適配rem的js代碼函數,適用于移動web開發界面比例適配
    var supportsOrientationChange = "onorientationchange" in win ? "orientationchange" : "resize";
    var timeoutId;
    function setRem() {
        //設備寬度限制常量,用于適配最大寬度
        const MAX_CLIENT_WIDTH = 750;

        //設計稿的寬度為375px,不同設計稿修改這個值
        const DESIGN_WIDTH = 375;

        //也可以乘以其他值如50,但是為了好計算,一般設置為10或100,這樣,
        //我們只需要把設計稿寬度如 width=50px,除以10或100,改為5rem或0.5rem就好了。
        const UI_REM = 100;

        //獲取并調整設備寬度
        var clWidth = doc.documentElement.clientWidth;
        if (clWidth > MAX_CLIENT_WIDTH) {
            doc.documentElement.style.fontSize = "100px";
        } else {
            clWidth = clWidth >= MAX_CLIENT_WIDTH ? MAX_CLIENT_WIDTH : clWidth;

            console.log("clientWidth=" + clWidth);

            //最后設置html的 font-size= 移動設備 / 設計稿寬度 * 100  = 100px,那么 1rem = 100px
            const fontPX = (clWidth / DESIGN_WIDTH) * UI_REM;
            doc.documentElement.style.fontSize = fontPX + "px";
        }
    }
    console.log("初始化設置rem," + supportsOrientationChange);
    setRem();//設置rem

    //supportsOrientationChange 變量用于判斷瀏覽器是否支持 orientationchange 事件,如果支持,
    //則使用該事件進行窗口大小的監聽,否則使用 resize 事件
    win.addEventListener(supportsOrientationChange, function () {
        try {
            console.log("監聽到變化");
            // 防抖延遲時間,節流函數,防止頁面頻繁刷新
            clearTimeout(timeoutId);
            timeoutId = setTimeout(() => {
                setRem();
            }, 300)
        } catch (error) {
            console.log(error)
        }
    }, false)
}(document, window))
(function flexible (window, document) {
  var docEl = document.documentElement
  var dpr = window.devicePixelRatio || 1

  // adjust body font size
  function setBodyFontSize () {
    if (document.body) {
      document.body.style.fontSize = (12 * dpr) + 'px'
    }
    else {
      document.addEventListener('DOMContentLoaded', setBodyFontSize)
    }
  }
  setBodyFontSize();

  // set 1rem = viewWidth / 10
  function setRemUnit () {
    var rem = docEl.clientWidth / 10
    docEl.style.fontSize = rem + 'px'
  }

  setRemUnit()

  // reset rem unit on page resize
  window.addEventListener('resize', setRemUnit)
  window.addEventListener('pageshow', function (e) {
    if (e.persisted) {
      setRemUnit()
    }
  })

  // detect 0.5px supports
  if (dpr >= 2) {
    var fakeBody = document.createElement('body')
    var testElement = document.createElement('div')
    testElement.style.border = '.5px solid transparent'
    fakeBody.appendChild(testElement)
    docEl.appendChild(fakeBody)
    if (testElement.offsetHeight === 1) {
      docEl.classList.add('hairlines')
    }
    docEl.removeChild(fakeBody)
  }
}(window, document))
pc.png

平板.png

手機.png

三、適配

  • 1.設置meta標簽配置
  • 2.CSS初始化
  • 3.設置根布局的font-Size,使用rem單位
  • 4.頁面上的單位盡量用rem和百分比


    image.png

    image.png

    image.png

個人H5開源項目:WanAndroidWeb
https://gitee.com/muxibobo/WanAndroidWeb
https://github.com/muxibobo/WanAndroidWeb

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容