mirror of
https://gitee.com/myxzgzs/boyue-ui-admin-vue3
synced 2025-08-08 08:22:41 +08:00
fix: #64 修复切换主题后hover颜色未变,以及主题色和辅助色的rgb变量未变化的问题
This commit is contained in:
parent
6289bbd3e1
commit
1613370080
@ -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 { CACHE_KEY, useCache } from '@/hooks/web/useCache'
|
||||||
import { ElementPlusSize } from '@/types/elementPlus'
|
import { ElementPlusSize } from '@/types/elementPlus'
|
||||||
import { LayoutType } from '@/types/layout'
|
import { LayoutType } from '@/types/layout'
|
||||||
import { ThemeTypes } from '@/types/theme'
|
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()
|
const { wsCache } = useCache()
|
||||||
|
|
||||||
@ -183,6 +184,40 @@ export const useAppStore = defineStore('app', {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
actions: {
|
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) {
|
setBreadcrumb(breadcrumb: boolean) {
|
||||||
this.breadcrumb = breadcrumb
|
this.breadcrumb = breadcrumb
|
||||||
},
|
},
|
||||||
@ -256,6 +291,7 @@ export const useAppStore = defineStore('app', {
|
|||||||
document.documentElement.classList.remove('dark')
|
document.documentElement.classList.remove('dark')
|
||||||
}
|
}
|
||||||
wsCache.set(CACHE_KEY.IS_DARK, this.isDark)
|
wsCache.set(CACHE_KEY.IS_DARK, this.isDark)
|
||||||
|
this.setPrimaryLight()
|
||||||
},
|
},
|
||||||
setCurrentSize(currentSize: ElementPlusSize) {
|
setCurrentSize(currentSize: ElementPlusSize) {
|
||||||
this.currentSize = currentSize
|
this.currentSize = currentSize
|
||||||
@ -272,6 +308,7 @@ export const useAppStore = defineStore('app', {
|
|||||||
for (const key in this.theme) {
|
for (const key in this.theme) {
|
||||||
setCssVar(`--${humpToUnderline(key)}`, this.theme[key])
|
setCssVar(`--${humpToUnderline(key)}`, this.theme[key])
|
||||||
}
|
}
|
||||||
|
this.setPrimaryLight()
|
||||||
},
|
},
|
||||||
setFooter(footer: boolean) {
|
setFooter(footer: boolean) {
|
||||||
this.footer = footer
|
this.footer = footer
|
||||||
|
@ -172,3 +172,46 @@ export const PREDEFINE_COLORS = [
|
|||||||
'#1f73c3',
|
'#1f73c3',
|
||||||
'#711f57'
|
'#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 ''
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user