于前端开发初学者而言,颜色选择器可能比较陌生,甚至在实际项目中都未曾使用过。但如果开发高端一点的网站的话,通常需要自定义主题功能,可以自定义导航栏、菜单栏的文本颜色、背景色之类的,此时就用到颜色选择器了。
今天w3cschool编程狮为大家推荐几个 Github 上热门的颜色选择器组件。
colorjoe 是一个具有触控和 AMD 支持的可扩展颜色选择器。可以通过 CSS 定义其实际尺寸和布局。通过这种方式,该组件非常适合响应式布局。
与那里的许多其他颜色选择器不同,colorjoe 是真正可扩展的。它基于 CSS,不依赖于外部图像。因此,您可以调整其大小以适应您的目的。还支持触控和 AMD 模块定义。
colorjoe 受到 ColorJack 和 RightJS Colorpicker 的启发。与那些不同的是,它实际上可以很好地扩展。从本质上讲,这意味着您将能够使用一些 CSS 定义其实际尺寸和布局。通过这种方式,小部件非常适合响应式布局。
此外,由于它提供的简单 API,实现缺失的功能(RGB 字段等)相对容易。
Colorjoe
安装
npm i colorjoe
如果您更喜欢独立的 dist,请将预打包的dist/colorjoe.js和添加css/colorjoe.css到您的页面或从 src/使用 AMD 。
用法
const joe = colorjoe.rgb(element_id_or_dom_object, initial_color_value, extras);
或者
const joe = colorjoe.hsl(element_id_or_dom_object, initial_color_value, extras);
今天,每个依赖项都会拖累更多的依赖项,并且无法控制地增加项目的包大小。但是大小对于打算在浏览器中工作的所有内容都非常重要。React Colorful 是一个用于 React 和 Preact 应用程序的小型颜色选择器组件,使用 hooks 和函数组件构建。它使用严格的 TypeScript 编写,具有 100% 的测试覆盖率,界面简单易用,适用于大多数浏览器,支持移动设备和触摸屏遵循 WAI-ARIA 指南以支持辅助技术的用户,压缩后仅 2,8 KB(比 react-color 轻小13 倍)。react-colorful 是一个简单的颜色选择器,适合那些关心包大小和客户端性能的人。。
Colorful
安装
npm install react-colorful
import { HexColorPicker } from "react-colorful";
const YourComponent = () => {
const [color, setColor] = useState("#aabbcc");
return <HexColorPicker color={color} onChange={setColor} />;
};
支持的颜色模型
我们为不同的颜色模型提供了 12 个额外的颜色选择器组件,除非您的应用程序需要 HEX 字符串作为输入/输出格式。
可用的选择器
Import | Value example |
{ HexColorPicker } | "#ffffff" |
{ RgbColorPicker } | { r: 255, g: 255, b: 255 } |
{ RgbaColorPicker } | { r: 255, g: 255, b: 255, a: 1 } |
{ RgbStringColorPicker } | "rgb(255, 255, 255)" |
{ RgbaStringColorPicker } | "rgba(255, 255, 255, 1)" |
{ HslColorPicker } | { h: 0, s: 0, l: 100 } |
{ HslaColorPicker } | { h: 0, s: 0, l: 100, a: 1 } |
{ HslStringColorPicker } | "hsl(0, 0%, 100%)" |
{ HslaStringColorPicker } | "hsla(0, 0%, 100%, 1)" |
{ HsvColorPicker } | { h: 0, s: 0, v: 100 } |
{ HsvaColorPicker } | { h: 0, s: 0, v: 100, a: 1 } |
{ HsvStringColorPicker } | "hsv(0, 0%, 100%)" |
{ HsvaStringColorPicker } | "hsva(0, 0%, 100%, 1)" |
代码示例
import { RgbColorPicker } from "react-colorful";
const YourComponent = () => {
const [color, setColor] = useState({ r: 50, g: 100, b: 150 });
return <RgbColorPicker color={color} onChange={setColor} />;
};
Huebee 是一个 JavaScript 库,用于创建以用户为中心的颜色选择器。Huebee 显示一组有限的颜色,因此用户可以一目了然地查看所有颜色,做出明确的决定,并通过单击选择一种颜色。
Huebee
使用 npm 安装:npm install huebee
使用 Bower 安装:bower install huebee --save
在您的站点中包含 Huebee.css和.js文件。
<link rel="stylesheet" href="/path/to/huebee.css" media="screen">
<script src="/path/to/huebee.pkgd.min.js"></script>
Huebee 在锚元素上工作。
<!-- use inputs so users can set colors with text -->
<input class="color-input" value="#F80" />
<!-- anchors can be buttons -->
<button class="color-button">Select color</button>
<!-- anchors can be any element -->
<span class="current-color">Current color</span>
React Color 提供了 13 种不同的颜色选择器,可以模拟流行网站和应用程序(如 GitHub、Photoshop、Chrome 和 Twitter)的 UI。不仅如此,还可以使用不同的组件来创建自定义颜色选择器。
React Color
安装和使用
npm install react-color --save
包含组件
import React from 'react'
import { SketchPicker } from 'react-color'
class Component extends React.Component {
render() {
return <SketchPicker />
}
}
可以分别导入:AlphaPicker BlockPicker ChromePicker CirclePicker CompactPicker GithubPicker HuePicker MaterialPicker PhotoshopPicker SketchPicker SliderPicker SwatchesPicker TwitterPicker。
通过ReactCSS 实现100% 内联样式
Vue Color 是一个适用于 Sketch、Photoshop、Chrome 等的 Vue (Vue2.0)颜色选择器。
Vue Color
安装
NPM
$ npm install vue-color
CommonJS
var Photoshop = require('vue-color/src/Photoshop.vue');
new Vue({
components: {
'Photoshop': Photoshop
}
})
ES6
import { Photoshop } from 'vue-color'
new Vue({
components: {
'photoshop-picker': Photoshop
}
})
浏览器全局变量
该dist文件夹包含对象vue-color.js中vue-color.min.js导出的所有组件。window.VueColor这些包也可用于 NPM 包。
<script src="path/to/vue.js"></script>
<script src="path/to/vue-color.min.js"></script>
<script>
var Photoshop = VueColor.Photoshop
</script>
本地设置
npm install
npm run dev
iro.js 是一个用于 JavaScript 的模块化、注重设计的颜色颜色选择器组件 - 支持多种颜色格式。所有 iro.js 都可以从单个脚本运行 - 不需要额外的 CSS、图像或第三方库!
iro.js
安装
使用 NPM 安装
npm install @jaames/iro --save
如果您使用的是 Webpack 或 Rollup 之类的模块打包器,请将 iro.js 导入您的项目:
// Using ES6 module syntax
import iro from '@jaames/iro';
// Using CommonJS modules
const iro = require('@jaames/iro');
使用 jsDelivr CDN
<script src="https://cdn.jsdelivr.net/npm/@jaames/iro@5"></script>
当您像这样手动包含库时,iro.js 将在 window.iro 上全局可用。
下载并托管自己
< html >
< head >
<!-- ... -->
< script src =" ./path/to/ iro.min.js " > </ script >
</ head >
<!-- ... - ->
</ html >
以上就是小师妹为你推荐的6个热门颜色选择器组件了,关注w3cschool编程狮收获更多技术干货~
取颜色:或输入颜色值:OK或使用 HTML5: | 选择的颜色:黑色文本阴影白色文本阴影red#ff0000rgb(255, 0, 0)hsl(0, 100%, 50%)hsv(0, 100%, 100%) | 淡 / 暗:100% #ffffff95% #ffe5e590% #ffcccc85% #ffb3b380% #ff999975% #ff808070% #ff666665% #ff4d4d60% #ff333355% #ff1a1a50% #ff000045% #e6000040% #cc000035% #b3000030% #99000025% #80000020% #66000015% #4d000010% #3300005% #1a00000% #000000 |
Hue
Hue | Hex | Rgb | Hsl | Hsv | |
0 | #ff0000 | rgb(255, 0, 0) | hsl(0, 100%, 50%) | hsv(0, 100%, 100%) | |
15 | #ff4000 | rgb(255, 64, 0) | hsl(15, 100%, 50%) | hsv(15, 100%, 100%) | |
30 | #ff8000 | rgb(255, 128, 0) | hsl(30, 100%, 50%) | hsv(30, 100%, 100%) | |
45 | #ffbf00 | rgb(255, 191, 0) | hsl(45, 100%, 50%) | hsv(45, 100%, 100%) | |
60 | #ffff00 | rgb(255, 255, 0) | hsl(60, 100%, 50%) | hsv(60, 100%, 100%) | |
75 | #bfff00 | rgb(191, 255, 0) | hsl(75, 100%, 50%) | hsv(75, 100%, 100%) | |
90 | #80ff00 | rgb(128, 255, 0) | hsl(90, 100%, 50%) | hsv(90, 100%, 100%) | |
105 | #40ff00 | rgb(64, 255, 0) | hsl(105, 100%, 50%) | hsv(105, 100%, 100%) | |
120 | #00ff00 | rgb(0, 255, 0) | hsl(120, 100%, 50%) | hsv(120, 100%, 100%) | |
135 | #00ff40 | rgb(0, 255, 64) | hsl(135, 100%, 50%) | hsv(135, 100%, 100%) | |
150 | #00ff80 | rgb(0, 255, 128) | hsl(150, 100%, 50%) | hsv(150, 100%, 100%) | |
165 | #00ffbf | rgb(0, 255, 191) | hsl(165, 100%, 50%) | hsv(165, 100%, 100%) | |
180 | #00ffff | rgb(0, 255, 255) | hsl(180, 100%, 50%) | hsv(180, 100%, 100%) | |
195 | #00bfff | rgb(0, 191, 255) | hsl(195, 100%, 50%) | hsv(195, 100%, 100%) | |
210 | #007fff | rgb(0, 127, 255) | hsl(210, 100%, 50%) | hsv(210, 100%, 100%) | |
225 | #0040ff | rgb(0, 64, 255) | hsl(225, 100%, 50%) | hsv(225, 100%, 100%) | |
240 | #0000ff | rgb(0, 0, 255) | hsl(240, 100%, 50%) | hsv(240, 100%, 100%) | |
255 | #4000ff | rgb(64, 0, 255) | hsl(255, 100%, 50%) | hsv(255, 100%, 100%) | |
270 | #7f00ff | rgb(127, 0, 255) | hsl(270, 100%, 50%) | hsv(270, 100%, 100%) | |
285 | #bf00ff | rgb(191, 0, 255) | hsl(285, 100%, 50%) | hsv(285, 100%, 100%) | |
300 | #ff00ff | rgb(255, 0, 255) | hsl(300, 100%, 50%) | hsv(300, 100%, 100%) | |
315 | #ff00bf | rgb(255, 0, 191) | hsl(315, 100%, 50%) | hsv(315, 100%, 100%) | |
330 | #ff0080 | rgb(255, 0, 128) | hsl(330, 100%, 50%) | hsv(330, 100%, 100%) | |
345 | #ff0040 | rgb(255, 0, 64) | hsl(345, 100%, 50%) | hsv(345, 100%, 100%) | |
360 | #ff0000 | rgb(255, 0, 0) | hsl(0, 100%, 50%) | hsv(0, 100%, 100%) |
HSL Saturation
Sat | Hex | Rgb | Hsl | Hsv | |
100% | #ff0000 | rgb(255, 0, 0) | hsl(0, 100%, 50%) | hsv(0, 100%, 100%) | |
95% | #f90606 | rgb(249, 6, 6) | hsl(0, 95%, 50%) | hsv(0, 97%, 98%) | |
90% | #f20d0d | rgb(242, 13, 13) | hsl(0, 90%, 50%) | hsv(0, 95%, 95%) | |
85% | #ec1313 | rgb(236, 19, 19) | hsl(0, 85%, 50%) | hsv(0, 92%, 93%) | |
80% | #e61919 | rgb(230, 25, 25) | hsl(0, 80%, 50%) | hsv(0, 89%, 90%) | |
75% | #df2020 | rgb(223, 32, 32) | hsl(0, 75%, 50%) | hsv(0, 86%, 88%) | |
70% | #d92626 | rgb(217, 38, 38) | hsl(0, 70%, 50%) | hsv(0, 82%, 85%) | |
65% | #d22d2d | rgb(210, 45, 45) | hsl(0, 65%, 50%) | hsv(0, 79%, 83%) | |
60% | #cc3333 | rgb(204, 51, 51) | hsl(0, 60%, 50%) | hsv(0, 75%, 80%) | |
55% | #c63939 | rgb(198, 57, 57) | hsl(0, 55%, 50%) | hsv(0, 71%, 78%) | |
50% | #bf4040 | rgb(191, 64, 64) | hsl(0, 50%, 50%) | hsv(0, 67%, 75%) | |
45% | #b94646 | rgb(185, 70, 70) | hsl(0, 45%, 50%) | hsv(0, 62%, 73%) | |
40% | #b34d4d | rgb(179, 77, 77) | hsl(0, 40%, 50%) | hsv(0, 57%, 70%) | |
35% | #ac5353 | rgb(172, 83, 83) | hsl(0, 35%, 50%) | hsv(0, 52%, 68%) | |
30% | #a65959 | rgb(166, 89, 89) | hsl(0, 30%, 50%) | hsv(0, 46%, 65%) | |
25% | #9f6060 | rgb(159, 96, 96) | hsl(0, 25%, 50%) | hsv(0, 40%, 63%) | |
20% | #996666 | rgb(153, 102, 102) | hsl(0, 20%, 50%) | hsv(0, 33%, 60%) | |
15% | #936c6c | rgb(147, 108, 108) | hsl(0, 15%, 50%) | hsv(0, 26%, 58%) | |
10% | #8c7373 | rgb(140, 115, 115) | hsl(0, 10%, 50%) | hsv(0, 18%, 55%) | |
5% | #867979 | rgb(134, 121, 121) | hsl(0, 5%, 50%) | hsv(0, 10%, 53%) | |
0% | #808080 | rgb(128, 128, 128) | hsl(0, 0%, 50%) | hsv(0, 0%, 50%) |
HSL 淡 / 暗
Lum | Hex | Rgb | Hsl | Hsv | |
100% | #ffffff | rgb(255, 255, 255) | hsl(0, 0%, 100%) | hsv(0, 0%, 100%) | |
95% | #ffe5e5 | rgb(255, 229, 229) | hsl(0, 100%, 95%) | hsv(0, 10%, 100%) | |
90% | #ffcccc | rgb(255, 204, 204) | hsl(0, 100%, 90%) | hsv(0, 20%, 100%) | |
85% | #ffb3b3 | rgb(255, 179, 179) | hsl(0, 100%, 85%) | hsv(0, 30%, 100%) | |
80% | #ff9999 | rgb(255, 153, 153) | hsl(0, 100%, 80%) | hsv(0, 40%, 100%) | |
75% | #ff8080 | rgb(255, 128, 128) | hsl(0, 100%, 75%) | hsv(0, 50%, 100%) | |
70% | #ff6666 | rgb(255, 102, 102) | hsl(0, 100%, 70%) | hsv(0, 60%, 100%) | |
65% | #ff4d4d | rgb(255, 77, 77) | hsl(0, 100%, 65%) | hsv(0, 70%, 100%) | |
60% | #ff3333 | rgb(255, 51, 51) | hsl(0, 100%, 60%) | hsv(0, 80%, 100%) | |
55% | #ff1a1a | rgb(255, 26, 26) | hsl(0, 100%, 55%) | hsv(0, 90%, 100%) | |
50% | #ff0000 | rgb(255, 0, 0) | hsl(0, 100%, 50%) | hsv(0, 100%, 100%) | |
45% | #e60000 | rgb(230, 0, 0) | hsl(0, 100%, 45%) | hsv(0, 100%, 90%) | |
40% | #cc0000 | rgb(204, 0, 0) | hsl(0, 100%, 40%) | hsv(0, 100%, 80%) | |
35% | #b30000 | rgb(179, 0, 0) | hsl(0, 100%, 35%) | hsv(0, 100%, 70%) | |
30% | #990000 | rgb(153, 0, 0) | hsl(0, 100%, 30%) | hsv(0, 100%, 60%) | |
25% | #800000 | rgb(128, 0, 0) | hsl(0, 100%, 25%) | hsv(0, 100%, 50%) | |
20% | #660000 | rgb(102, 0, 0) | hsl(0, 100%, 20%) | hsv(0, 100%, 40%) | |
15% | #4d0000 | rgb(77, 0, 0) | hsl(0, 100%, 15%) | hsv(0, 100%, 30%) | |
10% | #330000 | rgb(51, 0, 0) | hsl(0, 100%, 10%) | hsv(0, 100%, 20%) | |
5% | #1a0000 | rgb(26, 0, 0) | hsl(0, 100%, 5%) | hsv(0, 100%, 10%) | |
0% | #000000 | rgb(0, 0, 0) | hsl(0, 0%, 0%) | hsv(0, 0%, 0%) |
HSV Saturation
Sat | Hex | Rgb | Hsl | Hsv | |
100% | #ff0000 | rgb(255, 0, 0) | hsl(0, 100%, 50%) | hsv(0, 100%, 100%) | |
95% | #ff0d0d | rgb(255, 13, 13) | hsl(0, 100%, 53%) | hsv(0, 95%, 100%) | |
90% | #ff1919 | rgb(255, 25, 25) | hsl(0, 100%, 55%) | hsv(0, 90%, 100%) | |
85% | #ff2626 | rgb(255, 38, 38) | hsl(0, 100%, 57%) | hsv(0, 85%, 100%) | |
80% | #ff3333 | rgb(255, 51, 51) | hsl(0, 100%, 60%) | hsv(0, 80%, 100%) | |
75% | #ff4040 | rgb(255, 64, 64) | hsl(0, 100%, 63%) | hsv(0, 75%, 100%) | |
70% | #ff4d4d | rgb(255, 77, 77) | hsl(0, 100%, 65%) | hsv(0, 70%, 100%) | |
65% | #ff5959 | rgb(255, 89, 89) | hsl(0, 100%, 68%) | hsv(0, 65%, 100%) | |
60% | #ff6666 | rgb(255, 102, 102) | hsl(0, 100%, 70%) | hsv(0, 60%, 100%) | |
55% | #ff7373 | rgb(255, 115, 115) | hsl(0, 100%, 73%) | hsv(0, 55%, 100%) | |
50% | #ff8080 | rgb(255, 128, 128) | hsl(0, 100%, 75%) | hsv(0, 50%, 100%) | |
45% | #ff8c8c | rgb(255, 140, 140) | hsl(0, 100%, 78%) | hsv(0, 45%, 100%) | |
40% | #ff9999 | rgb(255, 153, 153) | hsl(0, 100%, 80%) | hsv(0, 40%, 100%) | |
35% | #ffa6a6 | rgb(255, 166, 166) | hsl(0, 100%, 83%) | hsv(0, 35%, 100%) | |
30% | #ffb3b3 | rgb(255, 179, 179) | hsl(0, 100%, 85%) | hsv(0, 30%, 100%) | |
25% | #ffbfbf | rgb(255, 191, 191) | hsl(0, 100%, 88%) | hsv(0, 25%, 100%) | |
20% | #ffcccc | rgb(255, 204, 204) | hsl(0, 100%, 90%) | hsv(0, 20%, 100%) | |
15% | #ffd9d9 | rgb(255, 217, 217) | hsl(0, 100%, 93%) | hsv(0, 15%, 100%) | |
10% | #ffe6e6 | rgb(255, 230, 230) | hsl(0, 100%, 95%) | hsv(0, 10%, 100%) | |
5% | #fff2f2 | rgb(255, 242, 242) | hsl(0, 100%, 98%) | hsv(0, 5%, 100%) | |
0% | #ffffff | rgb(255, 255, 255) | hsl(0, 0%, 100%) | hsv(0, 0%, 100%) |
HSV 亮 / 暗
Value | Hex | Rgb | Hsl | Hsv | |
100% | #ff0000 | rgb(255, 0, 0) | hsl(0, 100%, 50%) | hsv(0, 100%, 100%) | |
95% | #f20000 | rgb(242, 0, 0) | hsl(0, 100%, 48%) | hsv(0, 100%, 95%) | |
90% | #e60000 | rgb(230, 0, 0) | hsl(0, 100%, 45%) | hsv(0, 100%, 90%) | |
85% | #d90000 | rgb(217, 0, 0) | hsl(0, 100%, 43%) | hsv(0, 100%, 85%) | |
80% | #cc0000 | rgb(204, 0, 0) | hsl(0, 100%, 40%) | hsv(0, 100%, 80%) | |
75% | #bf0000 | rgb(191, 0, 0) | hsl(0, 100%, 38%) | hsv(0, 100%, 75%) | |
70% | #b30000 | rgb(179, 0, 0) | hsl(0, 100%, 35%) | hsv(0, 100%, 70%) | |
65% | #a60000 | rgb(166, 0, 0) | hsl(0, 100%, 33%) | hsv(0, 100%, 65%) | |
60% | #990000 | rgb(153, 0, 0) | hsl(0, 100%, 30%) | hsv(0, 100%, 60%) | |
55% | #8c0000 | rgb(140, 0, 0) | hsl(0, 100%, 28%) | hsv(0, 100%, 55%) | |
50% | #800000 | rgb(128, 0, 0) | hsl(0, 100%, 25%) | hsv(0, 100%, 50%) | |
45% | #730000 | rgb(115, 0, 0) | hsl(0, 100%, 23%) | hsv(0, 100%, 45%) | |
40% | #660000 | rgb(102, 0, 0) | hsl(0, 100%, 20%) | hsv(0, 100%, 40%) | |
35% | #590000 | rgb(89, 0, 0) | hsl(0, 100%, 18%) | hsv(0, 100%, 35%) | |
30% | #4d0000 | rgb(77, 0, 0) | hsl(0, 100%, 15%) | hsv(0, 100%, 30%) | |
25% | #400000 | rgb(64, 0, 0) | hsl(0, 100%, 13%) | hsv(0, 100%, 25%) | |
20% | #330000 | rgb(51, 0, 0) | hsl(0, 100%, 10%) | hsv(0, 100%, 20%) | |
15% | #260000 | rgb(38, 0, 0) | hsl(0, 100%, 8%) | hsv(0, 100%, 15%) | |
10% | #1a0000 | rgb(26, 0, 0) | hsl(0, 100%, 5%) | hsv(0, 100%, 10%) | |
5% | #0d0000 | rgb(13, 0, 0) | hsl(0, 100%, 3%) | hsv(0, 100%, 5%) | |
0% | #000000 | rgb(0, 0, 0) | hsl(0, 0%, 0%) | hsv(0, 0%, 0%) |
RGB (Red, Green, Blue)
Red | Green | Blue |
---|---|---|
255 | 0 | 0 |
rgb(255, 0, 0) #ff0000
如您还有不明白的可以在下面与我留言或是与我探讨QQ群308855039,我们一起飞!
者 | Adam Giese
译者 | 王强
CSS 中有两种颜色模型 RGB 和 HSL,如何用 JavaScript 控制它们?
点开这篇文章的你,肯定是想要学习怎样控制颜色的——我们后面就会讲具体操作。但首先,我们需要对 CSS 如何标记颜色有一个基本的认识。CSS 使用的是两种颜色模型:RGB 和 HSL,我们先简单了解一下。
1、RGB
RGB 就是“红色,绿色,蓝色”的简称。这个模型由三个数字组成,每个数字表示其所代表的颜色在最终生成的颜色中有多高的亮度。在 CSS 中,每个数值的范围都是 0-255,三个数值间用逗号分隔,作为 CSS rgb 函数的参数,例如:rgb(50,100,0)。
RGB 是一种“增量”颜色系统。这意味着每个数字越高,最终生成的颜色就越亮。如果所有值都相等就生成灰度颜色;如果所有值都为零,结果为黑色;如果所有值都是 255,则结果为白色。
此外你也可以使用十六进制表示法来标记 RGB 颜色,其中每种颜色的数值从 10 进制转换为 16 进制。例如,rgb(50,100,0)用 16 进制就写成#326400。
虽然我个人比较习惯使用 RGB 模型(特别是十六进制),但我也经常发现它不易阅读,也不容易操作。下面来看 HSL 模型。
2、HSL
HSL(https://codepen.io/AdamGiese/full/989988044f3b8cf6403e3c60f56dd612)是“色调,饱和度,光线”的简称,HSL 也包含三个值。色调值对应于色轮上的点,由 CSS 角度值表示,最常用的是度数单位。
饱和度以百分比表示,是指颜色的强度。当饱和度为 100%时颜色最深,饱和度越低,颜色越浅,直到灰度为 0%。
亮度也以百分比表示,指的是颜色有多亮。“常规”的亮度是 50%。无论色调和饱和度值如何,100%的亮度都是纯白色,0%的亮度就是纯黑色。
我觉得 HSL 模型更直观一些,颜色之间的关系更加明显,控制颜色时只要简单地调整几个数字就可以了。
3、颜色模型之间的转换
RGB 和 HSL 颜色模型都将颜色分解为各种属性。要在不同模型之间进行转换,我们首先需要计算这些属性。
除了色调,上面提到的所有数值都可以表示为百分比。就连 RGB 值也是用字节表示的百分比。在下面提到的公式和函数中,这些百分比将由 0 到 1 之间的小数来表示。
这里提一下,我并不会深入探讨这些数学知识;相比之下,我将简要介绍一遍原始数学公式,然后将其转换为 JavaScript 格式。
4、从 RGB 模型中计算亮度
亮度是三个 HSL 值中最容易计算的一个。其数学式如下,其中 M 是 RGB 值的最大值,m 是最小值:
亮度的数学式
用 JavaScript 函数写成下面的形式:
const rgbToLightness =(r,g,b)=> 1/2 *(Math.max(r,g,b)+ Math.min(r,g,b));
5、从 RGB 模型中计算饱和度
饱和度仅比亮度稍微复杂一些。如果亮度为 0 或 1,则饱和度值为 0;否则,它基于下面的数学公式计算得出,其中 L 表示亮度:
饱和度的数学式
写成 JavaScript:
const rgbToSaturation = (r,g,b) => { const L = rgbToLightness(r,g,b); const max = Math.max(r,g,b); const min = Math.min(r,g,b); return (L === 0 || L === 1) ? 0 : (max - min)/(1 - Math.abs(2 * L - 1)); };
6、从 RGB 模型中计算色调
从 RGB 坐标中计算色调角度的公式有点复杂:
色调的数学式
写成 JavaScript:
const rgbToHue = (r,g,b) => Math.round( Math.atan2( Math.sqrt(3) * (g - b), 2 * r - g - b, ) * 180 / Math.PI );
最后 180 / Math.PI 的算法是将结果从弧度转换为度。
7、计算 HSL
上面这些函数都可以包含在同一个功能函数里:
const rgbToHsl = (r,g,b) => { const lightness = rgbToLightness(r,g,b); const saturation = rgbToSaturation(r,g,b); const hue = rgbToHue(r,g,b); return [hue, saturation, lightness]; }
8、从 HSL 模型中计算 RGB 值
开始计算 RGB 之前,我们需要一些前提值。
首先是“色度”值:
色度的数学式
还有一个临时的色调值,我们将用它来确定我们所属的色调圈的“段”:
色调区间的数学式
接下来,我们设一个“x”值,它将用作中间(第二大)组件值:
临时“x”值的数学式
我们再设一个“m”值,用于调整各个亮度值:
亮度匹配的数学式
根据色调区间值,r,g 和 b 值将映射到 C,X 和 0:
RGB 值的数学式,不考虑亮度
最后,我们需要映射每个值以调整亮度:
用 RGB 来解释亮度的数学式
将上面这些都写到 JavaScript 函数中:
const hslToRgb = (h,s,l) => { const C = (1 - Math.abs(2 * l - 1)) * s; const hPrime = h / 60; const X = C * (1 - Math.abs(hPrime % 2 - 1)); const m = l - C/2; const withLight = (r,g,b) => [r+m, g+m, b+m]; if (hPrime <= 1) { return withLight(C,X,0); } else if (hPrime <= 2) { return withLight(X,C,0); } else if (hPrime <= 3) { return withLight(0,C,X); } else if (hPrime <= 4) { return withLight(0,X,C); } else if (hPrime <= 5) { return withLight(X,0,C); } else if (hPrime <= 6) { return withLight(C,0,X); } }
9、创建颜色对象
为了便于在操作属性时访问,我们将创建一个 JavaScript 对象。把前面提到的这些函数打包起来就能创建这个对象:
const rgbToObject = (red,green,blue) => { const [hue, saturation, lightness] = rgbToHsl(red, green, blue); return {red, green, blue, hue, saturation, lightness}; } const hslToObject = (hue, saturation, lightness) => { const [red, green, blue] = hslToRgb(hue, saturation, lightness); return {red, green, blue, hue, saturation, lightness}; }
10、示例
我强烈建议你花些时间看看这个示例:
https://codepen.io/AdamGiese/full/86b353c35a8bfe0868a8b48683faf668
从中了解调节各个属性时其它属性如何发生变化,这样能帮助你更深入地了解两种颜色模型是如何对应的。
现在我们已经知道怎样在颜色模型之间进行转换了,那么就来看看该如何控制这些颜色!
1、更新属性
我们提到的所有颜色属性都可以单独控制,返回一个新的颜色对象。例如,我们可以编写一个旋转色调角度的函数:
const rotateHue = rotation => ({hue, ...rest}) => { const modulo = (x, n) => (x % n + n) % n; const newHue = modulo(hue + rotation, 360); return { ...rest, hue: newHue }; }
rotateHue 函数会接受一个旋转参数并返回一个新函数,该函数接受并返回一个颜色对象。这样就可以轻松创建新的“旋转”函数:
const rotate30 = rotateHue(30); const getComplementary = rotateHue(180); const getTriadic = color => { const first = rotateHue(120); const second = rotateHue(-120); return [first(color), second(color)]; }
用这种方式,你也可以编写加深或提亮颜色的函数——或者反过来,减淡或变暗也行。
const saturate = x => ({saturation, ...rest}) => ({ ...rest, saturation: Math.min(1, saturation + x), }); const desaturate = x => ({saturation, ...rest}) => ({ ...rest, saturation: Math.max(0, saturation - x), }); const lighten = x => ({lightness, ...rest}) => ({ ...rest, lightness: Math.min(1, lightness + x) }); const darken = x => ({lightness, ...rest}) => ({ ...rest, lightness: Math.max(0, lightness - x) });
2、颜色谓词
除了颜色控制以外,你还可以编写“谓词”——亦即返回布尔值的函数。
const isGrayscale = ({saturation}) => saturation === 0; const isDark = ({lightness}) => lightness < .5;
3、处理颜色数组
过滤器
JavaScript [] .filter 方法会接受一个谓词并返回一个新数组,其中包含所有“传递”的元素。我们在上一节中编写的谓词可以用在这里:
const colors = [/* ... an array of color objects ... */]; const isLight = ({lightness}) => lightness > .5; const lightColors = colors.filter(isLight);
排序
要对颜色数组进行排序,首先需要编写一个“比较器”函数。此函数接受一个数组的两个元素并返回一个数字来表示“赢家”。正数表示第一个元素应该先排序,而负数表示第二个元素应该先排序。零值表示平局。
例如,这是一个比较两种颜色亮度的函数:
const compareLightness = (a,b) => a.lightness - b.lightness;
这是一个比较饱和度的函数:
const compareSaturation = (a,b) => a.saturation - b.saturation;
为了防止代码重复,我们可以编写一个高阶函数来返回一个比较函数来对比各种属性:
const compareAttribute = attribute => (a,b) => a[attribute] - b[attribute]; const compareLightness = compareAttribute('lightness'); const compareSaturation = compareAttribute('saturation'); const compareHue = compareAttribute('hue');
平均属性
你可以搭配各种 JavaScript 数组方法来平衡颜色数组中的特定属性。首先,你可以使用 reduce 求和并用 Array length 属性分割来计算一个属性的均值:
const colors = [/* ... an array of color objects ... */]; const toSum = (a,b) => a + b; const toAttribute = attribute => element => element[attribute]; const averageOfAttribute = attribute => array => array.map(toAttribute(attribute)).reduce(toSum) / array.length;
你可以用它来“规范化”一组颜色:
/* ... continuing */ const normalizeAttribute = attribute => array => { const averageValue = averageOfAttribute(attribute)(array); const normalize = overwriteAttribute(attribute)(averageValue); return normalize(array); } const normalizeSaturation = normalizeAttribute('saturation'); const normalizeLightness = normalizeAttribute('lightness'); const normalizeHue = normalizeAttribute('hue');
4、结论
颜色是网络不可或缺的一部分。将颜色分解为属性就可以灵活控制它们,并创造出无限的可能。
查看英文原文:
https://blog.logrocket.com/how-to-manipulate-css-colors-with-javascript-fb547113a1b8
福利推荐
前端领域的技术演进一直要比其他技术快一些,这给前端工程师带来持续的挑战。这里整理了从 Vue 到 React、iOS 到 Andoid、再到前端架构体系的干货课程,带你解读从前端小工到专家的实战心法,高效解决 80% 的开发难题。
*请认真填写需求信息,我们会在24小时内与您取得联系。