移动端的自适应方案之 rem

170 阅读2分钟

设计稿中常用的标准像素单位是 px,当设备宽高不同的时候,网页元素的宽度和高度都要进行适配,所以需要加入移动端的自适应方案

可实现的方案如下:

  • 百分比
  • 媒体查询
  • rem
  • vw
  • px + calc

百分比的局限:百分比只能让宽度进行自动适配,高度仍然要设置固定的值

媒体查询的局限:媒体查询能够检测视口的宽度,然后编写差异化的 CSS 样式,但是太过繁琐

rem

REM,font size of the root element

它是相对单位,是相对HTML根元素( 1 rem = 1 html 标签字号 )

html标签字号就是html元素的font-size大小。注意区分 rem 和 em (em是相对于父元素大小的缩放)

html {
    font-size: 20px;
}

所以,根据不同设备大小来设置元素font-size的大小,进行元素缩放,从而达到适配的效果。

如果习惯了 px 的写法的开发,可以使用 postcss-pxtorem 像素自动转换成 rem,在代码中 css 的单位为 px,在控制台中看到的是rem

image.png

postcss-pxtorem 安装与使用

安装:

npm install postcss postcss-pxtorem --save-dev

在 vue.config.js 中配置 css 的 loaderOptions 属性:

  • rootValue:16 的含义是:元素宽度/16,比如宽度为 320px,页面会转换为 20 rem
  • 其它参数配置可参考官方文档
 css: {
    loaderOptions: {
      postcss: {
        postcssOptions: {
          plugins: [
            require('postcss-pxtorem')({
              rootValue: 16,
              propList: ['*'],
            }),
          ]
        }
      }
    }
  }

image.png

创建一个新文件,并在 main.js 中引入,用来设置基准大小,以及计算窗口变化时的缩放比例(根据页面尺寸),窗口尺寸变化时进行更新。

  • baseSize 表示设计稿中 1rem 的大小
  • scale 表示实际页面的宽度和设计稿的比值
const baseSize = 32
function setRem() {
  const scale = document.documentElement.clientWidth / 1920  // 当前页面宽度的缩放比例
  document.documentElement.style.fontSize = (baseSize * Math.min(scale, 2)) + 'px'  // 设置页面根节点字体大小
}
setRem()
window.onresize = function () {
  setRem()
}