用rem已久可是对于它的理解彷佛一直都有误差,使用的时候多采用的是html的font-size:62.5%;而后按照1rem=10px这样来使用。因此我一直不明白,这个rem到底哪里是相对单位了,也不明白它跟px的不一样点又在哪里。迷惑了很久,而后就在今天,我翻到了一篇博客才知道本身用的多么肤浅。好吧,再也不废话了,咱们先来看看,rem究竟是什么javascript
rem是什么?html
rem(font size of the root element)是指相对于根元素的字体大小的单位。简单的说它就是一个相对单位。看到rem你们必定会想起em单位,em(font size of the element)是指相对于父元素的字体大小的单位。它们之间其实很类似,只不过一个计算的规则是依赖根元素一个是依赖父元素计算。java
咱们不由要问一下,这个根元素指的是什么呢?问得好,根元素指的是html。回想我以前喜欢把html的font-size设置成62.5%,是用浏览器的默认字号16px*62.5%=10;而后页面中的元素按照1rem=10px来计算,但其实咱们能够直接给html的font-size一个定值,为了计算方便咱们首选确定是10px,但这样是很差的。由于chrome不支持中文字体小于12px,因此会致使当计算小于12px的时候,会默认取12px去计算,致使中文版chrome的rem计算不许确。因此咱们能够取个20px之流。web
rem有什么好?chrome
笨!都告诉你了,rem是相对于根元素字体的大小,那么当根元素的字体大小适应不一样的移动端发生改变,元素的大小是否是也都跟着变?答案固然是确定的啊!浏览器
那么咱们应该怎么变?以及为何要变?app
首先咱们来回答为何要变的问题布局
目前的布局方式也就是我以前很喜欢的一种布局方式是:流式布局即经过百分比来定义宽度,可是高度歇斯,因此这样的话在比较大或者比较小的屏幕中会出现按钮过矮或者过低的状况。在我看来,其实也还好,毕竟是本身写的。。。不过我确实没怎么考虑过视觉设计师的想法就对了。。。字体
还有一些方法宽度写死之类我没有试过,感受上也不是很好的实现方式设计
嗯,因此我认为流式布局+rem是个不错的实现方式
如何使用rem
如何使用的精髓其实在如何动态修改html的font-size,下面献上一段代码
(function (doc, win) { var docEl = doc.documentElement, resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize', recalc = function () { var clientWidth = docEl.clientWidth; if (!clientWidth) return; docEl.style.fontSize = 20 * (clientWidth / 320) + 'px'; }; if (!doc.addEventListener) return; win.addEventListener(resizeEvt, recalc, false); doc.addEventListener('DOMContentLoaded', recalc, false); })(document, window);
这段代码里决定性的部分在于 20 * (clientWidth/320),20就是你设定的html的font-size,而320则是你切图时的参考页面宽度
还有一种动态修改页面html的font-size的方法就是media-query了,可是我始终不喜欢media-query,屏幕设备辣么多,难道你每一个都要写?就算你如今每一个都写了,出了新的屏幕设备你是否是还得更新维护代码?这是治标不治本的典范。
兼容性?
我就知道下一步大家就要问这个了,话很少说,上图。
放心了吧~
嗯,就写这么多,而后附上原博客地址 http://isux.tencent.com/web-app-rem.html