自定义 element-ui 的主题
前言
项目采用的是 vue-admin-template 框架搭建的,因为常年用 react 开发不是很熟悉,还在慢慢摸索呢,就很突然接到一个需求说要动态修改主题色,然后疯狂的上网查询......
1、使用全局样式覆盖(做到一半放弃了,这就不是人干的事!😭)
2、使用官方提供的在线主题编辑器下载后进行替换(编译后无法修改)
3、通过改变 element-ui 的样式变量(无法将变量通过js传入)
先创建一个 element-variables.scss 的文件,内容如下:
/* 改变主题色变量 */
$--color-primary: teal;
/* 改变 icon 字体路径变量,必需 */
$--font-path: '~element-ui/lib/theme-chalk/fonts';
@import "~element-ui/packages/theme-chalk/src/index";
在项目的入口文件 main.js 中,直接引入以上样式文件即可(无需引入 Element 编译好的 CSS 文件):
import Vue from 'vue'
import Element from 'element-ui'
import './element-variables.scss'
Vue.use(Element)
但是上面的方案都无法满足编译后修改element-ui主题,最终找到webpack-theme-color-replacer解决。
步骤一
安装 webpack-theme-color-replacer
npm install --save webpack-theme-color-replacer@1.3.22(安装最新版本会报错,暂未找到解决方案)
步骤二
在 vue.config.js 中进行配置
chainWebpack: config => {
// 自定义换肤
config.plugin('webpack-theme-color-replacer')
.use(ThemeColorReplacer)
.tap(options => {
const matchColors = []
// 官网默认主题的5种按钮颜色
const data = ['#409EFF', '#67C23A', '#E6A23C', '#F56C6C', '#909399']
data.forEach(item => {
matchColors.push(...forElementUI.getElementUISeries(item))
})
options[0] = {
fileName: 'css/theme-colors-[contenthash:8].css',
matchColors: matchColors,
changeSelector: forElementUI.changeSelector,
isJsUgly: process.env.NODE_ENV !== 'development'
}
return options
})
}
步骤三
新建一个 themeColor.js 文件用来初始化和切换主题色
import client from 'webpack-theme-color-replacer/client';
import forElementUI from 'webpack-theme-color-replacer/forElementUI';
// 动态切换主题色
export function changeThemeColor(colorList) {
const data = [];
try {
const list = JSON.parse(window.localStorage.getItem('color'));
list.forEach(item => {
data.push(...forElementUI.getElementUISeries(item));
})
}catch {
colorList.forEach(item => {
data.push(...forElementUI.getElementUISeries(item));
})
}
return client.changer.changeColor({ newColor: data }, Promise);
}
export function initThemeColor() {
changeThemeColor(['#409EFF','#67C23A','#E6A23C', '#F56C6C', '#909399'])
}
步骤四
在 main.js 文件中引用 initThemeColor 的方法
import Vue from 'vue';
import ELEMENT from 'element-ui';
import { initThemeColor } from './component/themeColor.js';
initThemeColor();
Vue.use(ELEMENT);
特别注意
颜色列表要一一对应,不然会出现颜色错乱的现象!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)