Uni-app postcss-pxtorpx 使用(可以exclude某个文件夹)

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就可以。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
postcss-pxtorem中,如果我们想要忽略多个文件,可以使用正则表达式来匹配这些文件,并在配置项中添加exclude属性。例如,在.postcssrc.js文件中,我们可以使用以下配置来忽略多个文件: ```javascript module.exports = { "plugins": { "autoprefixer": {}, 'postcss-pxtorem': { rootValue: 37.5, // 75表示750设计稿,37.5表示375设计稿 propList: ['*'], exclude: /file1|file2|file3/i } } } ``` 在上述配置中,exclude属性使用了正则表达式来匹配文件名,通过使用|符号来分隔多个文件名。这样,postcss-pxtorem将忽略匹配到的这些文件,不进行转换处理。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Uni-app postcss-pxtorpx 使用(可以exclude某个文件夹)](https://blog.csdn.net/qq_42868846/article/details/121543681)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *3* [vue-移动端适配-postcss-pxtorem](https://blog.csdn.net/qq2276031/article/details/121637970)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值