簡單聊下rem與em的區別並如何作移動端適配

說一下rem 與 em 有什麼區別

rem 是基於 html 元素的字體大小來決定,而 em 則根據使用它的元素的大小決定,通常被稱爲相對長度單位,是根據它父元素的字體大小來計算的,通常默認狀況下:16px = 1emcss

若是父元素font-size:16px,子元素margin:0.8em。那麼獲得的大小就是:0.8 * 16 =12.8html

當全部單位都採用em時,咱們只須要改變bodyfont-size,那麼其餘子元素寬度就能動態變化了,顯然方便不少vue

emrem 單位之間的區別是瀏覽器根據誰來轉化成 pxcss3

remcss3新增的一個相對長度單位,它的出現是爲了解決em的缺點,em能夠說是相對於父級元素的字體大小,當父級元素字體大小改變時,又得從新計算。git

rem出現就能夠解決這樣的問題,rem只相對於根目錄,即HTML元素。有了rem這個單位,咱們只須要調整根元素htmlfont-size就能達到全部元素的動態適配了github

移動端-以一個固定尺寸(750px)爲標準-將 px 轉化爲 rem

(function(win, lib) {
  var doc = win.document;
  var docEl = doc.documentElement;
  var devicePixelRatio = win.devicePixelRatio;
  var dpr = 1;
  var scale = 1;

  // 設置vierPort
  function setViewport() {
    dpr = 1;
    win.devicePixelRatioValue = dpr;
    scale = 1 / dpr;
    var metaEl = doc.createElement('meta');
    metaEl.setAttribute('name', 'viewport');
    metaEl.setAttribute(
      'content',
      'initial-scale=' +
        scale +
        ', maximum-scale=' +
        scale +
        ', minimum-scale=' +
        scale +
        ', user-scalable=no'
    );
    if (docEl.firstElementChild) {
      docEl.firstElementChild.appendChild(metaEl);
    } else {
      var wrap = doc.createElement('div');
      wrap.appendChild(metaEl);
      doc.write(wrap.innerHTML);
    }
  }

  setViewport();
  var newBase = 100; // 把頁面劃分爲100等分

  // 設置Rem
  function setRem() {
    var visualView = Math.min(
      docEl.getBoundingClientRect().width,
      lib.maxWidth
    );
    newBase = (100 * visualView) / lib.desinWidth;
    docEl.style.fontSize = newBase + 'px';
  }

  var tid;
  lib.desinWidth = 640;
  lib.baseFont = 18;
  lib.maxWidth = 540;
  lib.init = function() {
    win.addEventListener(
      'resize',
      function() {
        clearTimeout(tid);
        tid = setTimeout(setRem, 300);
      },
      false
    );
    win.addEventListener(
      'pageshow',
      function(e) {
        if (e.persisted) {
          clearTimeout(tid);
          tid = setTimeout(setRem, 300);
        }
      },
      false
    );
    if (doc.readyState === 'complete') {
      doc.body.style.fontSize = lib.baseFont * dpr + 'px';
    } else {
      doc.addEventListener(
        'DOMContentLoaded',
        function(e) {
          doc.body.style.fontSize = lib.baseFont * dpr + 'px';
        },
        false
      );
    }
    setRem();
    docEl.setAttribute('data-dpr', dpr);
  };
})(window, window['adaptive'] || (window['adaptive'] = {}));
window['adaptive'].desinWidth = 750;
window['adaptive'].baseFont = 12;
window['adaptive'].maxWidth = 540;
window['adaptive'].init();

以上代碼以設計稿 750px 的爲標準,若是是非 750px,在實際頁面中,將它轉化爲 750,而後再作轉化面試

100px  = 1rem;
750px = 7.5rem;

將這段js代碼命名爲一個mobile-adaption.js引入到頁面中,就能夠愉快的使用了,將px轉化爲rem,實現自適應佈局瀏覽器

在不一樣的設備當中保持一致,每一個公司對於移動端都有本身的一套標準,也有用淘寶flexible.js作適配的app

使用可參考手淘適配佈局

相關文章
相關標籤/搜索