美文网首页
Rem的深入理解

Rem的深入理解

作者: An的杂货铺 | 来源:发表于2019-09-29 00:10 被阅读0次

什么是em?

css中有两个常用的相对单位,em和rem,先有的em,css3中又引入rem,两者很容易混淆,所以在了解rem之前,需要先理清em的概念。

em作为font-size的单位时,其代表父元素的字体大小,em作为其他属性单位时,代表自身字体大小。

通过以下实例可以很清晰的解读em的内涵:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<style type="text/css">
    .p1 {font-size: 16px; line-height: 32px;}
    .s1 {font-size: 2em;}
    .s2 {font-size: 2em; line-height: 2em;}

    .p2 {font-size: 16px; line-height: 2;}
    .s5 {font-size: 2em;}
    .s6 {font-size: 2em; line-height: 2em;}
</style>
<body>
    <div class="p1">
        <div class="s1">1</div>
        <div class="s2">1</div>
    </div>
    <div class="p2">
        <div class="s5">1</div>
        <div class="s6">1</div>
    </div>
</body>
</html>

在上面的实例中,在页面最终的结果
s1:font-size:32px,line-height:32px;
s2:font-size:32px,line-height:64px;
s5:font-size:32px,line-height:64px;
s6:font-size:32px,line-height:64px
通过em可以看出改动父元素的字体大小,子元素会等比例变化。em可以让页面更灵活,更健壮,比起到处写死的px值,em似乎更有张力。
基于em的这一特点,理论上是可以用em来做弹性布局页面,但其复杂的计算让人诟病,有人专门做了个px和em的转换表,不同节点像素值对应的em值,如下:


px和em的转换表

更重要的问题在于如果rem做弹性布局的缺点,牵一发而动全身,一旦某个节点的字体大小发生变化,那么其后代元素都需要重新计算,这样带来的工作量无疑是繁琐的。

对rem的理解

rem作用于非根元素时,相对于根元素字体大小;rem作用于根元素字体大小时,相对于其出初始字体大小。

rem取值分为两种情况,设置在根元素时和非根元素时

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

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

em和rem各有优点
对于em来说,可以认为em是为字体和行高而生的,有些时候子元素字体就应该相对于父元素,元素行高就应该相对于字体大小。
对于rem来说,可以基于rem来建立一个同一参考系的概念。

Rem布局原理

rem布局的本质是等比缩放,一般是基于宽度。
想象将屏幕宽度平均分成100份,每一份的宽度用x表示,x = 屏幕宽度 / 100,如果将x作为单位,x前面的数值就代表屏幕宽度的百分比,一个元素宽度为50x,那么该元素实际就占到了屏幕宽度的一半。基于这个理念,在css中,可以通过rem这个桥梁,实现页面元素随着屏幕宽度来进行等比变化。

html {font-size: 16px}
p {width: 2rem} /* 32px*/

html {font-size: 32px}
p {width: 2rem} /*64px*/

如上,如果子元素设置rem单位的属性,通过更改html元素的字体大小,就可以让子元素实际大小发生变化。
如果让html元素字体的大小,恒等于屏幕宽度的1/100,那么计算起来会更方便一些,比如此时html根元素大小为75,页面一个元素的10rem,那么该元素的实际宽度就是75*10=750px;
通常通过js让html根元素字体大小一直等于屏幕宽度的百分之一,一般需要在页面dom ready、resize和屏幕旋转中设置

document.documentElement.style.fontSize = document.documentElement.clientWidth / 100 + 'px';

如何把设计稿图中的元素像素单位的值,转换为已rem为单位的值?

假设设计图宽度为a,根元素大小为f,将来设计图是要完全铺满页面的,那么根据以上,可以得知 f=a/100;
假设设计稿有一个元素的像素宽度为b,其对应的rem的值为R,那么存在以下关系:
b=Rf=R(a/100)=>R=b/(a/100)=(b/a)100
元素的rem的值 = 元素宽度 / UE图宽度 * 100
假设UE图尺寸是640px,UE图中的一个元素宽度是100px,根据公式100/640
100 = 15.625,元素的宽度为15.625rem。
可以通过以下的图标来验证上面的论述是正确的。


UE图宽度和屏幕宽度相同时,可以看出两边得出的元素宽度是一致的。
所以,在使用rem原理来布局的话,根据实际元素的像素,计算出对应的rem值,就可以做到页面的伸缩布局布局了。

但是,如果每个元素的宽高,以及位置,从像素单位转化为对应的rem值时,都需要计算,又会显得很繁琐,这里可以借用其他的方式实现免掉计算这一过程,布局时直接写px,后期页面渲染时通过某种方式来直接将px转化为rem。

1、 可以通过预处理的function来简化过程,比如使用sass

$ue-width: 640; /* ue图的宽度 */

@function px2rem($px) {
  @return #{$px/$ue-width*100}rem;
}

p {
  width: px2rem(100);
}

上面的代码编译完的结果如下

p {width: 15.625rem}

2、使用相关插件cssrem,将CSS的 px 值直接转为 rem 值

效果如下


cssrem
在sublime中安装和配置cssrem插件的详情参照如下:

安装

  • 下载本项目,比如:git clone https://github.com/flashlizi/cssrem
  • 进入packages目录:Sublime Text -> Preferences -> Browse Packages...
  • 复制下载的cssrem目录到刚才的packges目录里。
  • 重启Sublime Text。

配置参数

参数配置文件:Sublime Text -> Preferences -> Package Settings -> cssrem

  • px_to_rem - px转rem的单位比例,默认为40。
  • max_rem_fraction_length - px转rem的小数部分的最大长度。默认为6。
  • available_file_types - 启用此插件的文件类型。默认为:[".css", ".less", ".sass"]。

VScode cssrem插件使用 详细教程

3、 此外还可以使用postcss来处理

p {width: 100px2rem}

postcss会对px2rem这个单位进行处理,处理后的结果如下

p {width: 15.625rem}

可参考:
postcss-pxtorem:移动端px自动转为rem

可参考的其他相关内容:

1、 从网易与淘宝的font-size思考前端设计稿与工作流

2、高清显示屏原理以及设计方案

3、移动web适配之rem

4、设备像素比devicePixelRatio简单介绍

相关文章

  • Rem的深入理解

    什么是em? css中有两个常用的相对单位,em和rem,先有的em,css3中又引入rem,两者很容易混淆,所以...

  • REM布局理解以及解决方案

    REM布局理解以及解决方案 REM的理解 REM是一个相对长度单位,它是基于html根元素的fontSize来动态...

  • rem的理解

    现在假设我们ui给出的设计图大小是750x1334的基准,也就是i6的viewport的两倍大小。那么我就会通过j...

  • REM的理解

    html标签的解释 font-size的解释 当我设置rem时,我设置的是什么 设置 html (文档根元素)的f...

  • rem理解

    看了很多有关rem的文章,但是还是没有看懂其中的原理以及公式怎么计算的,今天就讲一下我的理解,不知道这样理解合理不...

  • em、rem、px区别

    css中如何区分em、rem、px? 随着css学习的不断深入页面也随之丰富,那么em、rem、px是我们在页面布...

  • 2019-08-29

    px、rem、em的区别 随着css学习的不断深入页面也随之丰富,那么em、rem、px是我们在页面布局中经常会用...

  • css3 rem的理解

    对应rem的单位是这么理解就特别简单。html的font-size为a px。1rem = a px;现在有张32...

  • 理解 css rem与动态计算rem

    1.rem定义? 首先css3规定1rem = html根节点的font-size,rem也就是root em简写...

  • rem.js的理解

    普通的html 默认是16px = 1rem为了让设计稿中字体大小 跟rem 换算成100的关系。如果1倍尺寸的...

网友评论

      本文标题:Rem的深入理解

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