Vue3自定义PostCss插件
-
-
- [插件功能: 实现自动转px为vw功能](#插件功能: 实现自动转px为vw功能)
- [1. 创建插件ts文件](#1. 创建插件ts文件)
- [2. tsconfig.node.json引入插件](#2. tsconfig.node.json引入插件)
- [3. vite.config.ts增加插件配置](#3. vite.config.ts增加插件配置)
- [4. 编写插件内容](#4. 编写插件内容)
- [5. 示例](#5. 示例)
-
插件功能: 实现自动转px为vw功能
px 固定单位,不会随着屏幕的变化而变化
vh vw 相对于视口高宽进行控制
1. 创建插件ts文件

2. tsconfig.node.json引入插件
javascript
"include": [
"vite.config.ts",
"plugins/**/*"
]
3. vite.config.ts增加插件配置
javascript
import { PostCssToViewport } from './plugins/postcss-px-to-viewport'
// https://vitejs.dev/config/
export default defineConfig({
plugins: [
vue(),
vueJsx()
],
css:{
//配置自定义postcss插件
postcss:{
plugins:[PostCssToViewport()]
},
},
})
4. 编写插件内容
javascript
//postcss插件
import { Plugin } from "postcss"
const Options = {
viewportWidth: 375,//默认视口宽度
}
interface Options {
viewportWidth?:number
}
export const PostCssToViewport = (options:Options = Options):Plugin =>{
const opt = Object.assign({},Options,options);
return {
postcssPlugin: 'postcss-px-to-viewport',
//钩子函数
Declaration(node){
//判断需要转换的单位
if(node.value.indexOf('xm') != -1){
console.log(node.prop,node.value);
const num = parseFloat(node.value);
node.value = `${((num / opt.viewportWidth)*100).toFixed(2)}vw`
}
}
}
}
插件会将样式中是自定义单位(xm)装换为vw
5. 示例
javascript
<template>
<div>
<header class="header">
<div>left</div>
<div>center</div>
<div>right</div>
</header>
</div>
</template>
<script setup lang=ts>
import {ref} from 'vue'
</script>
<style scoped lang="less">
.header{
display: flex;
div{
height: 50px;
line-height: 50px;
color: #fff;
text-align: center;
}
div:nth-child(1){
width:100xm;
background-color: #f00;
}
div:nth-child(2){
flex:1;
background-color: #0f0;
}
div:nth-child(3){
width: 100xm;
background-color: #00f;
}
}
</style>
