JavaScript实现系统级别的取色器、EyeDropper、try、catch、finally

文章目录

  • 效果图
  • html
  • JavaScript
  • 关键代码
  • EyeDropper
  • try...catch
  • 颜色值相减(色差)的传送门


效果图

colorSelection


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语句允许您在trycatch之后执行代码,而不管结果如何。
注释:catchfinally语句都是可选的,但是在使用try语句时需要使用其中之一(如果不是同时使用)。
提示:当发生错误时,JavaScript通常会停止,并生成错误消息。请使用throw语句创建自定义错误(抛出异常)。如果将throwtrycatch一起使用,则可以控制程序流并生成自定义错误消息。
有关JavaScript错误的更多知识,请学习JavaScript错误教程。


MDN

try...catch语句标记要尝试的语句块,并指定一个出现异常时抛出的响应。


颜色值相减(色差)的传送门

JavaScript实现十六进制色差功能、十六进制颜色相减、replace、parseInt、max、toString、slice

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++学习笔记总结练习:多态与虚函数

1 多态 多态分类 静态多态&#xff0c;是只在编译期间确定的多态。静态多态在编译期间&#xff0c;根据函数参数的个数和类型推断出调用的函数。静态多态有两种实现的方式 重载。&#xff08;函数重载&#xff09;模板。 动态多态&#xff0c;是运行时多态。通过虚函数机制实…

软件工程(十八) 行为型设计模式(四)

1、状态模式 简要说明 允许一个对象在其内部改变时改变它的行为 速记关键字 状态变成类 类图如下 状态模式主要用来解决对象在多种状态转换时,需要对外输出不同的行为的问题。比如订单从待付款到待收货的咋黄台发生变化,执行的逻辑是不一样的。 所以我们将状态抽象为一…

Android OTA 相关工具(六) 使用 lpmake 打包生成 super.img

我在 《Android 动态分区详解(二) 核心模块和相关工具介绍》 介绍过 lpmake 工具&#xff0c;这款工具用于将多个分区镜像打包生成一个 Android 专用的动态分区镜像&#xff0c;一般称为 super.img。Android 编译时&#xff0c;系统会自动调用 lpmake 并传入相关参数来生成 sup…

Blender里复制对象动画

假设在Blender里有2个对象&#xff0c;其中一个添加了动画&#xff0c;另外一个没有添加动画&#xff0c;那么如何把已有的动画拷贝到没有动画的对象上呢&#xff1f; 分为2步&#xff1a; 先选中没有动画的对象&#xff0c;再按shift键选中有动画的对象&#xff0c;此时2个对…

前端(十六)——微信小程序语音转文字,文字转语音功能的实现

&#x1f60a;博主&#xff1a;小猫娃来啦 &#x1f60a;文章核心&#xff1a;微信小程序语音转文字&#xff0c;文字转语音功能的实现 文章目录 资源下载链接最关键的问题控制台报错30003语音转文字文字转语音效果图应用场景作用和优势实现思路 资源下载链接 CSDN资源下载&am…

5、Spring之Bean生命周期源码解析(销毁)

Bean的销毁过程 Bean销毁是发送在Spring容器关闭过程中的。 在Spring容器关闭时,比如: AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class); UserService userService = (UserService) context.getBean("userSe…

soundtouch库的编译与使用

源码下载 https://gitlab.com/soundtouch/soundtouch/-/archive/2.1.2/soundtouch-2.1.2.tar.bz2 SDK配置 使用vs逐个打开source下指定的三个项目文件&#xff0c;修改SDK&#xff0c;因为可能库中使用的是8.0&#xff0c;你使用的10.0 编译 打开vs&#xff0c;打开终端&am…

【记录】USSOCOM Urban3D 数据集读取与处理

Urban3D数据集内容简介 Urban3D数据集图像为正摄RGB影像&#xff0c;分辨率为50cm。 从SpaceNet上使用aws下载数据&#xff0c;文件夹结构为&#xff1a; |- 01-Provisional_Train|- GT|- GT中包含GTC&#xff0c;GTI&#xff0c;GTL.tif文件&#xff0c;GTL为ground truth b…

解决uniapp手机真机调试时找不到手机问题

1、检查 USB 调试是否开启 2、检查是否有选择 文件 传输 选项 3、如果上述都做了还找不到&#xff0c;可以看看开发者选项中的【USB设置】&#xff0c;把模式改为 MIDI 模式

【ELK日志收集系统】

目录 一、概述 1.作用 2.为什么使用&#xff1f; 二、组件 1.elasticsearch 1.1 作用 1.2 特点 2.logstash 2.1 作用 2.2 工作过程 2.3 INPUT 2.4 FILETER 2.5 OUTPUTS 3.kibana 三、架构类型 1.ELK 2.ELKK 3.ELFK 4.ELFKK 四、案例 - 构建ELK集群 1.环境…

9.1QTday3作业

1 getSaveFileName //保存文件按钮对应的槽函数 void Widget::on_save_btn_clicked() {//调用QFileDialog的静态成员函数getSaveFileName来获取选中的文件路径QString fileName QFileDialog::getSaveFileName(this,"保存文件","./","Image File(*.p…

9.2作业

QT实现闹钟 widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include<QTimerEvent> #include<QDateTime> #include<QLineEdit> #include<QLabel> #include<QPushButton> #include <QTextToSpeech> QT_BEGIN_NAMES…