npm install amfe-flexible -S
npm install postcss-px2rem -S
postcss-px2rem会将px转换为rem,rem单位用于适配不同宽度的屏幕,根据标签的font-size值来计算出结果,1rem=html标签的font-size值
在入口main.js中 引入 lib-flexible
import "amfe-flexible";
注意事项(important): 由于flexible会动态给页面header中添加标签,所以务必请把目录 public/index.html 中的这个标签删除!!!
vue-cli3 配置
px2rem的配置放在vue-cli3 项目中vue.config.js中(找不到?可能你是一个新构建的项目,需要手动在项目根目录创建vue.config.js)
具体配置内容如下:
postcss-pxtorem 在postcss.config.js中配置
module.exports = {
css: {
loaderOptions: {
postcss: {
plugins: [
require("postcss-px2rem")({
remUnit: 75
})
]
}
}
}
}
vue-cli2 配置
找到根目录下.postcssrc.js文件
然后里面写
module.exports = {
plugins: {
'postcss-import': {},
'postcss-url': {},
// to edit target browsers: use "browserslist" field in package.json
autoprefixer: {
browsers: ['Android >= 4.0', 'iOS >= 7']
},
'postcss-pxtorem': {
rootValue: 75,
propList: ['*', '!border*']
}
}
}
propList 表示不匹配 要是想匹配边框之类的 可以在里面用 !border* 表示不配备边框,这样不会把边框1px变成1rem
使用时设计图750px的,那设计图要是300px的宽度,那代码里面写成300px。
不想匹配,也就是不想把px变为rem,可以这样
.nav {
width: 400px;
height: 300px;
background: red;
border: 1px solid black; /*no*/
}
踩坑
后期,发现自己要用vantUI框架,而当我引入之后,发现所有的组件样式都比样例要小,一开始很是懵逼 后来查询之后发现,原来是因为vantUI的根字体默认大小是37.5,和我们默认设置的75不一样,正好是2倍关系,所以当我们的设计图是750的时候,我们的组件就会看起来是1/2的大小,解决这种问题有三种方法:
1、自己要用vant,设置为37.5,在使用ui的设计图时,用1/2的单位来布局,这种显然是个很鸡肋的办法,简言之:可以但没必要! – 作者君就是用的这种方法
2、不用px2rem-loader和lib-flexible搭配,而是使用:lib-flexible和postcss-pxtorem搭配,因为lib-flexible和postcss-pxtorem里面有一个过滤功能,可以让我们过滤掉以van开头的样式:在引入的postcssrc.js里面设置:
module.exports={
plugins:{
'postcss-pxtorem':{
rootValue:75,
propList:['*'],
selectorBlackList:['van','weui','mu'] // 忽略转换正则匹配项
}
}
}
3、第三种办法就是使用判断条件,依然是在postcssrc.js里面修改:
const AutoPrefixer = require("autoprefixer");
const px2rem = require("postcss-px2rem");
module.exports = ({ file }) => {
let remUnit;
// 判断条件 请自行调整 我使用的是 mand-mobile ui 没有对vant引入进行测试
//link https://github.com/youzan/vant/issues/1181
if (file && file.dirname && file.dirname.indexOf("vant") > -1) {
remUnit = 37.5;
}else {
remUnit = 75;
}
return {
plugins: [
px2rem({ remUnit: remUnit}),
AutoPrefixer({ browsers: ["last 20 versions", "android >= 4.0"] })
]
};
};
postcss-pxtorem (Star1.5k)和postcss-px2rem (Star536)
使用postcss-pxtorem 时的 vue.config.js 配置:
module.exports = {
lintOnSave: true,
css: {
loaderOptions: {
postcss: {
plugins: [
require('postcss-pxtorem')({//这里是配置项,详见官方文档
rootValue : 1, // 换算的基数
selectorBlackList : ['weui','mu'], // 忽略转换正则匹配项
propList : ['*'],
}),
]
}
}
},
}
使用postcss-px2rem 时的 vue.config.js 配置:
module.exports = {
lintOnSave: true,
css: {
loaderOptions: {
postcss: {
plugins: [
require('postcss-px2rem')({ //配置项,详见官方文档
remUnit: 30
}), // 换算的基数
]
}
}
},
}