em
- 子元素字体大小的em是相对于父元素字体大小
- width/height/padding/margin元素是相对于当前元素字体的大小。
<div> 我是父元素div <p> 我是子元素p <span>我是孙元素span</span> </p> </div>
div { font-size: 40px; width: 10em; /* 400px */ height: 10em; border: solid 1px black; } p { font-size: 0.5em; /* 20px */ width: 10em; /* 200px */ height: 10em; border: solid 1px red; } span { font-size: 0.5em; /* 10px */ width: 10em; /* 100px */ height: 10em; border: solid 1px blue; display: block; }
rem
rem表示 root em,它是相对于根元素的长度单位。根元素指<html>
中定义的字体大小。这意味着任何地方的1rem总是等于<html>
中定义的字体大小。通常给html元素设置一个大小。
html { font-size: 10px; } div { font-size: 4rem; /* 40px */ width: 30rem; /* 300px */ }
例:在不同的屏幕宽度下设置不同的根元素大小,可以收集主流的屏幕大小,但始终不能所有设备适配。
@media only screen and (min-width:320px) {html {font-size:12px;}}
@media only screen and (min-width:375px) {html {font-size:13px;}}
@media only screen and (min-width:412px) {html {font-size:14px;}}
还可以根据js计算当期屏幕分配率然后动态分配font-size的值,这样可以实现全适配
em与rem
在项目开发中究竟是选用 rem
还是 em
一直以来争议不断。一些开发人员不使用rem
,因为rem
使组件不那么模块化。而另一些开发人员喜欢rem
的简单性,使用rem
处理所有元素。
其实 em
和rem
都有各自的优势和劣势,在实际项目开发中,应该结合使用两者,利用各自的优势,从而实现较好代码质量和显示效果。
那么在具体的应用中如何在两者中做选择呢?有两条简单的指导原则:
- 如果属性尺寸要根据元素字体进行缩放,则使用
em
- 其它情况下都使用
rem
- 两者根据实际情况结合使用
参考文章: https://www.cnblogs.com/ifat3/p/8890812.html
http://caibaojian.com/web-app-rem.html