这里用Vant组件库中的适配方案讲解
Vant 中的样式默认使用 px
作为单位,如果需要使用 rem
单位,推荐使用以下两个工具:
-
postcss-pxtorem 是一款 postcss 插件,用于将单位转化为 rem
-
lib-flexible 用于设置 rem 基准值
一、使用 lib-flexible 动态设置 REM 基准值(html 标签的字体大小)
1、安装
# yarn add amfe-flexible
npm i amfe-flexible
2、然后在 main.js
中加载执行该模块
import 'amfe-flexible'
最后测试:在浏览器中切换不同的手机设备尺寸,观察 html 标签 font-size
的变化。
二、使用 postcss-pxtorem 将 px
转为 rem
1、安装
# yarn add -D postcss-pxtorem
# -D 是 --save-dev 的简写
npm install postcss-pxtorem -D
2、然后在项目根目录中创建 .postcssrc.js
文件
module.exports = {
plugins: {
'postcss-pxtorem': {
rootValue: 37.5,
propList: ['*']
}
}
}
3、配置完毕,重新启动服务
需要注意的是:
-
该插件不能转换行内样式中的
px
,例如<div style="width: 200px;"></div>
三.配置文件详解
-
rootValue
:表示根元素字体大小,它会根据根元素大小进行单位转换
把一行分为十分,每份就是十分之一,一般都以ipone 6为基础设计设计稿,为750px
所以 750/10=75 但是vant建议设置为37.5,因为vant基于375写的 所以必须写37.5
这就出现一个问题:设计稿是vant中二倍。每次测量设计稿都需要程序员计算
-
propList
用来设定可以从 px 转为 rem 的属性
例如 *
就是所有属性都要转换,width
就是仅转换 width
属性
四终极解决方案
plugins: {
// 配置使用 autoprefixer 插件
// 作用:生成浏览器 CSS 样式规则前缀
// VueCLI 内部已经配置了 autoprefixer 插件
// 所以又配置了一次,所以产生冲突了
// 'autoprefixer': { // autoprefixer 插件的配置
// // 配置要兼容到的环境信息
// browsers: ['Android >= 4.0', 'iOS >= 8']
// },
// 配置使用 postcss-pxtorem 插件
// 作用:把 px 转为 rem
'postcss-pxtorem': {
rootValue ({ file }) {
return file.indexOf('vant') !== -1 ? 37.5 : 75
},
propList: ['*']
}
}