1、postcss-pxtorem
介绍: 一款可以把px单位转成rem的插件,具体使用方法可以点击上方链接。
// postcss.config.js
module.exports = {
plugins: [
require('postcss-pxtorem')({
rootValue: 16,
unitPrecision: 5,
propList: ['font', 'font-size', 'line-height', 'letter-spacing'], // 若要修改全部样式,改为['*']
selectorBlackList: [],
replace: true,
mediaQuery: false,
minPixelValue: 0,
exclude: /node_modules/i
})
]
}
2、postcss-pxtorpx
介绍: 将px单位转换为适合小程序自适应的rpx单位,使用方法同postcss-pxtorem。
$ npm install postcss postcss-pxtorpx --save-dev
// postcss.config.js
module.exports = {
plugins: [
require('postcss-pxtorem')({
unitPrecision: 3,
propList: ['*'],
selectorBlackList: [],
replace: true,
mediaQuery: false,
minPixelValue: 1,
exclude: /node_modules|uview-ui/i
})
]
}
于是我们很高兴地引入,然后发现嗯!确实可以生效,但是有个问题是,如果我们的项目里引入了第三方库,比如适合uni-app的uview-ui或者vant weapp等,就会发现,这里的exclude并没有生效,uview-ui里的px也同样被转成了rpx,究其原因,我去看了下这个包。
// node_modules/postcss-pxtorpx/index.js
var defaults = {
multiplier: 1,
unitPrecision: 5,
selectorBlackList: [],
propList: ['font', 'font-size', 'line-height', 'letter-spacing'],
replace: true,
mediaQuery: false,
minPixelValue: 0
};
可以发现,插件里根本就没有定义rootValue和exclude这两个属性,自然就不起效果。那怎么办?
我在网上冲浪的时候发现了另一个插件postcss-px2rem-exclude,他们用这个插件来做exclude。为了转成rpx,我们可以参考postcss-px2rem-exclude里的写法,加多两句代码,自己exclude,代码如下:
// node_modules/postcss-pxtorpx/indexx.js
module.exports = postcss.plugin('postcss-pxtopx', function(options) {
convertLegacyOptions(options);
var opts = objectAssign({}, defaults, options);
var pxReplace = createPxReplace(opts.multiplier, opts.unitPrecision, opts.minPixelValue);
var satisfyPropList = createPropListMatcher(opts.propList);
return function(css) {
// -------添加这两句
if(opts?.exclude && css.source.input.file.match(opts.exclude) !== null){
return
}
// -------------
css.walkDecls(function(decl, i) {
// This should be the fastest test and will remove most declarations
if (decl.value.indexOf('px') === -1) {
return;
}
添加之后再编译就可以了,但这并不好,因为我们不可能每次都去改包,所以另外一种做法就是,直接down下来这个包作为第三方,把它丢到src/libs里面去,然后修改一下postcss.config.js就可以了:
// 转换px to rpx
const PxToRpx = require('./src/libs/postcss-pxtorpx')
module.exports = {
plugins: [
PxToRpx({
unitPrecision: 3,
propList: ['*'],
selectorBlackList: [],
replace: true,
mediaQuery: false,
minPixelValue: 1,
exclude: /node_modules|uview-ui/i
}),
]
}
注意
这里的px转rpx本质上是字符串替换,也就是说,如果你是iPhone6的话:1rpx = 0.5px,你就要把单位在原来的基础上乘2才能得到实际效果,即 原来 font-size: 14px,现在 font-size: 28px。这样会变得有点麻烦,如果你想的话,也可以改一下包,让它输入14px,输出28rpx:找到 createPxReplace 函数,在return语句里让 fixedVal 乘2。
总结
兜了一圈,其实直接写rpx就可以。