更换主题

项目主题色

项目的大部分组件都是 Element 组件,所以 Element 的主题色就是项目主题色了。

但我们自定义的元素怎么使用主色调呢?很简单,我们使用全局样式变量就好。请参考样式-全局变量

更换项目主题色,执行以下步骤即可:

  • 更换 Element 主题色
  • 修改全局样式变量

更换 Element 主题色

推荐使用在线主题生成工具。支持在线预览和直接下载。

将下载好的主题改名为 theme-chalk,然后替换掉 @/assets/css/theme-chalk 即可。

因为在 /main.js 已默认引入主题文件。

import '@/assets/css/theme-chalk/index.css' // 自定义主题颜色

更高级的自定义,请前往 Element 文档

修改全局样式变量

打开 @/assets/css/index.styl 文件,修改 $appColor$appColorRGB 变量。

动态主题色

本项目实现了在线主题生成工具的动态切换主题色的功能。

代码:@/components/ThemePicker。实现原理:

获取项目的主题色 theme

// /store/index.js
// 利用 vuex 管理当前主色调
import variables from '@/assets/css/index.styl'
const state = {
    theme: variables.appColor
}

// @/components/ThemePicker
data() {
    return {
        theme: this.$store.state.theme
    }
}

然后 watch theme,在回调中执行初始化方法。

watch: {
    theme(newVal, oldVal) {
        this.init_theme(newVal, oldVal)
    }
}

初始化方法执行步骤:

  • 通过颜色转换,得出新旧主题色的集合。
  • 获取所有 style 标签,然后过滤。
  • 通过正则,将新的主题色集合替换掉旧的主题色集合。
  • 获取 app.css 文件的内容,同样执行替换,然后创建新的style标签,push到页面上覆盖原来的样式。

获取 app.css 是因为项目打包后,大部分的css都压缩进 app.css

TIP

懒加载的资源未加载时,无法进行动态切换。因为懒加载资源的自身css样式都是加载后才添加的,可以到 <head> 里查看新增的 <style>

解决方案:使用初始化就加载的 class 类名。如 Element 样式都是一开始就全部加载。或者使用 vuex 管理的 theme,如: 401、404页面的背景色。