我我的项目应用 vite,并且在按需导入时自定义主题。
我的项目依赖:
"@element-plus/icons-vue": "^2.0.10",
"axios": "^1.2.0",
"crypto-js": "^4.1.1",
"echarts": "^5.4.0",
"element-plus": "^2.2.25",
"pinia": "^2.0.26",
"vue": "^3.2.45",
"vue-router": "^4.1.6"
一、通过 SCSS 变量更换主题色
我我的项目应用了 SCSS,theme-chalk 也是应用 SCSS 编写而成,因而能够间接批改 Element Plus 的款式变量。在 packages/theme-chalk/src/common/var.scss 文件中能够查找 SCSS 变量。
1、新建一个款式文件,
例如:src/assets/styles/element/index.scss
/* 只须要重写你须要的变量即可 */
@forward 'element-plus/theme-chalk/src/common/var.scss' with (
$colors: (
'primary': ('base': green,),
),
);
// 如果只是按需导入,则能够疏忽以下内容。// 如果你想导入所有款式:
// @use "element-plus/theme-chalk/src/index.scss" as *;
下面 index.css 的内容援用自 element Plus 官网。
留神:最初一部分须要,并不是按官网所说按需导入可疏忽。
2、应用 scss.additionalData 来编译所有利用 scss 变量的组件。
import {defineConfig} from 'vite'
import {fileURLToPath, URL} from 'node:url'
import vue from '@vitejs/plugin-vue'
import vueJsx from '@vitejs/plugin-vue-jsx'
// element plus 按需主动导入组件
import AutoImport from 'unplugin-auto-import/vite'
import Components from 'unplugin-vue-components/vite'
// 按需导入 element 组件
import {ElementPlusResolver} from 'unplugin-vue-components/resolvers'
import Icons from 'unplugin-icons/vite'
import IconsResolver from 'unplugin-icons/resolver'
import path from 'path'
const postCssPxToRem = require("postcss-pxtorem")
const pathSrc = path.resolve(__dirname, 'src')
// https://vitejs.dev/config/
export default defineConfig({
server: {host: '0.0.0.0' // 通过 ip+port 拜访服务器},
plugins: [vue(),
vueJsx(),
AutoImport({
// Auto import functions from Vue, e.g. ref, reactive, toRef...
// 主动导入 Vue 相干函数,如:ref, reactive, toRef 等
imports: ['vue'],
resolvers: [ElementPlusResolver(), // 主动导入 Element Plus 相干函数,如:ElMessage, ElMessageBox... (带款式)
// 主动导入图标组件
IconsResolver({
prefix: 'Icon', // <IconCarbonApps />
// extension: 'jsx',
}),
],
dts: path.resolve(pathSrc, 'auto-imports.d.ts'),
}),
Components({
resolvers: [
// Auto register Element Plus components
// 主动导入 Element Plus 组件
ElementPlusResolver(),
// 主动注册图标组件
IconsResolver({
// prefix: 'i', // 默认前缀 i, false, 就可不是用前缀
// 实际上应用的时候,要加上 i-ep- 前缀,并举荐改成短横线命名
// <el-icon><i-ep-arrow-right-bold /></el-icon>
// {prefix}-{collection}-{icon}
// this is optional, default enabling all the collections supported by Iconify
enabledCollections: ['ep'] // element-plus 图标库
})
],
dts: path.resolve(pathSrc, 'components.d.ts'),
}),
Icons({
autoInstall: true,
// compiler: 'jsx', // or 'solid' 不知是不是与 <IconCarbonApps /> 无关
}),
],
resolve: {
alias: {'@': fileURLToPath(new URL('./src', import.meta.url)) // resolve(__dirname, 'src'),
}
},
css: {
preprocessorOptions: {
scss: {additionalData: '@use"src/assets/styles/element/index.scss"as *;',},
},
postcss: {
plugins: [
postCssPxToRem({
rootValue: 64, // 1rem 的大小
propList: ['*'], // 须要转换的属性,这里抉择全副都进行转换
})
]
},
},
})
二、通过 CSS 变量设置
element 用 css 变量重构了简直所有组件的款式零碎。
它兼容 SCSS 变量零碎。element 应用 SCSS 的函数主动生成须要用到的 css 变量。
能够动静地扭转组件内的个别变量,以便更好地自定义组件款式,而不须要批改 SCSS 文件从新编译一次。
之后,每个组件的 css 变量名称和作用将被写入到对应的组件文档中。
就像这样:
:root {--el-color-primary: green;}
如果只想自定义一个特定的组件,只需为某些组件独自增加内联款式。
<el-tag style="--el-tag-bg-color: red">Tag</el-tag>
出于性能起因,更加举荐在类名下增加自定义 css 变量,而不是在全局的 :root 下。
.custom-class {--el-tag-bg-color: red;}
如果您想要通过 js 管制 css 变量,能够这样做:
// document.documentElement 是全局变量时
const el = document.documentElement
// const el = document.getElementById('xxx')
// 获取 css 变量
getComputedStyle(el).getPropertyValue(`--el-color-primary`)
// 设置 css 变量
el.style.setProperty('--el-color-primary', 'red')
比方:批改按钮字体色彩
.el-button--primary {--el-button-text-color: var(--el-color-success);
// --el-button-text-color: #00ff00;
}