移动端布局之 postcss-px-to-viewport(兼容 vant)


第一种方案

已经背弃用的一种,需要了解一下,lib-flexible+postcss-pxtorem;lib-flexible 是阿里的一个开源的库,用于设置 font-size,同时可以对窗口的缩放进行处理,但是由于 rem 是相对于 html 元素字体的一个相对的单位,根本上来说是根据字体大小实现布局,总体来说不太适合;

第二种方案

viewport,postcss-px-to-viewport,就可以解决上面说的问题,这个插件主要是将 px 转换为视口单位 vw,vw 是一种百分比单位,100vw 就等于 100%,就是我们的 window.innerWidth,下面是具体的步骤
vue create myapp ;
npm install postcss-px-to-viewport -D

 

在创建脚手架的时候需要特别注意,需要选择 css Pre-processors
2 在项目根目录下添加.postcssrc.js 文件,或者是 postcssrc.js,这个好像有 bug,建议没效果的时候可以去更改一下
3 添加配置
module.exports = {
  plugins: {
    autoprefixer: {}, // 用来给不同的浏览器自动添加相应前缀,如-webkit-,-moz-等等
    "postcss-px-to-viewport": {
      unitToConvert: "px", // 要转化的单位
      viewportWidth: 750, // UI设计稿的宽度
      unitPrecision: 3, // 转换后的精度,即小数点位数
      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, // 是否处理横屏情况
    },
  },
};
4 重新的区运行项目,不然没有效果,应为我们改变了配置文件
5 在创建好的项目中写一段 css 代码后查看,如果发现单位变成 vw 证明此时成功了,否则就是没有

需要注重的配置

1.ropList: 当有些属性的单位我们不希望转换的时候,可以添加在数组后面,并在前面加上!号,如 propList: ["*","!letter-spacing"],这表示:所有 css 属性的属性的单位都进行转化,除了 letter-spacing 的
2.selectorBlackList:转换的黑名单,在黑名单里面的我们可以写入字符串,只要类名包含有这个字符串,就不会被匹配。比如 selectorBlackList: ['wrap'],它表示形如 wrap,my-wrap,wrapper 这样的类名的单位,都不会被转换

关于兼容第三方的库

1.在引入第三方的库时,在上面配置的 exclude 去掉,表示全部内容进行一个 vw 转换,此时我们会发现我们的视图发生了一定程度的挤压,主要拿 vant 来说,打开 vant 的官网你会发现 vant 在适配时适配的是 375px,而我们的是 750,最最主要的是我们不可能要求 ui 去给我们重新区做 ui 图,所以我们需要在我们的适配的配置文件中去搞一下了,即更改我们的配置文件
2 更改后的配置文件
const path = require("path");

module.exports = ({ webpack }) => {
  const designWidth = webpack.resourcePath.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,
      },
    },
  };
};

3 重新运行,完美适配


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM