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
使用可参考手淘适配布局