文章目录
- 效果图
- html
- JavaScript
- 关键代码
- EyeDropper
- try...catch
- 颜色值相减(色差)的传送门
效果图
html
<div class="d_f fd_c ai_c">
<button id="idBtn" class="cursor_pointer">开始取色</button>
<div id="idBox" class="m_t_20 w_168 h_68 d_f fd_c jc_c ta_c fw_700"></div>
</div>
JavaScript
(function () {
let btn = document.querySelector('#idBtn');
btn.onclick = async () => {
let idBox = document.querySelector('#idBox'),
dropper = new EyeDropper();
idBox.style.backgroundColor = '';
idBox.style.border = `6px solid transparent`;
idBox.innerHTML = '';
try {
let { sRGBHex } = await dropper.open(),
{ hexadecimal, rgb } = subtractColors('ffffff', sRGBHex),
{ r, g, b } = hexToRgb(sRGBHex);
idBox.style.backgroundColor = sRGBHex;
idBox.style.border = `6px solid ${hexadecimal}`;
idBox.innerHTML = `
<div style="color: ${hexadecimal}">${sRGBHex}</div>
<div style="color: rgb(${rgb})">${r}, ${g}, ${b}</div>
`;
} catch (error) {
console.log(error);
}
}
})();
/**
* 将十六进制颜色转换为RGB格式
* @param {string} hex 十六进制颜色值
* @return {string} {r, g, b} 返回最终结果
*/
function hexToRgb(hex) {
// 去掉可能的#字符
hex = hex.replace(/^#/, '');
// 如果是缩写形式的颜色值(如 #FFF),则将其扩展为完整形式
if (hex.length === 3) hex = hex.replace(/(.)/g, '$1$1');
// 解析RGB值
let bigint = parseInt(hex, 16),
r = (bigint >> 16) & 255,
g = (bigint >> 8) & 255,
b = bigint & 255;
return { r, g, b };
}
/**
* 两种颜色相减后的值
* @param {string} color1 颜色1(主颜色,一般是大值)
* @param {string} color2 颜色2
* @return {object} { hexadecimal, rgb } 返回十六进制和rgb值
*/
function subtractColors(color1, color2) {
let rgb1 = hexToRgb(color1),
rgb2 = hexToRgb(color2),
r = rgb1.r - rgb2.r,
g = rgb1.g - rgb2.g,
b = rgb1.b - rgb2.b,
reslut = (val) => Math.max(0, val);
// 将RGB结果转换为十六进制格式
return {
hexadecimal: `#${(1 << 24 | reslut(r) << 16 | reslut(g) << 8 | reslut(b)).toString(16).slice(1)}`,
rgb: `${r}, ${g}, ${b}`
};
}
关键代码
new EyeDropper();
EyeDropper
MDN
安全上下文: 此项功能仅在一些支持的浏览器的安全上下文(
HTTPS
)中可用。
实验性: 这是一项实验性技术
在将其用于生产之前,请仔细检查浏览器兼容性表格。
EyeDropper
接口表示一个拾色器工具的实例,用户可以打开并使用它从屏幕上选择颜色。
try…catch
w3school
定义和用法
try
/catch
/finally
语句处理代码块中可能发生的部分或全部错误,同时仍在运行代码。
错误可能是程序员造成的编码错误、错误输入导致的错误以及其他不可预见的情况。
try
语句允许您定义要在执行时测试错误的代码块。
如果try
块中发生错误,catch
语句允许您定义要执行的代码块。
finally
语句允许您在try
和catch
之后执行代码,而不管结果如何。
注释:catch
和finally
语句都是可选的,但是在使用try
语句时需要使用其中之一(如果不是同时使用)。
提示:当发生错误时,JavaScript
通常会停止,并生成错误消息。请使用throw
语句创建自定义错误(抛出异常)。如果将throw
与try
和catch
一起使用,则可以控制程序流并生成自定义错误消息。
有关JavaScript
错误的更多知识,请学习JavaScript
错误教程。
MDN
try...catch
语句标记要尝试的语句块,并指定一个出现异常时抛出的响应。
颜色值相减(色差)的传送门
JavaScript实现十六进制色差功能、十六进制颜色相减、replace、parseInt、max、toString、slice