Vue3 + Element Plus 后台管理项目实现动态切换主题色

首先定义一个全局方法,根据用户选择的颜色进行设置

const setColor = (
  key: string,
  value: any,
  dom = document.documentElement
): void => {
  dom.style.setProperty(key, value);
};
//执行
setColor("--el-color-primary", "#ff0000");//即可改变主题颜色 

只进行如上设置如出现 hover 与主题色不一致问题,此时还需要增配置颜色

setColor("--el-color-primary-light-9", "#ff0000");
setColor("--el-color-primary-light-3", "#ff0000");
//此时 hover 效果会消失

解决 hover 消失问题

//十六进制格式转 RGB 格式
const hex2Rgb = (color: string): number[] => {
  const colors = color.replace("#", "").match(/../g) || ["0"];
  const result = [];
  for (let i = 0; i < 3; i++) {
    result[i] = parseInt(colors[i], 16);
  }
  return result;
};

//RGB 格式转十六进制格式
const rgb2Hex = (r: number, g: number, b: number): string => {
  const 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];
    }
  }
  const result = "#" + hexs.join("");
  return result;
};

//使颜色变亮
const lighten = (color: string, level: number): string => {
  const rgb = hex2Rgb(color);
  for (let i = 0; i < 3; i++) {
    rgb[i] = Math.floor((255 - rgb[i]) * level + rgb[i]);
  }
  const result = rgb2Hex(rgb[0], rgb[1], rgb[2]);
  return result;
};

//使颜色变暗
const darken = (color: string, level: number): string => {
  const rgb = hex2Rgb(color);
  for (let i = 0; i < 3; i++) {
    rgb[i] = Math.floor(rgb[i] * (1 - level));
  }
  const result = rgb2Hex(rgb[0], rgb[1], rgb[2]);
  return result;
};
  
const setThemeColor = (color:string):void => {
  setColor("--el-color-primary", color);
  setColor("--el-color-primary-light-9", darken(color, 0.9));
  setColor("--el-color-primary-light-3", lighten(color,0.3));
};

完整代码

<template>
	<div>
		<el-button @click="setThemeColor('#56AB2F')" type="primary">
			SET #56AB2F
		</el-button>
		<el-button @click="setThemeColor('#ff0000')" type="primary">
			SET #FF0000
		</el-button>
	</div>
</template>

<script setup lang="ts">
//设置主题色
const setColor = (
  key: string,
  value: any,
  dom = document.documentElement
): void => {
  dom.style.setProperty(key, value);
};

//十六进制格式转 RGB 格式
const hex2Rgb = (color: string): number[] => {
  const colors = color.replace("#", "").match(/../g) as string[];
  const result = [];
  for (let i = 0; i < 3; i++) {
    result[i] = parseInt(colors[i], 16);
  }
  return result;
};

//RGB 格式转十六进制格式
const rgb2Hex = (r: number, g: number, b: number): string => {
  const 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];
    }
  }
  const result = "#" + hexs.join("");
  return result;
};

//使颜色变亮
const lighten = (color: string, level: number): string => {
  const rgb = hex2Rgb(color);
  for (let i = 0; i < 3; i++) {
    rgb[i] = Math.floor((255 - rgb[i]) * level + rgb[i]);
  }
  const result = rgb2Hex(rgb[0], rgb[1], rgb[2]);
  return result;
};

//使颜色变暗
const darken = (color: string, level: number): string => {
  const rgb = hex2Rgb(color);
  for (let i = 0; i < 3; i++) {
    rgb[i] = Math.floor(rgb[i] * (1 - level));
  }
  const result = rgb2Hex(rgb[0], rgb[1], rgb[2]);
  return result;
};
  
const setThemeColor = (color:string):void => {
  setColor("--el-color-primary", color);
  setColor("--el-color-primary-light-9", darken(color, 0.9));
  setColor("--el-color-primary-light-3", lighten(color,0.3));
};
</script>
  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

幼儿园里横走着

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值