theme.ts 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. import { ElMessage } from 'element-plus'
  2. /**
  3. * 颜色转换函数
  4. * @method hexToRgb hex 颜色转 rgb 颜色
  5. * @method rgbToHex rgb 颜色转 Hex 颜色
  6. * @method getDarkColor 加深颜色值
  7. * @method getLightColor 变浅颜色值
  8. */
  9. function useChangeColor() {
  10. // str 颜色值字符串
  11. const hexToRgb = (str: string): any => {
  12. let hexs: any = ''
  13. let reg = /^\#?[0-9A-Fa-f]{6}$/
  14. if (!reg.test(str)) {
  15. ElMessage.warning('输入错误的hex')
  16. return ''
  17. }
  18. str = str.replace('#', '')
  19. hexs = str.match(/../g)
  20. for (let i = 0; i < 3; i++) hexs[i] = parseInt(hexs[i], 16)
  21. return hexs
  22. }
  23. // r 代表红色 | g 代表绿色 | b 代表蓝色
  24. const rgbToHex = (r: any, g: any, b: any): string => {
  25. let reg = /^\d{1,3}$/
  26. if (!reg.test(r) || !reg.test(g) || !reg.test(b)) {
  27. ElMessage.warning('输入错误的rgb颜色值')
  28. return ''
  29. }
  30. let hexs = [r.toString(16), g.toString(16), b.toString(16)]
  31. for (let i = 0; i < 3; i++) if (hexs[i].length == 1) hexs[i] = `0${hexs[i]}`
  32. return `#${hexs.join('')}`
  33. }
  34. // color 颜色值字符串 | level 变浅的程度,限0-1之间
  35. const getDarkColor = (color: string, level: number): string => {
  36. let reg = /^\#?[0-9A-Fa-f]{6}$/
  37. if (!reg.test(color)) {
  38. ElMessage.warning('输入错误的hex颜色值')
  39. return ''
  40. }
  41. let rgb = useChangeColor().hexToRgb(color)
  42. for (let i = 0; i < 3; i++) rgb[i] = Math.floor(rgb[i] * (1 - level))
  43. return useChangeColor().rgbToHex(rgb[0], rgb[1], rgb[2])
  44. }
  45. // color 颜色值字符串 | level 加深的程度,限0-1之间
  46. const getLightColor = (color: string, level: number): string => {
  47. let reg = /^\#?[0-9A-Fa-f]{6}$/
  48. if (!reg.test(color)) {
  49. ElMessage.warning('输入错误的hex颜色值')
  50. return ''
  51. }
  52. let rgb = useChangeColor().hexToRgb(color)
  53. for (let i = 0; i < 3; i++) rgb[i] = Math.floor((255 - rgb[i]) * level + rgb[i])
  54. return useChangeColor().rgbToHex(rgb[0], rgb[1], rgb[2])
  55. }
  56. return {
  57. hexToRgb,
  58. rgbToHex,
  59. getDarkColor,
  60. getLightColor
  61. }
  62. }
  63. export const changeThemeColor = (color: string) => {
  64. const { getLightColor, getDarkColor } = useChangeColor();
  65. document.documentElement.style.setProperty('--el-color-primary', color)
  66. document.documentElement.style.setProperty('--el-color-primary-dark-2', `${getDarkColor(color, 0.1)}`)
  67. for (let i = 1; i <= 9; i++) {
  68. document.documentElement.style.setProperty(`--el-color-primary-light-${i}`, `${getLightColor(color, i / 10)}`)
  69. }
  70. }