GitHub Demo 地址
在線預(yù)覽
如果您想要通過 js 控制 css 變量,可以這樣做:
// document.documentElement 是全局變量時(shí)
const el = document.documentElement
// const el = document.getElementById('xxx')
// 獲取 css 變量
getComputedStyle(el).getPropertyValue(`--el-color-primary`)
// 設(shè)置 css 變量
el.style.setProperty('--el-color-primary', 'red')
按文檔中設(shè)置大部分顏色也會(huì)根據(jù)設(shè)置的顏色改變,但是有部分顏色不生效,比如按鈕hover時(shí)的顏色還是默認(rèn)的顏色。這是因?yàn)橹黝}色由以下圖片的顏色決定的,要修改下面所有的顏色才行

具體實(shí)現(xiàn)
新建theme.ts工具類
import { ElMessage } from 'element-plus'
/**
* 顏色轉(zhuǎn)換函數(shù)
* @method hexToRgb hex 顏色轉(zhuǎn) rgb 顏色
* @method rgbToHex rgb 顏色轉(zhuǎn) Hex 顏色
* @method getDarkColor 加深顏色值
* @method getLightColor 變淺顏色值
*/
export function useChangeColor() {
// str 顏色值字符串
const hexToRgb = (str: string): any => {
let hexs: any = ''
let reg = /^\#?[0-9A-Fa-f]{6}$/
if (!reg.test(str)) {
ElMessage.warning('輸入錯(cuò)誤的hex')
return ''
}
str = str.replace('#', '')
hexs = str.match(/../g)
for (let i = 0; i < 3; i++) hexs[i] = parseInt(hexs[i], 16)
return hexs
}
// r 代表紅色 | g 代表綠色 | b 代表藍(lán)色
const rgbToHex = (r: any, g: any, b: any): string => {
let reg = /^\d{1,3}$/
if (!reg.test(r) || !reg.test(g) || !reg.test(b)) {
ElMessage.warning('輸入錯(cuò)誤的rgb顏色值')
return ''
}
let hexs = [r.toString(16), g.toString(16), b.toString(16)]
for (let i = 0; i < 3; i++) if (hexs[i].length == 1) hexs[i] = `0${hexs[i]}`
return `#${hexs.join('')}`
}
// color 顏色值字符串 | level 變淺的程度,限0-1之間
const getDarkColor = (color: string, level: number): string => {
let reg = /^\#?[0-9A-Fa-f]{6}$/
if (!reg.test(color)) {
ElMessage.warning('輸入錯(cuò)誤的hex顏色值')
return ''
}
let rgb = useChangeColor().hexToRgb(color)
for (let i = 0; i < 3; i++) rgb[i] = Math.floor(rgb[i] * (1 - level))
return useChangeColor().rgbToHex(rgb[0], rgb[1], rgb[2])
}
// color 顏色值字符串 | level 加深的程度,限0-1之間
const getLightColor = (color: string, level: number): string => {
let reg = /^\#?[0-9A-Fa-f]{6}$/
if (!reg.test(color)) {
ElMessage.warning('輸入錯(cuò)誤的hex顏色值')
return ''
}
let rgb = useChangeColor().hexToRgb(color)
for (let i = 0; i < 3; i++) rgb[i] = Math.floor((255 - rgb[i]) * level + rgb[i])
return useChangeColor().rgbToHex(rgb[0], rgb[1], rgb[2])
}
return {
hexToRgb,
rgbToHex,
getDarkColor,
getLightColor
}
}
然后在需要切換顏色的地方調(diào)用
import { useChangeColor } from '@/utils/theme'
const { getLightColor, getDarkColor } = useChangeColor()
/**
* 切換主題顏色
*/
function changeThemeColor(color: string) {
document.documentElement.style.setProperty('--el-color-primary', color)
document.documentElement.style.setProperty('--el-color-primary-dark-2', `${getDarkColor(color, 0.1)}`)
for (let i = 1; i <= 9; i++) {
document.documentElement.style.setProperty(`--el-color-primary-light-${i}`, `${getLightColor(color, i / 10)}`)
}
}
效果圖

