移动端 postcss-px-to-viewport 兼容第三方UI库

1,885 阅读2分钟

1.开发环境

vant: "^2.12.12",

vue: "^2.6.11",

2.在vue项目中安装 插件

npm i postcss-px-to-viewport -D

npm install less less-loader --save-dev

如果出现less报错 Syntax Error: TypeError: this.getOptions is not a function 是less-loader安装的版本太高,卸载重新安装7.0版本即可

// 卸载

npm uninstall --save less-loader

// 安装

npm install -D less-loader@7.x

3. 在项目根目录下添加.postcssrc.js文件

4. 在postcssrc.js中添加配置(不兼容vant)

module.exports = {
  plugins: {
    autoprefixer: {}, // 用来给不一样的浏览器自动添加相应前缀,如-webkit-,-moz-等等
    "postcss-px-to-viewport": {
      unitToConvert: "px", // 要转化的单位
      viewportWidth: 750, // UI设计稿的宽度
      unitPrecision: 6, // 转换后的精度,即小数点位数
      propList: ["*"], // 指定转换的css属性的单位,*表明所有css属性的单位都进行转换
      viewportUnit: "vw", // 指定须要转换成的视窗单位,默认vw
      fontViewportUnit: "vw", // 指定字体须要转换成的视窗单位,默认vw
      selectorBlackList: ["wrap"], // 指定不转换为视窗单位的类名,
      minPixelValue: 1, // 默认值1,小于或等于1px则不进行转换
      mediaQuery: true, // 是否在媒体查询的css代码中也进行转换,默认false
      replace: true, // 是否转换后直接更换属性值
      exclude: [/node_modules/], // 设置忽略文件,用正则作目录名匹配
      landscape: false // 是否处理横屏状况
    }
  }
};

5.在postcssrc.js中添加配置(兼容vant)

const path = require('path');
module.exports = ({ file }) => {
  const designWidth = file.dirname.includes(path.join('node_modules', 'vant')) ? 375 
  : 750;

  return {
    plugins: {
      autoprefixer: {},
      "postcss-px-to-viewport": {
        unitToConvert: "px",
        viewportWidth: designWidth,
        unitPrecision: 6,
        propList: ["*"],
        viewportUnit: "vw",
        fontViewportUnit: "vw",
        selectorBlackList: [], // 空
        minPixelValue: 1,
        mediaQuery: true,
        exclude: [], // 空
        landscape: false
      }
    }
  }

}

ps:

vant团队的是根据375px的设计稿去作的,理想视口宽度为375px。

.postcssrc.js文件,它除了暴露一个对象,也能够暴露一个函数,不管暴露什么,在webpack运行时,都会被咱们配置的海量文件读取并执行。

暴露函数有一个好处,能够拿到webpack运行的当前执行文件的信息。

那么咱们能够有这样一个思路:若是读取的是vant相关的文件,viewportWidth就设为375,若是是其余的文件,咱们就按照咱们UI的宽度来设置viewportWidth,即750。