vue3 - Element Plus 切換主題色及el-button hover顏色不生效的解決方法

GitHub Demo 地址

在線預(yù)覽

Element Plus 自定義主題官方文檔

如果您想要通過 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)}`)
  }
}

效果圖

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容