当前位置: 首页 > news >正文

【VUE】ElementPlus之动态主题色调切换(Vue3 + Element Plus+Scss + Pinia)

前言

关于ElementPlus的基础主题色自定义可以参阅《【VUE】ElementPlus之自定义主题样式和命名空间》

有了上面基础的了解,我们知道ElementPlus的主题色调是基于CSS3变量特性进行全局控制的,
那么接下来我们也基于CSS3变量来实现主题色调的动态切换效果;

主要控制的色调类型有:primarysuccesswarningdangererrorinfo
针对这六个色调类型分别进行035789级的渐变色定制

以下是默认情况下的主题颜色定义:

ElementPlus默认主题颜色

接下来,我们基于以下环境来实操下:

  • vue: ^3.3.4
  • vite: ^4.4.11
  • sass: ^1.58.3
  • element-plus: ^2.3.4
  • pinia: ^2.1.7

实现

默认主题色下的按钮组件色调:
在这里插入图片描述

预想效果:
在这里插入图片描述

在实现具体交互之前,我们先准备几个辅助小工具

颜色状态管理器

既然是动态切换,那么我们就需要一个容器来记录当下的一些色调信息,便于整体性的调整
以下仅抛个砖,具体业务调整根据自己需要来哈~

import { defineStore } from "pinia";
import ColorUnit from "@/unit/ColorUnit";export const useColorStore = defineStore("color", () => {function setThemeColor(colorMap) {let _namespace = "el";colorMap.forEach((colorItem) => {setPropertyColor(`--${_namespace}-color-${colorItem[0]}`, colorItem[1]);themeColorGradient(`--${_namespace}-color-${colorItem[0]}-light-#level#`,"lighten",colorItem[1]);setPropertyColor(`--${_namespace}-color-${colorItem[0]}-dark-2`,colorItem[1],"darken");// themeColorGradient(`--${_namespace}-color-${colorItem[0]}-dark-#level#`,"darken",colorItem[1]);});}/*** 将css3变量设置到document中方便全局调用*/function setPropertyColor(varName, color, funName, level) {level = level ? level : 0;funName = funName ? funName : "lighten";document.documentElement.style.setProperty(varName,ColorUnit[funName](color, level / 10));}/*** 生成主色的其余渐变色并修改对应CSS3变量值*/function themeColorGradient(varName, funName, themeColor, themeLevel) {themeColor = themeColor ? themeColor : '#409eff';themeLevel = themeLevel ? themeLevel : [3, 5, 7, 8, 9];themeLevel.forEach(function (level) {setPropertyColor(varName.replace("#level#", level),themeColor,funName,level);});}return {setThemeColor,};
});

颜色编码生成工具

根据前言描述,我们得知,需要根据一个十六进制的色值,生成其余的渐变色值出来,手动配置的话就太麻烦了
所以我们先来封装一个ColorUnit工具来辅助我们进行色调的配置

// file: src/unit/ColorUnit.js
// 代码载取来至:https://gitee.com/lolicode/scui/blob/master/src/utils/color.js
export default {//hex颜色转rgb颜色HexToRgb(str) {str = str.replace("#", "")var hxs = str.match(/../g)for (var i = 0; i < 3; i++) hxs[i] = parseInt(hxs[i], 16)return hxs},//rgb颜色转hex颜色RgbToHex(a, b, c) {var hexs = [a.toString(16), b.toString(16), c.toString(16)]for (var i = 0; i < 3; i++) {if (hexs[i].length == 1) hexs[i] = "0" + hexs[i]}return "#" + hexs.join("");},//加深darken(color, level) {var rgbc = this.HexToRgb(color)for (var i = 0; i < 3; i++) rgbc[i] = Math.floor(rgbc[i] * (1 - level))return this.RgbToHex(rgbc[0], rgbc[1], rgbc[2])},//变淡lighten(color, level) {var rgbc = this.HexToRgb(color)for (var i = 0; i < 3; i++) rgbc[i] = Math.floor((255 - rgbc[i]) * level + rgbc[i])return this.RgbToHex(rgbc[0], rgbc[1], rgbc[2])}
}

整合

有了上面俩个帮手,现在整合起来的具体应用

template部分

<template><main><el-row style="margin-bottom: 15px"><div class="demo-color-warp"><div class="demo-color-box" v-for="(item, key) in _theme" :key="key"@click="setThemeColor(item.color, item.label)":style="{'--color':item.color[0][1]}"><span class="demo-color__label">{{ item.label }}</span><span class="demo-color__value">{{ item.color[0][0] }}</span><span class="demo-color__value">{{ item.color[0][1] }}</span><ul class="demo-color__list"><template v-for="(colorItem, colorKey) in item.color" :key="colorKey"><li v-if="colorKey>0" :style="{'--color':colorItem[1]}">
<!--                <span>{{ colorItem[0] }}</span>-->
<!--                <span>{{ colorItem[1] }}</span>--></li></template></ul></div></div><span>当前主题:{{ themeName }}</span></el-row><el-row class="mb-4"><el-button>Default</el-button><el-button type="primary">Primary</el-button><el-button type="success">Success</el-button><el-button type="info">Info</el-button><el-button type="warning">Warning</el-button><el-button type="danger">Danger</el-button></el-row><el-row class="mb-4"><el-button plain>Plain</el-button><el-button type="primary" plain>Primary</el-button><el-button type="success" plain>Success</el-button><el-button type="info" plain>Info</el-button><el-button type="warning" plain>Warning</el-button><el-button type="danger" plain>Danger</el-button></el-row><el-row class="mb-4"><el-button round>Round</el-button><el-button type="primary" round>Primary</el-button><el-button type="success" round>Success</el-button><el-button type="info" round>Info</el-button><el-button type="warning" round>Warning</el-button><el-button type="danger" round>Danger</el-button></el-row><el-row><el-button :icon="Search" circle /><el-button type="primary" :icon="Edit" circle /><el-button type="success" :icon="Check" circle /><el-button type="info" :icon="Message" circle /><el-button type="warning" :icon="Star" circle /><el-button type="danger" :icon="Delete" circle /></el-row></main>
</template>

script部分

<script setup>
import {ref} from "vue"
import { useColorStore } from "@/stores/color";
// ...
const themeName = ref('默认主题');
const colorStore = useColorStore();
// ...
let _theme = [{label:'默认主题', color:[["primary", "#409EFF"], ["success", "#67C23A"], ["warning", "#E6A23C"], ["danger", "#F56C6C"], ["error", "#F56C6C"], ["info", "#909399"]]},{label:'自定义主题1', color:[["primary", "#1984f3"], ["success", "#55DE12"], ["warning", "#EA9412"], ["danger", "#E12020"], ["error", "#E12020"], ["info", "#209399"]]},{label:'自定义主题2', color:[["primary", "#0A4680"], ["success", "#276409"], ["warning", "#815410"], ["danger", "#931d1d"], ["error", "#931D1D"], ["info", "#454A55"]]},
];
// ...
function setThemeColor(colorMap, label) {themeName.value = label;colorStore.setThemeColor(colorMap);
}
// ...
</script>

相关文章:

【VUE】ElementPlus之动态主题色调切换(Vue3 + Element Plus+Scss + Pinia)

前言 关于ElementPlus的基础主题色自定义可以参阅《【VUE】ElementPlus之自定义主题样式和命名空间》 有了上面基础的了解&#xff0c;我们知道ElementPlus的主题色调是基于CSS3变量特性进行全局控制的&#xff0c; 那么接下来我们也基于CSS3变量来实现主题色调的动态切换效果&…...

MySQL数据库基本操作1

文章目录 主要内容一.DDL1.创建表代码如下&#xff08;示例&#xff09;: 2.创建表的类型3.其他操作4.修改表结构格式代码如下&#xff08;示例&#xff09;: 二.DML1.数据插入代码如下&#xff08;示例&#xff09;: 2.数据修改代码如下&#xff08;示例&#xff09;: 3.数据删…...

Webpack简介及打包演示

Webpack 是一个静态模块打包工具&#xff0c;从入口构建依赖图&#xff0c;打包有关的模块&#xff0c;最后用于展示你的内容 静态模块&#xff1a;编写代码过程中的&#xff0c;html&#xff0c;css&#xff0c; js&#xff0c;图片等固定内容的文件 打包过程&#xff0c;注…...

面向对象设计模式——命令模式

命令设计模式(Command Pattern)是一种行为型设计模式,它的主要目的是将请求或操作封装成一个对象,从而允许参数化客户端对象,队列请求,将请求记录到日志,以及支持可撤销的操作。命令模式将请求的发出者(调用者)与请求的接收者(执行者)解耦,这使得系统更加灵活、可扩…...

selenium测试框架快速搭建(ui自动化测试)

一、介绍 selenium目前主流的web自动化测试框架&#xff1b;支持多种编程语言Java、pythan、go、js等&#xff1b;selenium 提供一系列的api 供我们使用&#xff0c;因此在web测试时我们要点页面中的某一个按钮&#xff0c;那么我们只需要获取页面&#xff0c;然后根据id或者n…...

TypeScript中的类型映射

类型映射 1. 简介 映射就是将一种类型按照映射规则&#xff0c;转成另一种类型&#xff0c;通常用于对象类型。 这里类型B通过A采用属性名索引的写法&#xff0c;完成了类型B的定义 type A {foo: number;bar: number; };type B {[prop in keyof A]: string; };这里复制了一…...

系统平台同一网络下不同设备及进程数据通讯--DDS数据分发服务中间件

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录前言(1)中间件的介绍(2)DDS介绍(3)发布者(4)订阅者(5)idl文件(定义msg结构体)(6)QoS(Quality of Service)策略(7)DDS测试工具介绍(…...

golang小技巧

1/有时需要把json内容返回给前段进行文本编辑json字段&#xff0c;那么最好是能返回格式化后的json&#xff0c;这样对于用户编辑页方便。这时候可以利用json.MarshalIndent(data, "", "\t")来进行格式化&#xff0c;带有缩进的marshal。 2/对holders的填…...

JavaWeb——IDEA操作:Project最终新建module

在project中创建新的module&#xff1a; 创建一个新的module很容易&#xff0c;但是它可能连接不上Tomcat&#xff0c;因此需要修改一些配置&#xff1a; 将以下地址修改为新module的地址...

前端开发技术栈(工具篇):2023深入了解webpack的安装和使用以及核心概念和启动流程(详细) 63.3k stars

目录 Webpack简介 Entry Module Chunk Loader Plugin Output Webpack的启动流程 Webpack的优缺点 Webpack的使用 1. 安装Webpack 2. 创建Webpack配置文件 3. 编写代码 4. 运行Webpack 5. 在HTML中引入打包后的文件 6. 执行编译命令 Webpack其他功能介绍 1. 使…...

[SQL开发笔记]LIKE操作符:在 WHERE 子句中搜索列中的指定模式

一、功能描述&#xff1a; LIKE操作符&#xff1a;用于在 WHERE 子句中搜索列中的指定模式。 二、LIKE操作符语法详解&#xff1a; LIKE 语法 SELECT column1, column2,…FROM table_nameWHERE column LIKE pattern; 参数说明&#xff1a; &#xff08;1&#xff09;colum…...

flutter深研

https://www.douyin.com/video/7020336319058627853 关闭系统风扇 在 Windows 操作系统上安装和配置 Flutter 开发环境 - Flutter 中文文档 - Flutter 中文开发者网站 - Flutter...

TypeScript中的declare关键字

declare关键字 1. 简介 declare关键字用来告诉编译器&#xff0c;某个类型是存在的&#xff0c;可以在当前文件中使用。 作用&#xff1a;就是让当前文件可以使用其他文件声明的类型。比如&#xff0c;自己的脚本使用外部库定义的函数&#xff0c;编译器会因为不知道外部函数…...

玫瑰红葡萄酒的基本知识

在过去的几年里&#xff0c;玫瑰红葡萄酒越来越受欢迎&#xff0c;但是如果你是饮用玫瑰红葡萄酒的新手&#xff0c;你可能想知道它是如何从其他红葡萄酒或白葡萄酒中脱颖而出的。 玫瑰红具有标志性的粉色&#xff0c;很难归类&#xff0c;那它是更适合放在红酒类还是属于白酒…...

HTTP 协议参考文档

开发者Web协议文档&#xff1a; https://developer.mozilla.org/zh-CN/docs/Web 其中子节点包含 HTTP 协议内容&#xff1a; https://developer.mozilla.org/zh-CN/docs/Web/HTTP 其内容是基于 markdown 编写的&#xff0c;对应源文件在 Github 中&#xff0c;如下&#xf…...

Python遍历删除列表元素的一个奇怪bug

假定有一个Python列表&#xff0c;比如[CFFEX.IF, CFFEX.TS,SHFE.FU]&#xff0c;现在需要将其中带‘CFFEX’前缀的所有元素都删除。在使用列表推导式一行代码搞定之前&#xff0c;用了一种最朴素的遍历删除方法&#xff0c;结果出现了意想不到的的问题。复盘了下&#xff0c;结…...

Elasticsearch部署中的两大常见问题及其解决方案

随着大数据和实时搜索的日益普及&#xff0c;Elasticsearch已经成为现代应用中不可或缺的工具。但是&#xff0c;像所有软件一样&#xff0c;部署和配置Elasticsearch可能会遇到一些问题。本文将探讨两个我最近遇到的常见问题及其解决方案。 问题描述 1. 主机名解析问题 在启…...

【计网 CDN】计算机网络 CDN(Content Delivery Network)分布式网络架构详解:中科大郑烇老师笔记 (八)

目录 0 引言1 为什么需要分布式的网络架构&#xff1f;2 视频流化服务2.1 多媒体&#xff1a;视频2.2 存储视频的流化&#xff08;Streaming&#xff09;服务2.3 流媒体传输协议&#xff1a;DASH2.4 面临挑战&#xff1a;服务器如何向上百万用户同时提供视频流化内容&#xff1…...

C# 图解教程 第5版 —— 第9章 表达式和运算符

文章目录 9.1 表达式&#xff08;*&#xff09;9.2 字面量9.2.1 整数字面量9.2.2 实数字面量9.2.3 字符字面量9.2.4 字符串字面量 9.3 求值顺序9.3.1 优先级9.3.2 结合性 9.4 简单算术运算符9.5 求余运算符9.6 关系比较运算符和相等比较运算符9.7 递增运算符和递减运算符&#…...

TIA博途_Profinet通信故障诊断及常见错误解决方法汇总

TIA博途_Profinet通信故障诊断及常见错误解决方法汇总 1. 在线诊断报硬件组件的用户数据错误,设备组态不支持 解决方法: (1)检查模块终端盖板; (2)检查组态模块与实际组装模块顺序型号是否一致。 2. 网络视图,设备视图界面显示黑色感叹号 解决方法: PLC转离线,下载硬…...

Linux/C++多进程

给你最简洁、能直接用、新手一看就懂的 Linux C 多进程核心内容&#xff0c;不废话。1. 核心 API&#xff08;就这 3 个最常用&#xff09;fork()&#xff1a;创建子进程getpid()&#xff1a;获取当前进程 IDwait() / waitpid()&#xff1a;等待子进程结束&#xff0c;防止僵尸…...

基于 HT for Web 的机车整备场数字孪生系统技术实现

本文基于 HT for Web&#xff08;基于 WebGL/Canvas 的纯前端可视化插件&#xff09;构建机车整备场数字孪生三维可视化系统&#xff0c;通过轻量化三维建模、实时数据对接、前端 API 驱动渲染&#xff0c;实现整备场全流程、全要素、全场景的数字化监管。该系统采用 B/S 架构&…...

ExplorerPatcher使用指南:3步恢复Windows经典界面体验

ExplorerPatcher使用指南&#xff1a;3步恢复Windows经典界面体验 【免费下载链接】ExplorerPatcher This project aims to enhance the working environment on Windows 项目地址: https://gitcode.com/GitHub_Trending/ex/ExplorerPatcher ExplorerPatcher是一款强大的…...

文书妙笔专为公文写作打造,让写材料效率翻倍

不同于市面上通用型写作工具&#xff0c;文书妙笔每一项功能都为公文写作量身定制&#xff0c;真正实现“写材料效率翻倍”。作为专为公文写作打造的平台&#xff0c;平台内置40W优质公文范文库&#xff0c;每日持续更新&#xff0c;更整合了最新政策表述、基层工作案例和规范金…...

Midscene + 本地Ollama-Qwen3-VL 部署操作文档(含踩坑指南)

Midscene 本地Ollama-Qwen3-VL 部署操作文档&#xff08;含踩坑指南&#xff09; 一、文档说明 本文档适用于 Windows 环境&#xff08;以暗影精灵11为例&#xff1a;i9-14900HX 32G内存 RTX5070 8G&#xff09;&#xff0c;完整覆盖从环境安装、模型部署、脚本开发到调试…...

惯性导航解算及误差分析

目录 1.连续时间下三维运动的微分性质 1.1 旋转矩阵的微分方程 1.2 四元数的微分方程 1.3 旋转向量的微分方程 2.惯性导航解算 2.1 姿态更新 2.2 速度更新 2.3 位置更新 3.惯性导航误差分析 3.1 姿态误差微分方程 3.2 速度误差微分方程 3.3 位置误差方程 3.4 bias…...

ARM Cortex M0 and M0+ 学习:Architecture

Block Diagram Operation Mode The ARMv6-M architecture has two operation modes and two states. In addition, it can have privileged and unprivileged access levels. Core Registers R0-R12:通用寄存器 R13(SP):存储主栈指针MSP或进程指针PSP,目的是帮助CPU在栈中…...

凌晨裁员3万人,史上最大裁员潮来了!

作者 | 文韬报道 | 环球电商“我们决定取消您的岗位&#xff0c;今天是您的最后一个工作日。”不少员工醒来才发现&#xff0c;岗位没了&#xff0c;系统权限也快没了&#xff0c;今天就是最后一个工作日。过去大家总觉得&#xff0c;只有快撑不住的公司&#xff0c;才会用这种…...

Kandinsky-5.0-I2V-Lite-5s图生视频工作流整合:接入Notion/Airtable自动化生成

Kandinsky-5.0-I2V-Lite-5s图生视频工作流整合&#xff1a;接入Notion/Airtable自动化生成 1. 产品介绍与核心价值 Kandinsky-5.0-I2V-Lite-5s是一款革命性的轻量级图生视频模型&#xff0c;它让短视频创作变得前所未有的简单。你只需要准备一张首帧图片&#xff0c;再补充一…...

Alexa Plus 拓展食品配送领域,语音订餐体验升级

Alexa Plus 开启食品配送新功能从本周起&#xff0c;Alexa Plus 拓展至食品配送领域&#xff0c;用户可通过它从优步外卖&#xff08;Uber Eats&#xff09;和 Grubhub 订餐。只需将优步或 Grubhub 应用与 Alexa Plus 设备关联&#xff0c;就能询问食品配送情况&#xff0c;并通…...