rem
是基於 html
元素的字體大小來決定,而 em
則根據使用它的元素的大小決定,通常被稱爲相對長度單位,是根據它父元素的字體大小來計算的,通常默認狀況下:16px = 1em
css
若是父元素font-size:16px
,子元素margin:0.8em
。那麼獲得的大小就是:0.8 * 16 =12.8
。html
當全部單位都採用em
時,咱們只須要改變body
的font-size
,那麼其餘子元素寬度就能動態變化了,顯然方便不少vue
em
和 rem
單位之間的區別是瀏覽器根據誰來轉化成 px
值css3
rem
是css3
新增的一個相對長度單位,它的出現是爲了解決em
的缺點,em
能夠說是相對於父級元素的字體大小,當父級元素字體大小改變時,又得從新計算。git
rem出現就能夠解決這樣的問題,rem
只相對於根目錄,即HTML元素
。有了rem
這個單位,咱們只須要調整根元素html
的font-size
就能達到全部元素的動態適配了github
(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
使用可參考手淘適配佈局