自定义 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);特别注意
颜色列表要一一对应,不然会出现颜色错乱的现象!
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号