前端如何实现更换项目主题色的功能?

1、场景

有一个换主题色的功能,如下图:
在这里插入图片描述

切换颜色后,将对页面所有部分的色值进行重新设置,符合最新的主题色。

2、实现思路

因为色值比较灵活,可以任意选取,所以最好的实现方式是,根据设置的色值,拼接相应的 style 标签代码,对样式进行覆盖。

3、实现步骤

3.1、获取深浅色

当前公司的组件库设计的时候,对于同一组件的颜色设置基本有三种:正常色、较深色(常用于hover效果)、较浅色(常用于边框),所以第一步是可以根据正常色,获取深浅色。

3.1.1、获取 HSL 色值

深浅色的获取,基本是通过设置 HSL 颜色的亮度实现,所以第一步是将任意格式的色值,转换为 HSL 格式。

3.1.1.1、将 RGB 颜色转为 HSL

因可能会存入 RGB 颜色,所以需要将 RGB 转为 HSL 。下面是代码:

// rgb to hsl
function rgbToHsl (color) {let aColor = color.replace(/(?:\(|\)|rgb|RGB)*/g, '').split(',')const _R = aColor[0] / 255const _G = aColor[1] / 255const _B = aColor[2] / 255const Cmax = Math.max(_R, _G, _B)const Cmin = Math.min(_R, _G, _B)const V = Cmax - Cminlet H = 0if (V === 0) {H = 0} else if (Cmax === _R) {H = 60 * (((_G - _B) / V) % 6)} else if (Cmax === _G) {H = 60 * ((_B - _R) / V + 2)} else if (Cmax === _B) {H = 60 * ((_R - _G) / V + 4)}H = Math.floor(backCycle(H, 360))const L = numberFixed((Cmax + Cmin) / 2)const S = V === 0 ? 0 : numberFixed(V / (1 - Math.abs(2 * L - 1)))return `hsl(${H},${numberFixed(100 * S)}%,${numberFixed(100 * L)}%)`
}function numberFixed (num = 0, count = 3) {const power = Math.pow(10, count)return Math.floor(num * power) / power
}function backCycle (num, cycle) {let index = num % cycleif (index < 0) {index += cycle}return index
}
3.1.1.2、将 HEX 颜色转为 HSL

因可能会存入 HEX 颜色,所以需要将 HEX 转为 HSL 。具体步骤是,先将 HEX 转为 RGB,再将 RGB 转为 HSL

// hex 转 rgb
function hexToRgb (color) {if (color.length === 4) {let sColorNew = '#'for (let i = 1; i < 4; i += 1) {sColorNew += color.slice(i, i + 1).concat(color.slice(i, i + 1))}color = sColorNew}// 处理六位的颜色值let sColorChange = []for (let i = 1; i < 7; i += 2) {sColorChange.push(parseInt('0x' + color.slice(i, i + 2)))}return 'RGB(' + sColorChange.join(',') + ')'
}RGB 转 HSL 见上部分。
3.1.2、HSL色值调亮度

HSL 调亮度,主要是改最后一位数字的值,代码如下:

// 获取更浅或者更暗的颜色,color为主色;amt为正数时获得浅色,为负数时获得深色。
function lightenDarkenColor (color, amt) {let hColor = colorToHsl(color).replace(/(?:\(|\)|hsl|HSL)*/g, '').split(',')let H = hColor[0]let S = getPercentNumber(hColor[1])let L = getPercentNumber(hColor[2]) + amt / 100L = L > 1 ? 0.98 : Lreturn `hsl(${H},${numberFixed(100 * S)}%,${numberFixed(100 * L)}%)`
}// 获取百分数的数值
function getPercentNumber (numberStr) {numberStr += ''if (numberStr.indexOf('%') > -1) {return parseFloat(numberStr) / 100} else {return parseFloat(numberStr)}
}

3.2、生成 style 代码

根据上面生成的深浅色,拼接 style 代码,对组件库和项目的色值进行覆盖,需要注意组件库的代码和项目中的代码要分开。
代码生成示例如下:

// 顶部导航的换肤 class
export let headerSkin = ({ skinColor, skinColorDarken, skinColorLighten } = {}) => {return `#skin .a-n-menu-primary ,#skin .a-n-menu-submenu .a-n-menu-submenu .a-n-menu .a-n-menu-item-active:not(.a-n-menu-submenu):before{background: ${skinColor};}#skin .a-n-menu-horizontal .a-n-menu-submenu:hover,#skin .a-n-menu-horizontal .a-n-menu-submenu:active,#skin .a-n-menu-horizontal .a-n-menu-item:hover,#skin .a-n-menu-horizontal .a-n-menu-item-active {background: ${skinColorDarken};}#skin .a-n-menu-vertical .a-n-menu-submenu .a-n-menu-item-selected>span.slotItem{color: ${skinColor};}#skin .a-n-menu-submenu {.a-select-dropdown {.a-n-menu-item:hover{background: ${skinColorLighten}}}}#skin .aw-header .icon-container-right:hover,#skin .aw-header .icon-container:hover {background: ${skinColorDarken};}`
}

3.3、将 style 放到 head 中,完成主题色的替换

let css = 上面生成的style代码。
var head = document.getElementsByTagName('head')[0]
skinStyle = document.createElement('style')
skinStyle.innerHTML = css
head.appendChild(skinStyle)

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

解读权限信息

1. 权限信息 在查看工作目录的内容时&#xff0c;经常看到如下格式的信息&#xff1a; 第一列&#xff1a;文件/文件夹的权限&#xff08;或者叫权限控制信息&#xff09;&#xff1b; 第二列&#xff1a;文件/文件夹的所属用户&#xff1b; 第三列&#xff1a;文件/文件夹…

苹果密码解锁工具已注册专业版_不限制电脑

Aiseesoft iPhone Unlocker&#xff1a;轻松解锁iPhone。功能强大&#xff1a;一键移除4位、6位密码、Touch ID和Face ID。隐私保护&#xff1a;创建密码&#xff0c;安全无忧。数据提醒&#xff1a;解锁时&#xff0c;注意数据和设置将被清除。Apple ID 解锁&#xff1a;快速删…

Redis 与 Scrapy:无缝集成的分布式爬虫技术

1. 分布式爬虫的概念 分布式爬虫系统通过将任务分配给多个爬虫节点&#xff0c;利用集群的计算能力来提高数据抓取的效率。这种方式不仅可以提高爬取速度&#xff0c;还可以在单个节点发生故障时&#xff0c;通过其他节点继续完成任务&#xff0c;从而提高系统的稳定性和可靠性…

信息系统的分类_20240731

1:信息系统的分类 1.1:业务处理系统(TPS) 又称为电子数据处理系统.TPS是服务于组织管理层次中最低层、最基础的信息系统 功能:数据输入、数据处理(批处里、OLTP)1.2:管理信息系统(MIS) 是由业务处理系统发展而来的,是在TPS基础上引进大量管理方法对企业整体信息进行处理 MI…

C#知识|文件与目录操作:目录的操作

哈喽,你好啊,我是雷工! 前边学习了文件的删除、复制、移动,接下来学习目录的操作。 以下为学习笔记。 01 效果演示 1.1、显示指定目录下的所有文件 在左侧的文本框中显示出F:\F004-C#目录下的所有文件, 演示效果: 1.2、显示指定目录下的所有子文件 在左侧的文本框中显…

【机器学习西瓜书学习笔记——模型评估与选择】

机器学习西瓜书学习笔记【第二章】 第二章 模型评估与选择2.1训练误差和测试误差错误率误差 欠拟合和过拟合2.2评估方法留出法交叉验证法自助法 2.3性能度量查准率、查全率与F1查准率查全率F1 P-R曲线ROC与AUCROCAUC 代价敏感错误率与代价曲线代价曲线 2.4比较检验假设检验&…

三品软件与合作伙伴提供管家式服务 推动企业研发管理创新

近日&#xff0c;三品软件携手核心合作伙伴&#xff0c;秉承着为本地客户提供全方位的管家式服务。坚持采用“管理咨询IT整体规划PLM本地交付”的服务模式&#xff0c;凭借卓越的服务质量和专业度&#xff0c;赢得了客户的高度信任和好评&#xff0c;并成功签约多个PLM项目。 …

SAP PowerDesigner@官网下载

背景 略 问题 略 解决 用户可以通过访问SAP支持网站的首页&#xff08;‌https://support.sap.com/home.html&#xff09;‌&#xff0c;‌然后导航到“Software Downloads”&#xff08;‌软件下载&#xff09;‌部分来访问SAP软件的下载入口。‌在这里&#xff0c;‌用户可…

第一章:为了女神小芳!【配套课时:SQL注入攻击原理 实战演练】

目录 一、原理 二、步骤 1、测试是否存在注入点 2、判断字段数 3、判断回显位置 4、判断数据库和版本 5、判断表名 6、判断字段名 7、获取表的数据 一、原理 SQL数值型注入 二、步骤 点击查看出现id&#xff0c;这里可能存在注入点 1、测试是否存在注入点 http://p…

UVC驱动分析(一)

UVC驱动分析 UVC驱动简介Linux video框架分层UVC驱动注册UVC驱动注册入口函数UVC设备探测初始化UVC描述符解析V4L2设备注册UVC控制参数初始化UVC video驱动注册UVC 状态初始化 UVC驱动简介 UVC全称为USB Video Class&#xff0c;即&#xff1a;USB视频类&#xff0c;是一种为U…

向量数据库性能测试工具(VectorDBBench.com)性价比排名

排名 向量数据库(不同硬件配置) 价格/性能比 QP$(每百万次查询所花费的价格)中型数据集, OpenAI 无标量过滤 QP$(每百万次查询所花费的价格)中型数据集, OpenAI 低标量过滤 QP$(每百万次查询所花费的价格)中型数据集, OpenAI 高标量过滤 QP$(每百万次查询所花费的价…

25考研数据结构复习·7.1/7.2查找的基本概念-顺序查找和折半查找

查找的基本概念 基本概念 查找查找表关键字&#xff08;唯一标识&#xff09;对查找表的常见操作 查找符合条件的数据元素——静态查找表插入、删除某个元素——且也要进行操作a的&#xff08;动态查找表&#xff09;评价指标 查找长度——需要比较的关键字次数 平均查找长度…

AI鲁迅申请出战?靠谱是最低成本的社交——早读(逆天打工人爬取热门微信文章解读)

AI真不错&#xff0c;多喂点数据给他&#xff0c;然后一点点跟他交流&#xff0c;我现在都直接叫AI鲁迅了 引言Python 代码第一篇 洞见 靠谱是最低成本的社交第二篇 金牌1结尾 引言 最近真是累得够呛 成天埋头研究股票行情 眼睛都快成了望远镜 却还是看不透那股市的风云变幻 公…

如何磁盘覆写

使用命令提示符写0 命令提示符是Windows系统内置的一个非常实用的工具&#xff0c;可以通过几行短短的命令来完成各种各样的电脑相关操作而无需开启应用程序&#xff0c;所以我们可以通过命令提示符中的format命令来完成硬盘写0任务。 步骤1. 在搜索框中输入cmd并以管理员身份…

WordPress建站:如何使用Hostinger搭建WordPress外贸独立站

随着电商平台竞争的加剧&#xff0c;许多外贸从业者意识到减少对平台依赖的重要性&#xff0c;并选择搭建自己的外贸独立站来获得更多的控制权和灵活性。即使是没有建站基础的新手&#xff0c;也可以通过学习建站来实现这一目标。下面是一个适用于新手的外贸建站教程&#xff0…

typescript中interface常见3种用法

文章目录 函数类型对象类型【自命名】&#xff1a; (函数)对象类型 函数类型 作用&#xff1a;声明一个函数接口&#xff1a;可用于类型声明 | 不可implements 对象类型 作用&#xff1a;声明对象具备哪些实例接口&#xff1a;可用于类型 | 可implements 【自命名】&…

浅谈取样器之SSH Command

浅谈取样器之SSH Command JMeter的SSH Command取样器是一个强大的功能&#xff0c;允许用户在JMeter测试计划中执行远程SSH命令。这对于需要与Linux/Unix服务器交互以执行系统命令、脚本或者进行性能测试验证的场景尤为有用。通过这个取样器&#xff0c;您可以集成服务器端操作…

【python】OpenCV—Faster Video File FPS

文章目录 1、需求描述2、正常方法 cv2.read3、加速方法 imutils.video.FileVideoStream4、涉及到的核心库函数4.1、imutils.video.FPS4.2、imutils.video.FileVideoStream 5、参考 1、需求描述 使用线程和队列数据结构将视频文件的 FPS 速率提高 &#xff01; 我们的目标是将…

02 RabbitMQ:下载安装

02 RabbitMQ&#xff1a;下载&安装 1. 下载&安装1.1. 官网1.2. Docker方式1.2.1. 下载镜像1.2.2. 启动1.2.3. 登录验证 1. 下载&安装 1.1. 官网 RabbitMQ: One broker to queue them all | RabbitMQ 1.2. Docker方式 1.2.1. 下载镜像 # docker pull 镜像名称[…

出行方案,智能推荐:用友BIP商旅云6.0推出AI新装备

随着企业业务的不断拓展和员工出行需求的日益复杂化&#xff0c;传统的商旅预订方式已经难以应对&#xff0c;同时企业在商旅成本控制方面也面临着巨大的挑战。为此用友BIP商旅云6.0推出了创新性的AI新装备——智能推荐&#xff0c;以智能分析与精准预测&#xff0c;为企业提供…