动态REM

常见单位

  • px : 固定单位
  • 百分比
  • em: 相对单位,相对于自己的 font-size。如果用在 font-size 属性本身,它会继承父元素的font-size。

当你针对同一个元素使用em声明font-size和其他属性的时候,浏览器先计算font-size,然后基于这个值再去计算其他值:

<div style ="font-size: 12px" >   
  <p style = "font-size: 2em;height: 2em;background: #ccc;">这是em</p> 
 <!-- p 的最终样式为:  font-size: 24px ;height: 48px;  -->
</div>

当你针对同一个元素使用em声明font-size和其他属性的时候,em会变得很神奇。此时浏览器必须先计算font-size,然后基于这个值再去计算其他值。这些属性声明的时候使用的是相同的em值,但很可能它们会有不同的计算值。

  • rem: 相对单位,相对于根元素(html) 字体大小
  • vw、vh:相对单位, 1vw 为视口宽度的1%, 1vh 为视口高度的1%

动态 REM

原理

一切单位以宽度为基准(其实vw最好,但是兼容性差)
1 rem = html font-size = 页面宽度
具体代码如下:

var pageWidth = window.innerWidth;
console.log(pageWidth);
var html = document.getElementsByTagName('html');
console.log(html);
html[0].style.fontSize = pageWidth + 'px';  //  html是个类数组对象,所以下标一定不要忘了
利用Sass 将 px 自动变为 rem

在 scss 文件里加上下面这个函数(也可以是其他的),就可以实现px 自动转化为rem 了。

@function px2rem($px){
  @return $px/$designWidth + rem;
}
$designWidth : 640

小优化
由于上面的方法使 1 rem = 页面宽度,写样式的时候以 rem 为单位时,小数太多,可以稍微优化一下,比如如果设计稿宽度是 640px,那我就让 1 rem = 页面宽度/ 6.4 (注意浏览器最小字体)

var pageWidth = window.innerWidth;
console.log(pageWidth);
var html = document.getElementsByTagName('html');
console.log(html);
html[0].style.fontSize = pageWidth/6.4 + 'px';  //  html是个类数组对象,所以下标一定不要忘了
@function px2rem($px){
  @return 6.4 * $px/$designWidth + rem;   // 这里要把 6.4 乘回来
}
$designWidth : 640

写样式的时候调用这个函数
eg.
width: px2rem(30) 会根据函数自动将宽度变成 以rem 为单位的。
参考:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,786评论 1 92
  • 响应式 什么是响应式页面呢? 顾名思义响应式页面就是能做出响应的页面,它的页面效果不是定死的,会随着用户的改变而改...
    Criya阅读 2,117评论 0 1
  • 响应式 1.meta:vp 阻止缩放 2.尽量不要写width / height,改用max / min 不要把宽...
    阿鲁提尔阅读 412评论 0 1
  • 动态REM是手机专用的自适应方案 REM是什么 我们常用的单位有(有问题看MDN) px em (一个汉字M的宽度...
    YM雨蒙阅读 386评论 0 0
  • 单位 px:像素em:一个 M 的宽度(面试:一个字的宽度)rem:root em 根元素( )的 font-si...
    饥人谷_风争阅读 550评论 0 1