谈谈rem

用rem已久但是对于它的理解似乎一直都有偏差,使用的时候多采用的是html的font-size:62.5%;然后按照1rem=10px这样来使用。所以我一直不明白,这个rem到底哪里是相对单位了,也不明白它跟px的不同点又在哪里。迷惑了好久,然后就在今天,我翻到了一篇博客才知道自己用的多么肤浅。好吧,不再废话了,我们先来看看,rem到底是什么

rem是什么?

rem(font size of the root element)是指相对于根元素的字体大小的单位。简单的说它就是一个相对单位。看到rem大家一定会想起em单位,em(font size of the element)是指相对于父元素的字体大小的单位。它们之间其实很相似,只不过一个计算的规则是依赖根元素一个是依赖父元素计算。

我们不禁要问一下,这个根元素指的是什么呢?问得好,根元素指的是html。回想我之前喜欢把html的font-size设置成62.5%,是用浏览器的默认字号16px*62.5%=10;然后页面中的元素按照1rem=10px来计算,但其实我们可以直接给html的font-size一个定值,为了计算方便我们首选肯定是10px,但这样是不好的。因为chrome不支持中文字体小于12px,所以会导致当计算小于12px的时候,会默认取12px去计算,导致中文版chrome的rem计算不准确。所以我们可以取个20px之流。

rem有什么好?

笨!都告诉你了,rem是相对于根元素字体的大小,那么当根元素的字体大小适应不同的移动端发生改变,元素的大小是不是也都跟着变?答案当然是肯定的啊!

那么我们应该怎么变?以及为什么要变?

首先我们来回答为什么要变的问题

目前的布局方式也就是我之前很喜欢的一种布局方式是:流式布局即通过百分比来定义宽度,但是高度歇斯,所以这样的话在比较大或者比较小的屏幕中会出现按钮太矮或者太低的情况。在我看来,其实也还好,毕竟是自己写的。。。不过我确实没怎么考虑过视觉设计师的想法就对了。。。

还有一些方法宽度写死之类我没有试过,感觉上也不是很好的实现方式

嗯,所以我认为流式布局+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

posted @ 2015-10-27 17:53  魔王小瑾  阅读(413)  评论(0编辑  收藏  举报