Vue3 postcss-px-to-viewport-8-plugin

该文章已生成可运行项目,

适配用的,把px转换成vw进行页面内容的适配

效果

.selector {
  width: 100px;
  font-size: 14px;
  margin: 10px;
}
转化为

.selector {
  width: 13.33vw;
  font-size: 1.87vw;
  margin: 1.33vw;
}

1、安装postcss-px-to-viewport-8-plugin

npm install postcss-px-to-viewport-8-plugin --save-dev

 2、在vite.config.js进行配置

import { defineConfig, loadEnv } from 'vite'
import vue from '@vitejs/plugin-vue'

        //配置的地方---------------开始-----------------
import postcsspxtoviewport from 'postcss-px-to-viewport-8-plugin'
        //配置的地方---------------结束-----------------


// https://vite.dev/config/
export default defineConfig(({ mode }) => {
  const env = loadEnv(mode, process.cwd());
  return {
    plugins: [
      vue(),

    ],
    css: {
        //配置的地方---------------开始-----------------
      postcss: {
        plugins: [
          tailwindcss,
          autoprefixer,
          postcsspxtoviewport({
            // 要转化的单位
            unitToConvert: 'px',
            // UI设计稿的大小
            viewportWidth: 1920,
            // 转换后的精度
            unitPrecision: 6,
            // 转换后的单位
            viewportUnit: 'vw',
            // 字体转换后的单位
            fontViewportUnit: 'vw',
            // 能转换的属性,*表示所有属性,!border表示border不转
            propList: ['*'],
            // 指定不转换为视窗单位的类名,
            selectorBlackList: ['ignore-'],
            // 最小转换的值,小于等于1不转
            minPixelValue: 1,
            // 是否在媒体查询的css代码中也进行转换,默认false
            mediaQuery: false,
            // 是否转换后直接更换属性值
            replace: true,
            // 忽略某些文件夹下的文件或特定文件,例如 'node_modules' 下的文件
            exclude: [],
            // 包含那些文件或者特定文件
            include: [],
            // 是否处理横屏情况
            landscape: false
          }),
        ]
        //配置的地方---------------结束-----------------
      },

      preprocessorOptions: {
        scss: {
          additionalData: `@use "@/assets/css/index.scss" as *;`,
        },
      }
    },
    resolve: {
      base: '',
      publicDir: path.resolve(__dirname, './dist'),
      assetsInclude: path.resolve(__dirname, './src/assets'),
      // 配置路径别名
      alias: {
        '@': path.resolve(__dirname, 'src'),
        '@/assets': path.resolve(__dirname, './src/assets'),
        '@/views': path.resolve(__dirname, './src/views'),
      },
    }
  }
})
本文章已经生成可运行项目
### 实现 Vue3postcss-px-to-viewport-8-plugin 的局部应用 在 Vue3 项目中,如果希望 `postcss-px-to-viewport-8-plugin` 插件只应用于特定的组件而非全局生效,则可以通过调整 PostCSS 配置来实现这一需求。 #### 方法概述 通过配置 `exclude` 或者 `include` 参数可以控制哪些文件会被插件处理。具体来说,在 `postcss.config.js` 文件中,可以在 `postcss-px-to-viewport-8-plugin` 的选项里设置这些参数[^1]。 以下是详细的解决方案: --- ### 修改 PostCSS 配置以支持局部应用 修改项目的 `postcss.config.js` 文件如下所示: ```javascript module.exports = { plugins: { autoprefixer: {}, "postcss-px-to-viewport-8-plugin": { viewportWidth: 375, viewportHeight: 667, unitPrecision: 5, viewportUnit: &#39;vw&#39;, selectorBlackList: [], minPixelValue: 1, mediaQuery: true, exclude: [/node_modules/, /\/global\.scss$/], // 排除 global.scss 和 node_modules 下的内容 include: [/components\/specificComponent/] // 只针对 components/specificComponent 路径下的文件启用 } } }; ``` 在此配置中: - **`exclude`**: 定义了一组正则表达式,用于排除不需要被转换的文件或目录。 - **`include`**: 同样是一组正则表达式,表示只有匹配到的文件才会被此插件处理。 需要注意的是,`include` 和 `exclude` 是互斥的逻辑关系。当两者同时存在时,优先级取决于具体的插件实现,通常建议单独使用其中之一以避免冲突。 --- ### 在指定组件中手动引入样式并测试 假设有一个名为 `SpecificComponent.vue` 的组件需要应用该插件,而其他组件无需应用。那么可以直接在这个组件内部编写 CSS 并验证其效果。 ```vue <template> <div class="test-class"> 这是一个测试文本 </div> </template> <script setup> // 组件逻辑... </script> <style scoped> .test-class { width: 100px; /* 此处会自动转为 vw 单位 */ height: 50px; } </style> ``` 运行项目后,检查编译输出中的 `.test-class` 样式是否已经被成功转换为基于视口单位 (`vw`) 的形式。 --- ### 替代方案:动态加载不同的 PostCSS 配置 另一种方法是利用 Webpack 的 `rule.loader` 功能,为不同类型的文件分别指定独立的 PostCSS 处理流程。这需要更复杂的 Webpack 配置,但对于大型项目可能更加灵活。 例如,在 Webpack 配置中添加以下规则: ```javascript module.exports = { module: { rules: [ { test: /\.vue$/, use: [ { loader: &#39;postcss-loader&#39;, options: { postcssOptions: { plugins: [ require(&#39;autoprefixer&#39;), require(&#39;postcss-px-to-viewport-8-plugin&#39;)({ viewportWidth: 375, viewportHeight: 667, unitPrecision: 5, viewportUnit: &#39;vw&#39;, selectorBlackList: [], minPixelValue: 1, mediaQuery: true, include: [/components\/specificComponent/], }), ], }, }, }, ], }, ], }, }; ``` 这种方式能够进一步细化对每个模块的处理策略。 --- ### 总结 无论是通过简单的 `postcss.config.js` 配置还是借助 Webpack 自定义规则,都可以满足仅让部分组件应用 `postcss-px-to-viewport-8-plugin` 的需求。推荐先尝试前者,因为它更为简洁易维护;对于复杂场景再考虑后者。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值