react-color-palette源码解析

article/2025/8/25 4:45:04

项目中用到了react-color-palette组件,以前对第三方组件都是不求甚解,这次想了解一下其实现细节。

简介

react-color-palette 是一个用于创建颜色调色板的 React 组件。它提供了一个简单易用的接口,让开发者可以轻松地创建和管理颜色调色板。该组件很轻量,仅依赖React、Typescript。先来看一下实例:

代码结构

项目有几个核心目录:

  • components
  • css
  • hooks
  • services
  • utils
  • rcp.ts

1、rcp.ts对外暴露的组件和方法,供开发者使用

2、utils提供平台无关的工具函数,比如在Vue中也可使用

3、services提供相对完整的模块工具,也具有平台无关性,以类的形式封装了Color相关的工具函数

4、hooks 提供基于React的hook工具函数,这些工具只能在React组件中使用

5、components存放各个子组件

6、css存放组件样式,这样方便将css打包成独立的文件

各司其职的组件

颜色选择器组件由多个独立组件组合而成,各个组件各司其职,相互协作,共同完成颜色选择器的功能。

  •  Interactive:交互组件,用于处理用户的交互操作、提供鼠标位置信息,如鼠标移动、点击等。
  • Saturation:饱和度组件,基于interactive提供的鼠标位置信息计算颜色的饱和度和明度。
  • Hue:色相组件,基于interactive提供的鼠标x坐标计算颜色的色相。
  • Alpha:透明度组件,基于interactive提供的鼠标x坐标计算颜色的透明度。
  • Fields:输入框组件,用于输入颜色的 RGB、HEX 等格式。

HSV

在具体分析各组件之前,我们先了解一下 HSV 色彩模型。

HSV是一种基于人类视觉感知的色彩模型,用于直观描述和操作颜色,它将颜色分为色相(Hue)、饱和度(Saturation)和明度(Value)三个维度。

HSV色彩模型的主要特点

  • 色相(Hue):表示颜色的种类,取值范围为0到360度。色相的变化通常是从红色开始,依次经过黄色、绿色、青色、蓝色和品红色,最后回到红色。
  • 饱和度(Saturation):表示颜色的纯度或浓度,取值范围为0到100%。饱和度取决于该色中含色成分和消色成分(灰色)的比例。含色成分越大,饱和度越大;消色成分越大,饱和度越小。饱和度为0时,颜色为灰度色;饱和度为100%时,颜色为纯色。
  • 明度(Value):表示颜色的亮度,取值范围为0到100%。明度为0时,颜色为黑色;明度为100%时,颜色为白色。

Saturation组件

在饱和度组件中我们重点关注两个点:

  1. 根据鼠标位置计算颜色的饱和度明度
  2. 可视化地表达颜色的饱和度明度

1、计算饱和度和明度的代码片段

// saturation.component.tsx
const nextColor = ColorService.convert("hsv", {...color.hsv,s: (x / width) * 100,//饱和度计算:0%-100%之间,0%为灰色,100%为最鲜艳的颜色v: 100 - (y / height) * 100,//明度计算:100%-0%之间,从顶部到底部
});

2、可视化地表达颜色的饱和度和明度

/* src/css/rcp.css */
.rcp-saturation {cursor: all-scroll;width: 100%;position: relative;/** 模拟饱和度和明度渐变效果* 实现原理:两层线性渐变背景,一层从上到下,一层从左到右* linear-gradient(to bottom, transparent, black):从上到下,透明到黑色,模拟出明度从高到低的变化* linear-gradient(to right, white, transparent):从左到右,白色到透明,模拟出饱和度从左到右的变化*/background-image: linear-gradient(to bottom, transparent, black), linear-gradient(to right, white, transparent);border-radius: 10px 10px 0 0;
}
// src/components/saturation/saturation.component.tsx
<div ref={saturationRef} style={{ height, backgroundColor: `hsl(${hsl})` }} className="rcp-saturation"><divstyle={{ left: position.x, top: position.y, backgroundColor: `rgb(${rgb})` }}className="rcp-saturation-cursor"/>
</div>

注意.rcp-saturation中的background-imagesaturationRefbackgroundColor,background-image在上,backgroundColor在下,渐变过程两相叠加,展现出颜色在饱和度和明度两个纬度的渐变效果:

最终颜色 = (渐变颜色 × 渐变alpha) + (背景色 × (1 - 渐变alpha))

Hue组件

色相组件也是两点:

  1. 如何根据鼠标x坐标计算颜色的色相
  2. 可视化地表达颜色的色相

1、计算色相的代码片段

// src/components/hue/hue.component.tsx
const nextColor = ColorService.convert("hsv", {...color.hsv,h: (x / width) * 360,//色相计算:0-360度之间,0度为红色,360度为红色
});

2、可视化地表达颜色的色相

.rcp-hue {cursor: ew-resize;position: relative;width: 100%;height: 12px;/** 借助线性渐变模拟色相渐变效果* 实现原理:* 一层线性渐变背景,从左到右,颜色从红色->黄色->绿色->青色->蓝色->品红->红色,* 模拟出色相从左到右的变化*/background-image: linear-gradient(to right,rgb(255, 0, 0),/*红色,对应色相0度*/rgb(255, 255, 0),/*黄色,对应色相60度*/rgb(0, 255, 0),/*绿色,对应色相120度*/rgb(0, 255, 255),/*青色,对应色相180度*/rgb(0, 0, 255),/*蓝色,对应色相240度*/rgb(255, 0, 255),/*品红,对应色相300度*/rgb(255, 0, 0)/*回到红色,对应色相360度*/);border-radius: 10px;
}

Alpha组件

同样两点:

1、计算透明度

2、显示透明度效果

重要的工具 

src/services/color/color.service.ts提供了颜色转换的重要方法,使得可以在HSV、RGB、HEX等数据形式间相互转换。在任何其他项目中都可以使用其中的方法。

思考

代码不是一串生硬的字符,它需要带有现实的意义,它要能更好的去帮人们解决现实的问题


http://www.hkcw.cn/article/OqMsnZxfBk.shtml

相关文章

(一)视觉——工业相机(以海康威视为例)

一、工业相机介绍 工业相机是机器视觉系统中的一个关键组件&#xff0c;其最本质的功能就是将光信号转变成有序的电信号。选择合适的相机也是机器视觉系统设计中的重要环节&#xff0c;相机的选择不仅直接决定所采集到的图像分辨率、图像质量等&#xff0c;同时也与整个系统的运…

PnP(Perspective-n-Point)算法 | 用于求解已知n个3D点及其对应2D投影点的相机位姿

什么是PnP算法&#xff1f; PnP 全称是 Perspective-n-Point&#xff0c;中文叫“n点透视问题”。它的目标是&#xff1a; 已知一些空间中已知3D点的位置&#xff08;世界坐标&#xff09;和它们对应的2D图像像素坐标&#xff0c;求解摄像机的姿态&#xff08;位置和平移&…

C++核心编程_4.5 运算符重载_4.5.1 加号运算符重载

#include <iostream> #include <string> using namespace std;/* ### 4.5 运算符重载 运算符重载概念&#xff1a;对已有的运算符重新进行定义&#xff0c;赋予其另一种功能&#xff0c;以适应不同的数据类型 *//* 4.5.1 加号运算符重载 作用&#xff1a;实现两…

文本预处理

文本预处理 1 词向量表示 1.1 word2vec之skipgram方式&#xff1a; 定义&#xff1a;给你一段文本&#xff0c;选定特定的窗口长度&#xff0c;然后利用中间词来预测上下文 实现过程&#xff1a;1、选定一个窗口长度&#xff1a;3、5、7等&#xff1b;2、指定词向量的维度&a…

C++中单例模式详解

在C中&#xff0c;单例模式 (Singleton Pattern) 确保一个类只有一个实例&#xff0c;并提供一个全局访问点来获取这个实例。这在需要一个全局对象来协调整个系统行为的场景中非常有用。 为什么要有单例模式&#xff1f; 在许多项目中&#xff0c;某些类从逻辑上讲只需要一个实…

什么是单片机?

众所周知&#xff0c;人类行为受大脑调控&#xff0c;正如视觉、听觉、味觉、嗅觉、触觉及运动功能等感官与肢体活动均受其指挥&#xff1b;换言之&#xff0c;大脑作为人体的中枢神经系统&#xff0c;负责管理所有可控制的生理功能。 在电子设备领域&#xff0c;单片机…

DMBOK对比知识点整理(4)

1.常见数据质量维度 常见数据质量维度(DMBOK-P353)质量维度

Web攻防-SQL注入增删改查盲注延时布尔报错有无回显错误处理

知识点&#xff1a; 1、Web攻防-SQL注入-操作方法&增删改查 2、Web攻防-SQL注入-布尔&延时&报错&盲注 案例说明&#xff1a; 在应用中&#xff0c;存在增删改查数据的操作&#xff0c;其中SQL语句结构不一导致注入语句也要针对应用达到兼容执行&#xff0c;另…

动态规划-152.乘积最大子数组-力扣(LeetCode)

一、题目解析 根据示例nums数组中存在负数&#xff0c;下面分析时需注意 二、算法原理 1、状态表示 此时f[i]表示&#xff1a;以i位置为结尾的所有子数组中的最大乘积&#xff0c;但是由于nums中存在负数&#xff0c;所以还需要g[i]表示&#xff1a;以i位置为结尾的所有子数组…

Leetcode 159. 至多包含两个不同字符的最长子串

1.题目基本信息 1.1.题目描述 给你一个字符串 s &#xff0c;请你找出 至多 包含 两个不同字符 的最长子串&#xff0c;并返回该子串的长度。 1.2.题目地址 https://leetcode.cn/problems/longest-substring-with-at-most-two-distinct-characters/description/ 2.解题方法…

MATLAB 横向剪切干涉系统用户界面设计及其波前重构研究

▒▒本文目录▒▒ 一、横向剪切干涉系统效果预览二、引言三、横向剪切干涉理论基础四、MATLAB 横向剪切干涉系统用户界面设计五、参考文献六、实验指导与matlab代码获取 一、横向剪切干涉系统效果预览 开发的系统如下所示&#xff1a; 横向剪切干涉系统 二、引言 横向剪切干…

C54-动态开辟内存空间

1.malloc 原型&#xff1a;void* malloc(size_t size);&#xff08;位于 <stdlib.h> 头文件中&#xff09; 作用&#xff1a;分配一块连续的、未初始化的内存块&#xff0c;大小为 size 字节。 返回值&#xff1a; 成功&#xff1a;返回指向分配内存首地址的 void* 指针…

【Linux网络篇】:初步理解应用层协议以及何为序列化和反序列化

✨感谢您阅读本篇文章&#xff0c;文章内容是个人学习笔记的整理&#xff0c;如果哪里有误的话还请您指正噢✨ ✨ 个人主页&#xff1a;余辉zmh–CSDN博客 ✨ 文章所属专栏&#xff1a;Linux篇–CSDN博客 文章目录 一.序列化和反序列化为什么需要序列化和反序列化为什么应用层…

【Tips】关于PCI和PCIe的配置空间差异和io/memory io读写

最近在看同事2023年讲的PCI基础课&#xff0c;感觉确实是豁然开朗了&#xff0c;赞美同事。 PCIe实际上是PCI的扩展&#xff08;extended&#xff09;&#xff0c;PCIe设备相当于是迭代升级产品。 而PCIe的配置空间基于PCI原有的0xFF&#xff08;256字节&#xff09;配置空间…

华为OD机试真题——阿里巴巴找黄金宝箱(III)(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳实现

2025 A卷 100分 题型 本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式; 并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析; 本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分…

拓扑排序算法剖析与py/cpp/Java语言实现

拓扑排序算法深度剖析与py/cpp/Java语言实现 一、拓扑排序算法的基本概念1.1 有向无环图&#xff08;DAG&#xff09;1.2 拓扑排序的定义1.3 拓扑排序的性质 二、拓扑排序算法的原理与流程2.1 核心原理2.2 算法流程 三、拓扑排序算法的代码实现3.1 Python实现3.2 C实现3.3 Java…

C#学习:基于LLM的简历评估程序

前言 在pocketflow的例子中看到了一个基于LLM的简历评估程序的例子&#xff0c;感觉还挺好玩的&#xff0c;为了练习一下C#&#xff0c;我最近使用C#重写了一个。 准备不同的简历&#xff1a; 查看效果&#xff1a; 不足之处是现实的简历应该是pdf格式的&#xff0c;后面可以…

华为OD机试真题——阿里巴巴找黄金宝箱(II)(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳实现

2025 A卷 100分 题型 本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式; 并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析; 本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分…

最大流-Ford-Fulkerson增广路径算法py/cpp/Java三语言实现

最大流-Ford-Fulkerson增广路径算法py/cpp/Java三语言实现 一、网络流问题与相关概念1.1 网络流问题定义1.2 关键概念 二、Ford-Fulkerson算法原理2.1 核心思想2.2 算法步骤 三、Ford-Fulkerson算法的代码实现3.1 Python实现3.2 C实现3.3 Java实现 四、Ford-Fulkerson算法的时间…

摄像头模块的镜头类型

一、‌按光学功能分类‌ ‌球面镜&#xff08;Spherical Lens&#xff09;‌ ‌特点‌&#xff1a;表面为球面曲率&#xff0c;工艺简单且成本低&#xff0c;但存在球面像差和色差&#xff0c;边缘画质易模糊。 ‌应用‌&#xff1a;低端监控设备、玩具相机等对画质要求低的…