rem

499 阅读4分钟

前言

这是一篇完整介绍rem布局的文章,讲述了rem的效果,原理,包含了demo,以及实战运用。我相信对你了解rem布局大有裨益。如果你觉得确实有帮助的话,帮忙给个小赞,鼓励一下呗!

一:什么是rem?

rem是一种前端弹性布局方式,根据不同屏幕大小动态修改元素属性(宽,高,例如 height = 12rem ),等比缩放,100%还原,以此来达到适配的效果。

二:rem的效果或者作用?

其效果就是弹性布局,等比缩放,100%还原,使其展现出最佳视觉效果。与响应式布局不同的是,响应式布局强调不同屏幕要有不同的显示,比如媒体查询,flex布局等

三:rem是如何实现的(原理)?

子元素的属性大小,根据根元素(html font-size)的变化而变化,例子如下:

html {font-size: 100px } 

p { height: 0.4rem} 

/* 实际 p的高度大小 100 X 0.4 = 40px */

动态设置html html font-size的值(项目初始化时,动态改变屏幕大小时),其他元素的值随之而变化,以此达到等比缩放的原理。其实rem布局的本质是等比缩放,一般是基于宽度。

四:rem在项目的运用,下面是一个demo

rem布局在项目中是如何使用的呢?

js函数(动态修改 html {font-size: 20px }) + postcss-pxtorem(插件将px转化 rem)

之后我们在项目里面就只需要按照UI图上写px就可以了,插件自动将此处理成rem,打包到项目里。

1, js函数,动态改html的值, 放到项目index.html,或者入口文件里面app.js,初始时执行

function setRem () {
  let htmlWidth = document.documentElement.clientWidth || document.body.clientWidth;
  //得到html的Dom元素
  let htmlDom = document.getElementsByTagName('html')[0];

  // 设置根元素字体大小 (  屏幕宽度 / (设计图UI宽度 / webpack中rootValue) );
  htmlDom.style.fontSize= htmlWidth/( 640 / 64 ) + 'px';
}

setRem();
  // 改变窗口大小时重新设置 rem
window.addEventListener('resize', function () {
setRem()
})

2,引入 postcss-pxtorem,将 px 转为 rem

npm install postcss-pxtorem@5.1.1 --save-dev

之后在配置文件里面webpack.config.js加入 postcss-pxtorem的配置,加在 ‘postcss-loader’里面

image.png
[
    'postcss-pxtorem',
    {
    // rootValue: 64的含义是1rem = 64px,转化的规则就是 (ui图的宽高px) / 64 = ?rem, 
    //一旦rootValue确定了,设计图中的宽高的rem值就不变了,动态变化的是html的根元素的值(记住要考哦)
    // rootValue 就是个转化标准值,可任意取值,一般取值为 ui设计图宽度 / 10, 
      rootValue: 64, 
      unitPrecision: 5, // 允许rem单位增长到的10进制数字,小数点后的保留位
      propList: ['*'],
      exclude: /node_modules/, // 忽略的目录(正则匹配转换element-ui的样式)
      selectorBlackList: ['.retain'], // 要忽略并保留为px的选择器
      mediaQuery: true, // 允许媒体查询转换px
      minPixelValue: 1 // 替换的最小像素值
    }
],

3,下面是github上的demo( 分支名 rem—1.0.0 )

  • 如果设计图UI的尺寸640px,图片的宽度是64px, rootValue:64px(1rem = 64px), 那么图片宽度转化rem就是 width= 宽度64px / rootValue = 1rem;一旦rootValue确定了,元素不管在哪个分辨率显示器下都是固定的。
image.png
  • 那么在宽度为640px的屏幕下的表现就是1:1还原,具体参数如下,

    图片宽度等于 1rem * 64px(htmlfont-szie的值) = 64px;

image.png

  • 那么在宽度为1280px的屏幕下的表现就是放大2倍,具体参数如下

    图片宽度等于 1rem * 128px(html font-szie的值) = 128px;

image.png

总结:A,图片的rem值是不变的,设计图确定了,rootValue确定了, 图片的属性 rem值就确定 B,屏幕宽度不同,对应的 html font-szie的值不同,font-size的值是如何变化的呢?

 html font-size的值 = 屏幕宽度 / (设计图尺寸宽度 / rootValue) + px
 1920屏幕 font-size的值  192px = 1920 /( 640 / 64)px   图片宽度: 1rem * 192 = 192px (设计图的3倍)
 1280屏幕 font-size的值  128px = 1280 /( 640 / 64)px   图片宽度: 1rem * 128 = 128px (设计图的2倍)
  640屏幕 font-size的值   64px = 640 / (640 / 60)px    图片宽度: 1rem * 64 = 64px

如何理解这个公式呢?等比缩放,图片宽度占整体屏幕的比例是不变的1rem,只是等比系数不一样(html font-size的值不同)。认真体会,设计图是640px ,rootValue: 64px(每份64px), 也就是说设计图分成了640/64 =10份; 那么1280的屏幕也要分成10分,也就是1280 / 10 = 128px, 每份128px;同理1920的屏幕也要分成10分,也就是1920 / 10 = 192px, 每份192px。

html font-size 的含义就是,与设计图划分相同份数,每一份对应的宽度; 当前屏幕分辨率/ font-size的值 = ui设计图宽度 / rootValue (划分成相同份数,只是每份的宽度不同,元素的占比不变-rem,变的是每一份代表的宽度不同而已)

4,下面是进阶版本,可直接用于项目( rem-2.0.0 )

五:gitlabe项目 demo 地址

github.com/HaiZi666/re…