vue3 - Element Plus 切换主题色及el-button hover颜色不生效的解决方法

vue3 - Element Plus 切换主题色及el-button hover颜色不生效的解决方法

GitHub Demo 地址
https://github.com/iotjin/jh-vue3-admin
在线预览
https://iotjin.github.io/jh-vue3-admin/

如果您想要通过 js 控制 css 变量,可以这样做:
// document.documentElement 是全局变量时
const el = document.documentElement
// const el = document.getElementById('xxx')

// 获取 css 变量
getComputedStyle(el).getPropertyValue(`--el-color-primary`)

// 设置 css 变量
el.style.setProperty('--el-color-primary', 'red')

按文档中设置大部分颜色也会根据设置的颜色改变,但是有部分颜色不生效,比如按钮hover时的颜色还是默认的颜色。这是因为主题色由以下图片的颜色决定的,要修改下面所有的颜色才行

在这里插入图片描述

具体实现

新建theme.ts工具类

import { ElMessage } from 'element-plus'

/**
 * 颜色转换函数
 * @method hexToRgb hex 颜色转 rgb 颜色
 * @method rgbToHex rgb 颜色转 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('输入错误的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 代表蓝色
  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('输入错误的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('输入错误的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('输入错误的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
  }
}

然后在需要切换颜色的地方调用

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)}`)
  }
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/294148.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【InnoDB数据存储结构】第3章节:区、段、碎片区和表空间

文章目录结构 区、段、碎片区和表空间 什么是区&#xff1f;什么是段&#xff1f;什么是碎片区&#xff1f;什么是表空间&#xff1f; 在上文 InooDB 存储行格式一文中已经大致讲述过&#xff0c;再来回顾一下&#xff0c;直接上图&#xff1a; 名词解释如下&#xff1a; 行…

go构建项目与打包

环境搭建 使用的组件及版本 operator-sdk v1.22.0go 1.20.0 linux/amd64git 1.8.3.1k8s 1.18.5docker 20.10.5 前期配置 安装Git yum install git安装docker yum install docker-ce安装go 官网下载 tar -C /usr/local/ -xvf go1.20.linux-amd64.tar.gz 环境配置 // 将go配置…

【tensorflowflutter】自己写个机器学习模型用在项目上?

背景 拍摄APP项目上线有一阵了&#xff0c;每天的拍摄数据呈现波动上升状态、业务方需要对数据进行加工&#xff0c;如果能有对未来的数据量的预测就好了 。 目标 在端侧展示拍摄数据可视化趋势图等、并能推断数据&#xff08;选择预测日期&#xff09; 简单实现个demo gif背…

uniapp自定义顶部导航并解决打包成apk后getMenuButtonBoundingClientRect方法失效问题

需求&#xff1a;要在app上的顶部导航提示哪里添加一些东西进去&#xff0c;用uniapp自带的肯定不行啊&#xff0c;所以自定义了所有的页面的顶部导航&#xff0c;之后自定义后用手机调试发现 uni.getMenuButtonBoundingClientRect()这个方法的top获取不到....网上找了很多种方…

服务注册中心

服务注册中心 注册中心与CAP理论介绍 1.注册中心 服务注册中心是微服务架构中的一个关键组件&#xff0c;它的主要作用是管理服务实例的注册、维护和发现。 是一个中心化的组件来分散的微服务实例的位置和状态。 注册中心有三种角色构成&#xff1a; 服务提供者&#xff1a…

每周一算法:倍增法求最近公共祖先(LCA)

最近公共祖先 最近公共祖先简称 LCA&#xff08;Lowest Common Ancestor&#xff09;。两个节点的最近公共祖先&#xff0c;就是这两个点的公共祖先里面&#xff0c;离根最远的那个。 题目链接 祖孙询问 题目描述 给定一棵包含 n n n 个节点的有根无向树&#xff0c;节点…

知虾shopee数据:为卖家提供了丰富的数据分析工具

使用Shopee的卖家都知道&#xff0c;这个平台为卖家提供了丰富的数据分析工具&#xff0c;帮助他们更好地理解店铺运营状况和市场趋势。这些数据分析工具不仅能够提供数据总览&#xff0c;还包括买家分析、商品排名、分类排名、销售辅导、流量分析、销售结构、行销活动、聊天响…

SpringCloud Alibaba之Nacos配置中心配置详解

目录 Nacos配置中心数据模型Nacos配置文件加载Nacos配置 Nacos配置中心数据模型 Nacos 数据模型 Key 由三元组唯一确定&#xff0c;三元组分别是Namespace、Group、DataId&#xff0c;Namespace默认是公共命名空间&#xff08;public&#xff09;&#xff0c;分组默认是 DEFAUL…

聚类分析 | Matlab实现基于RIME-DBSCAN的数据聚类可视化

聚类分析 | Matlab实现基于RIME-DBSCAN的数据聚类可视化 目录 聚类分析 | Matlab实现基于RIME-DBSCAN的数据聚类可视化效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.聚类分析 | Matlab实现基于RIME-DBSCAN的数据聚类可视化&#xff08;完整源码和数据) 2.多特征输入&…

HarmonyOS 应用开发学习笔记 状态管理概述

移动端开发&#xff0c;最重要的一点就是数据的处理&#xff0c;并且正确的显示渲染UI。 变量在页面和组件、组件和组件之间有时候并不能实时共享&#xff0c;而有时候&#xff0c;又不需要太多的作用域&#xff08;节省资源&#xff09;&#xff0c;作用就需要根据不同场景&am…

MQ 发消息的4种姿势

微服务开发中经常会使用消息队列进行跨服务通信。在一个典型场景中,服务A执行一个业务逻辑,需要保存数据库,然后通知服务B执行相应的业务逻辑。在这种场景下,我们需要考虑如何发送消息。 1. 基础版 首先,我们可能会考虑将数据库操作和消息发送放在同一个事务中,以下是伪…

深度学习笔记

激活函数 激活函数可以让神经网引入非线性性质&#xff0c;去除线性相关特征映射&#xff0c;是网络捕获数据中的不同特征&#xff1b;relu max&#xff08;0&#xff0c;x&#xff09;输出为0到正无穷sigmod输出为0-1 形状为srelu 输出为-1-1 以0为中心&#xff0c;形状为s …

【STM32】STM32学习笔记-ADC模数转换器(21)

00. 目录 文章目录 00. 目录01. ADC简介02. ADC主要特征03. 逐次逼近型ADC04. ADC功能描述05. ADC基本结构06. 输入通道07. 转换模式08. 触发控制09. 数据对齐10. 转换时间11. 校准12. 硬件电路13. 附录 01. ADC简介 小容量产品是指闪存存储器容量在16K至32K字节之间的STM32F1…

再次拓宽信创生态版图,思迈特与统信软件完成产品兼容适配认证

近日&#xff0c;思迈特软件与统信软件科技有限公司&#xff08;简称“统信软件”&#xff09;完成产品兼容性适配互认证&#xff0c;加速国产信创生态化建设进程。 本次测试由商业智能与数据分析软件&#xff08;简称&#xff1a;Smartbi Insight V11&#xff09;产品与统信服…

AMEYA360分享:太阳诱电导电性高分子混合铝电解电容器

随着汽车电动化和电子控制化的进展&#xff0c;车载计算机和电气部件也在逐渐向大功率化的方向发展。而构成这些车载设备电源电路的电子元器件也必须随之进行技术革新。 太阳诱电集团携手全资子公司ELNA&#xff0c;开发并供应新型电容器“导电性高分子混合铝电解电容器”&…

农业银行RPA实践 3大典型案例分析

零接触开放金融服务在疫情之下被越来越多的银行和客户所认同&#xff0c;引起了更广泛的持续关注&#xff0c;各家银行纷纷开展产品服务创新&#xff0c;加速渠道迁移&#xff0c;同时通过远程办公、构建金融生态等方式积极推进零接触开放金融体系建设。 随着商业银行科技力量的…

JSP页面访问JDBC数据库的六个步骤

【例】创建exgample11_1.jsp页面&#xff0c;并在该页面中使用纯Java数据库驱动程序连接数据库test&#xff0c;并查询数据表goods中的数据。 <% page language"java" contentType"text/html;charsetUTF-8" pageEncoding"UTF-8"%> <% …

Flink窗口与WaterMark

本文目录 窗口的生命周期Window Assigners窗口函数&#xff08;Window Functions&#xff09;TriggersEvictorsAllowed Lateness 窗口 窗口&#xff08;Window&#xff09;是处理无界流的关键所在。窗口可以将数据流装入大小有限的“桶”中&#xff0c;再对每个“桶”加以处理。…

基于低代码的指尖遐想_3

低代码需要回答三个问题&#xff1a; 1、是否降低了门槛&#xff1f; 2、是否提高了效能&#xff1f; 3、使用者用户画像&#xff1f; 广义低代码&#xff0c;从项目全局维度&#xff08;项目启动、需求调研、方案设计、配置开发、系统验收、系统运营&#xff09;进行了解答。…

使用Termux+Hexo搭建个人博客结合内网穿透工具轻松实现公网访问内网博客

文章目录 前言 1.安装 Hexo2.安装cpolar3.远程访问4.固定公网地址 前言 Hexo 是一个用 Nodejs 编写的快速、简洁且高效的博客框架。Hexo 使用 Markdown 解析文章&#xff0c;在几秒内&#xff0c;即可利用靓丽的主题生成静态网页。 下面介绍在Termux中安装个人hexo博客并结合…