美文网首页
移动端初涉rem

移动端初涉rem

作者: DHFE | 来源:发表于2019-02-09 00:15 被阅读4次

先看定义。

rem(font size of the root element),意为根据网页的根元素来设置字体大小,和em(font size of the element)的区别是,em是根据其父元素的字体大小来设置,而rem是根据网页的根元素html来设置字体大小的。

em由于参考的是父元素字体大小,所以用em做弹性布局时,一旦某个节点的字体大小变化,那么后代元素都需要重新计算。

ren取值分为两种情况:

// 作用于根元素,相对于原始大小(16px),所以html的font-size为32px
html {font-size: 2rem}

// 作用于非根元素,相对于根元素字体大小,所以为64px
p {font-size: 2rem}

rem适配

    <style>
        .con {
            width: 10rem;
            height: 10rem;
            background-color: red;
        }
    </style>

    <div class="con"></div>

在上面这段代码中,宽度和高度都使用rem为单位,那么在浏览器中是什么样子?

可以看到是一个160 x 160的矩形,因为html根元素的默认font-size就是16px。

16px是W3C默认的,在浏览器中也可调整。Chrome中,如果将字号缩小,那么渲染的图形也会变小。

接着上例,可以修改html元素的font-size

    <style>
        html {
            font-size: 20px;
        }
        .con {
            width: 10rem;
            height: 10rem;
            background-color: red;
        }
    </style>

    <div class="con"></div>

html的font-size调整为20px,20/16=1.251.25*160就知道子元素应该扩大多少了。

由此,给html设定不同的值,从而达到我们css样式中的适配效果。

动态的rem

通过JS动态获取浏览器窗口宽度,并将html的font-size设置为当前窗口宽度,这样,就可以用当前窗口宽度的百分比来表示子节点宽度了。

    <script>
        var pageWidth = document.documentElement.clientWidth;
        var styleContent = 'html {font-size:' + pageWidth + 'px;}'        

        var style = document.createElement("style");
        style.innerHTML = styleContent;
        document.head.appendChild(style);
    </script>

窗口宽度为700px,即document.documentElement.clientWidth的值为700px,这个值将被JS获取到并写入到html元素的font-size中,构成根元素的1rem = 700px。之后,html下的所有子节点都可以用1rem的分数来表示了。
.half需要50%的width,即width: 0.5rem,即最后渲染尺寸宽度为350px。
.full为100%宽度,width: 1rem和html根元素相同。

当然,用1rem来表示还是会不方便(0.5、0.05、0.001等等),比如可以将窗口宽度/16,以800px窗口宽度为例,var styleContent = 'html {font-size:' + pageWidth/16 + 'px;}',如此,1rem = 50px(800/16)


如上,窗口宽度800px,1rem=50px。这样设置,不管在什么窗口宽度下,两个DIV占窗口宽度永远是50%。
移动web适配利器-rem
Rem布局的原理解析
rem是如何实现自适应布局的?
移动前端自适应适配布局解决方案和比较
从网易与淘宝的font-size思考前端设计稿与工作流
简单粗暴的移动端适配方案 - REM

相关文章

网友评论

      本文标题:移动端初涉rem

      本文链接:https://www.haomeiwen.com/subject/ptvgsqtx.html