postcss-pxtorem在Vite5+Vue3项目中如何配置

1,623 阅读3分钟

当pc端或移动端H5等项目中需要根据当前浏览器窗口或屏幕尺寸来自适应的改变页面内元素尺寸时,就可以借助下述插件和相关配置来实现。

postcss-pxtorem

这是一个PostCSS的插件,要在Vite项目中配置,可以翻一下官方文档相关配置说明 Vite

1、下载依赖

pnpm add postcss-pxtorem amfe-flexible --D

2、main.ts文件引入

import 'amfe-flexible'

3、vite.config.ts配置

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import postCssPxToRem from 'postcss-pxtorem'

export default defineConfig({
  plugins: [vue()],
  css: {
    postcss: {
      plugins: [
        postCssPxToRem({
          // 配置在将px转化为rem时 1rem等于多少px(因为我们搭配使用了amfe-flexible插件 此处我们需要设置的值应是UI设计稿全屏基准宽度的十分之一)
          // 当UI设计稿的全屏基准宽度是1920px时 此处设置的值为192
          rootValue: 192,
          // 所有px均转化为rem
          propList: ['*']
          // 若想设置部分样式不转化 可以在配置项中写出
          // eg: 除 border和font-size外 所有px均转化为rem
          // propList: ["*", "!border","!font-size"],
        })
      ]
    }
  },
})

当项目内引入了vantUI组件库,vant的UI设计稿基准宽度是375px,如果与我们开发时UI给出的设计稿基准宽度不同,使用下述配置方法(移动端有时会引入vant组件库)

// 引入pxtorem插件
import postCssPxToRem from "postcss-pxtorem";
 
export default defineConfig({
  plugins: [vue()],
  css: {
    postcss: {
      plugins: [
        postCssPxToRem({
          // 配置在将px转化为rem时 1rem等于多少px(因为我们搭配使用了amfe-flexible插件 此处我们需要设置的值应是UI设计稿全屏基准宽度的十分之一)
          // 当UI设计稿的全屏基准宽度是750px时 此处设置的值为75 但项目中使用了vant组件库 vant的设计稿总宽度是375px 其十分之一应是37.5(需要区分设置)
          rootValue ({ file }) {
            return file.indexOf('vant') !== -1 ? 37.5 : 75
          },
          // 所有px均转化为rem
          propList: ["*"]
          // 若想设置部分样式不转化 可以在配置项中写出
          // eg: 除 border和font-size外 所有px均转化为rem
          // propList: ["*", "!border","!font-size"], 
        })
      ]
    }
  }
})

实现效果

image.png

  • rem单位的特点,是1rem对应的px值等于html的font-size值。也就是说,当html的font-size值变化时,1rem的值会跟随着动态变化。比如:有一个div,他的高度设置为1rem,当页面内html的font-size为16px时,这个div的高度就是16px;当页面内html的font-size为32px时,这个div的高度就是32px。html自由飞,rem永相随!

  • postcss-pxtorem插件会将我们写在样式中的px根据我们在vite.config.ts中设置的rootValue值,按比例转化为rem。(要注意哦,行内样式中的px不会被转化为rem)

  • amfe-flexible插件会根据当前可展示区域的实际宽度,动态设置的font-size为可展示区域宽度的十分之一。(这也就是为什么我们在vite.config.ts中设置rootValue值时需要设置为UI设计稿的十分之一,是为了与此插件对font-size的设置相对应)