赞
踩
场景
elementPlus默认的颜色是
#409eff
下面这种蓝色
但项目要求的是
#06b0b2
下面这种颜色
解决方案有以下几种
CSS 变量
是一个非常有用的功能,几乎所有浏览器都支持。 (IE
:啊这?)element用 css 变量
来重构了几乎所有组件的样式系统。它兼容
SCSS
变量系统。 使用SCSS
的函数自动生成需要用到的css
变量。
所以可以动态地改变组件内的个别变量,以便更好地自定义组件样式,而不需要修改 SCSS 文件重新编译一次。
可以利用这一点直接在App.vue
:root {
--el-color-primary: #06b0b2;
...
}
需要注意的是 element官方并不推荐直接写到全局的
:root
这种做法会存在一些性能问题。
那么我们可以
#app {
--el-color-primary: #06b0b2;
...
}
也可以通过 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', '#06b0b2')
可以观察到 对于颜色的css变量,element
有个逐渐变浅的处理,但是如果我们使用css变量去设置主题的话那就意味着我们对于这些也是需要一层一层去设置的。
效果可以做到但是会产生很多不必要的代码
$colors: () !default; $colors: map.deep-merge( ( 'white': #ffffff, 'black': #000000, 'primary': ( 'base': #409eff, ), 'success': ( 'base': #67c23a, ), 'warning': ( 'base': #e6a23c, ), 'danger': ( 'base': #f56c6c, ), 'error': ( 'base': #f56c6c, ), 'info': ( 'base': #909399, ), ), $colors );
styles/element/index.scss
:// styles/element/index.scss
/* 只需要重写你需要的即可 */
$--color-primary: #06B0B2;
@forward 'element-plus/theme-chalk/src/common/var.scss' with (
$colors: (
'primary': (
'base': $--color-primary,
),
),
);
// 如果只是按需导入,则可以忽略以下内容。
// 如果你想导入所有样式:
// @use "element-plus/theme-chalk/src/index.scss" as *;
项目是webpack
时:
//vue.config.js / vue.config.ts
//关于plugin的就是看自己项目就好
css: {
loaderOptions: {
scss: {
additionalData: `@use "~/styles/element/index.scss" as *;`,
},
},
},
项目是vite
时:
使用 scss.additionalData 来编译所有应用 scss 变量的组件。
import path from 'path' import { defineConfig } from 'vite' import vue from '@vitejs/plugin-vue' // 你也可以使用 unplugin-vue-components // import Components from 'unplugin-vue-components/vite' // import { ElementPlusResolver } from 'unplugin-vue-components/resolvers' // 或者使用 unplugin-element-plus import ElementPlus from 'unplugin-element-plus/vite' // vite.config.ts export default defineConfig({ resolve: { alias: { '~/': `${path.resolve(__dirname, 'src')}/`, }, }, //比较关键的依旧是这段 css: { preprocessorOptions: { scss: { additionalData: `@use "~/styles/element/index.scss" as *;`, }, }, }, plugins: [ vue(), // use unplugin-vue-components // Components({ // resolvers: [ // ElementPlusResolver({ // importStyle: "sass", // // directives: true, // // version: "2.1.5", // }), // ], // }), // 或者使用 unplugin-element-plus ElementPlus({ useSource: true, }), ], })
之所以用
@use 'xxx.scss' as *
而不是@import 'xxx.scss'
是因为sass
团队说他们最终会删除@import
语法。
Sass: @use
Sass: @import
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。