fix: #64 修复切换主题后hover颜色未变,以及主题色和辅助色的rgb变量未变化的问题

This commit is contained in:
hqzh 2025-05-06 17:53:35 +08:00
parent 6289bbd3e1
commit 1613370080
2 changed files with 84 additions and 4 deletions

View File

@ -1,11 +1,12 @@
import { defineStore } from 'pinia'
import { store } from '../index'
import { humpToUnderline, setCssVar } from '@/utils'
import { ElMessage } from 'element-plus'
import { CACHE_KEY, useCache } from '@/hooks/web/useCache'
import { ElementPlusSize } from '@/types/elementPlus'
import { LayoutType } from '@/types/layout'
import { ThemeTypes } from '@/types/theme'
import { humpToUnderline, setCssVar } from '@/utils'
import { getCssColorVariable, hexToRGB, mix } from '@/utils/color'
import { ElMessage } from 'element-plus'
import { defineStore } from 'pinia'
import { store } from '../index'
const { wsCache } = useCache()
@ -183,6 +184,40 @@ export const useAppStore = defineStore('app', {
}
},
actions: {
setPrimaryLight() {
if (this.theme.elColorPrimary) {
const elColorPrimary = this.theme.elColorPrimary
const color = this.isDark ? '#000000' : '#ffffff'
const lightList = [3, 5, 7, 8, 9]
lightList.forEach((v) => {
setCssVar(`--el-color-primary-light-${v}`, mix(color, elColorPrimary, v / 10))
})
setCssVar(`--el-color-primary-dark-2`, mix(color, elColorPrimary, 0.2))
this.setAllColorRgbVars()
}
},
// 处理element自带的主题色和辅助色的-rgb切换主题变化--el-color-primary-rgb
setAllColorRgbVars() {
// 需要处理的颜色类型列表
const colorTypes = ['primary', 'success', 'warning', 'danger', 'error', 'info']
colorTypes.forEach((type) => {
// 获取当前颜色值
const colorValue = getCssColorVariable(`--el-color-${type}`)
if (colorValue) {
// 转换为rgba并提取RGB部分
const rgbaString = hexToRGB(colorValue, 1)
const rgbValues = rgbaString.match(/rgba?\((\d+),\s*(\d+),\s*(\d+)/i)
if (rgbValues) {
const [, r, g, b] = rgbValues
// 设置对应的RGB变量
setCssVar(`--el-color-${type}-rgb`, `${r}, ${g}, ${b}`)
}
}
})
},
setBreadcrumb(breadcrumb: boolean) {
this.breadcrumb = breadcrumb
},
@ -256,6 +291,7 @@ export const useAppStore = defineStore('app', {
document.documentElement.classList.remove('dark')
}
wsCache.set(CACHE_KEY.IS_DARK, this.isDark)
this.setPrimaryLight()
},
setCurrentSize(currentSize: ElementPlusSize) {
this.currentSize = currentSize
@ -272,6 +308,7 @@ export const useAppStore = defineStore('app', {
for (const key in this.theme) {
setCssVar(`--${humpToUnderline(key)}`, this.theme[key])
}
this.setPrimaryLight()
},
setFooter(footer: boolean) {
this.footer = footer

View File

@ -172,3 +172,46 @@ export const PREDEFINE_COLORS = [
'#1f73c3',
'#711f57'
]
/**
* Mixes two colors.
*
* @param {string} color1 - The first color, should be a 6-digit hexadecimal color code starting with `#`.
* @param {string} color2 - The second color, should be a 6-digit hexadecimal color code starting with `#`.
* @param {number} [weight=0.5] - The weight of color1 in the mix, should be a number between 0 and 1, where 0 represents 100% of color2, and 1 represents 100% of color1.
* @returns {string} The mixed color, a 6-digit hexadecimal color code starting with `#`.
*/
export const mix = (color1: string, color2: string, weight: number = 0.5): string => {
let color = '#'
for (let i = 0; i <= 2; i++) {
const c1 = parseInt(color1.substring(1 + i * 2, 3 + i * 2), 16)
const c2 = parseInt(color2.substring(1 + i * 2, 3 + i * 2), 16)
const c = Math.round(c1 * weight + c2 * (1 - weight))
color += c.toString(16).padStart(2, '0')
}
return color
}
/**
* getCssColorVariable
* @description css变量的颜色值
* @param colorVariable css变量名
* @param opacity
* @returns {string}
* @example getCssColorVariable('--el-color-primary', 0.5)
* @example getCssColorVariable('--el-color-primary')
* @example getCssColorVariable()
*/
export const getCssColorVariable = (
colorVariable: string = '--el-color-primary',
opacity?: number
) => {
const colorValue = getComputedStyle(document.documentElement)
.getPropertyValue(colorVariable)
.trim()
if (colorValue) {
return opacity ? hexToRGB(colorValue, opacity) : colorValue
}
return ''
}