前端如何在30秒内实现吸管拾色器?

news2024/9/22 19:34:15

yma16-logo

⭐前言

大家好,我是yma16,本文分享 前端react——实现浏览器页面的吸管拾色器功能。

背景

在chrome web端快速实现一个页面的取色器功能, 分为两个场景

  1. 固定区域小范围取色
  2. 当前页面取色

node系列往期文章
node_windows环境变量配置
node_npm发布包
linux_配置node
node_nvm安装配置
node笔记_http服务搭建(渲染html、json)
node笔记_读文件
node笔记_写文件
node笔记_连接mysql实现crud
node笔记_formidable实现前后端联调的文件上传
node笔记_koa框架介绍
node_koa路由
node_生成目录
node_读写excel
node笔记_读取目录的文件
node笔记——调用免费qq的smtp发送html格式邮箱
node实战——搭建带swagger接口文档的后端koa项目(node后端就业储备知识)
node实战——后端koa结合jwt连接mysql实现权限登录(node后端就业储备知识)
node实战——koa给邮件发送验证码并缓存到redis服务(node后端储备知识)

koa系列项目文章
前端vite+vue3结合后端node+koa——实现代码模板展示平台(支持模糊搜索+分页查询)
node+vue3+mysql前后分离开发范式——实现对数据库表的增删改查
node+vue3+mysql前后分离开发范式——实现视频文件上传并渲染

koa-vue性能监控到封装sdk系列文章
性能监控系统搭建——node_koa实现性能监控数据上报(第一章)
性能监控系统搭建——vue3实现性能监控数据展示(第二章)
性能监控计算——封装带性能计算并上报的npm包(第三章)
canvas系列文章
web canvas系列——快速入门上手绘制二维空间点、线、面
webgl canvas系列——快速加背景、抠图、加水印并下载图片
webgl canvas系列——animation中基本旋转、平移、缩放(模拟冒泡排序过程)

⭐canvas 实现区域范围的取色器

  1. 原理使用canvas的createLinearGradient绘制渐变区域
  2. 监听点击坐标值,使用canvas的getImageData获取像素颜色值
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link href="style.css" rel="stylesheet" type="text/css" />
    <title>InsCode</title>
</head>

<body>
    <div class="container">
        <img src="src/assets/logo.svg" alt="InsCode">
        <div>欢迎来到 InsCode</div>

        <p>Choose your monster's colors:</p>

    </div>

    <div>
        demo1  固定区域的颜色范围
        <div class="color-picker">
            <canvas id="colorCanvas" width="300" height="300"></canvas>
            <p id="colorValue">#000000</p>
        </div>

    </div>

    <script src="script.js"></script>
</body>

</html>

js逻辑部分

const demoOne=()=>{
    const canvas = document.getElementById('colorCanvas');
    const ctx = canvas.getContext('2d');
    const colorValue = document.getElementById('colorValue');

    // 创建渐变颜色盘
    const createGradient = () => {
        const width = canvas.width;
        const height = canvas.height;

        // 创建水平渐变
        const gradientH = ctx.createLinearGradient(0, 0, width, 0);
        gradientH.addColorStop(0, 'red');
        gradientH.addColorStop(0.16, 'yellow');
        gradientH.addColorStop(0.33, 'green');
        gradientH.addColorStop(0.5, 'cyan');
        gradientH.addColorStop(0.66, 'blue');
        gradientH.addColorStop(0.83, 'magenta');
        gradientH.addColorStop(1, 'red');
        ctx.fillStyle = gradientH;
        ctx.fillRect(0, 0, width, height);

        // 创建垂直渐变
        const gradientV = ctx.createLinearGradient(0, 0, 0, height);
        gradientV.addColorStop(0, 'rgba(255,255,255,1)');
        gradientV.addColorStop(0.5, 'rgba(255,255,255,0)');
        gradientV.addColorStop(0.5, 'rgba(0,0,0,0)');
        gradientV.addColorStop(1, 'rgba(0,0,0,1)');
        ctx.fillStyle = gradientV;
        ctx.fillRect(0, 0, width, height);
    };

    // 获取选中的颜色
    const pickColor = (event) => {
        const x = event.offsetX;
        const y = event.offsetY;
        const imageData = ctx.getImageData(x, y, 1, 1).data;
        const r = imageData[0];
        const g = imageData[1];
        const b = imageData[2];
        const hex = `#${((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1).toUpperCase()}`

        colorValue.textContent = hex;
        document.body.style.backgroundColor = hex;
    };

    // 初始化颜色盘
    createGradient();

    // 添加事件监听器
    canvas.addEventListener('click', pickColor);
}

const demoTwo=()=>{
    const canvas = document.getElementById('colorPickerCanvas');
    const ctx = canvas.getContext('2d');
    
    let isMouseDown = false;
    let colorValueInput = document.getElementById('colorValue');
    
    // 初始化画布
    function initCanvas() {
        // 填充画布背景为白色
        ctx.fillStyle = '#fff';
        ctx.fillRect(0, 0, canvas.width, canvas.height);
    }
    
    // 鼠标按下事件
    canvas.addEventListener('mousedown', function(event) {
        isMouseDown = true;
        handleColorPick(event);
    });
    
    // 鼠标移动事件
    canvas.addEventListener('mousemove', function(event) {
        if (isMouseDown) {
            handleColorPick(event);
        }
    });
    
    // 鼠标抬起事件
    canvas.addEventListener('mouseup', function() {
        isMouseDown = false;
    });
    
    // 取色函数
    function handleColorPick(event) {
        let rect = canvas.getBoundingClientRect();
        let x = event.clientX - rect.left;
        let y = event.clientY - rect.top;
    
        let imageData = ctx.getImageData(x, y, 1, 1).data;
        let color = `rgb(${imageData[0]}, ${imageData[1]}, ${imageData[2]})`;
        colorValueInput.value = color;
    }
    
    // 重置画布
    function resetCanvas() {
        initCanvas();
        colorValueInput.value = '';
    }
    
    initCanvas();
}

const demoCanvas=()=>{

    // 点击吸管工具
    document.getElementById('color-pick-button').addEventListener('click',(e)=>{
        console.log('color-pick-button',e)
        const canvas = document.getElementById("colorPickerCanvas");
        config.cavansDom = canvas
        if (canvas.getContext) {
            const ctx = canvas.getContext("2d");
            // background
            ctx.fillStyle = 'rgba(0, 0, 200, 0.5)';
            ctx.globalAlpha = 1
            ctx.fillRect(0, 0, ctx.canvas.width, ctx.canvas.height)
            const img = new Image();
            img.onload = function () {
                ctx.drawImage(img, 35, 0);
            };
            img.src = "/src/assets/csdn.png";
    
        }
        else {
            console.log('不支持canvas')
        }
    })

}

window.onload = () => {
    demoOne()
}

效果如下:
在这里插入图片描述

⭐30秒快速实现浏览器页面的吸管拾色器

原生的 color 输入自带 拾色器
标签用法

<input type="color">

效果如下
color

💖原色color输入如何调用的拾色器

color输入使用了浏览器的EyeDropper api
EyeDropper api
文档:https://developer.mozilla.org/zh-CN/docs/Web/API/EyeDropper
react 简单调用

// @ts-ignore
import { Button ,message} from "tdesign-react";
import {useRef} from 'react'
const ColorDemo=()=>{

  const divRef=useRef(null)
  const openColorPicker=()=>{
    //@ts-ignore
    if (!window.EyeDropper) {
      message.warning("你的浏览器不支持 EyeDropper API")
      return;
    }
    //@ts-ignore
    const eyeDropper = new EyeDropper();

    eyeDropper
      .open()
      .then((result:any) => {
        console.log('result.sRGBHex',result.sRGBHex)
        //@ts-ignore
        divRef.current.style.background=result.sRGBHex
      })
      .catch((e:any) => {
        console.error(e)
      });
  };
  return <>
  color picker
<div>

  <div ref={divRef} style={{width:'200px',height:'200px',background:'blue',border:'1px solid #dcdcdc',margin:'0 auto'}}>

  </div>
<br/>
  <Button onClick={openColorPicker}>打开拾色器</Button>
</div>
  </>
}
export default ColorDemo;


效果如下:
在这里插入图片描述

兼容性: 仅仅支持chrome 和 edge
在这里插入图片描述

⭐结束

本文分享到这结束,如有错误或者不足之处欢迎指出!
在这里插入图片描述

👍 点赞,是我创作的动力!

⭐️ 收藏,是我努力的方向!

✏️ 评论,是我进步的财富!

💖 最后,感谢你的阅读!

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

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

相关文章

Vue3-win7搭建vue3环境

Vue3-win7搭建vue3环境 官方要求的信息是是node.js 18.03以上。而我的环境&#xff1a;win7 x64&#xff0c; vscode 1.34。 参考网址&#xff1a; 0、基本的安装 https://blog.csdn.net/m0_49139268/article/details/126159171 a、这里有各种安装包的下载路径&#xff08;镜…

手撕C++类和对象(中)

1.类的默认成员函数 默认成员函数就是⽤⼾没有显式实现&#xff0c;编译器会⾃动⽣成的成员函数称为默认成员函数。⼀个类&#xff0c;我 们不写的情况下编译器会默认⽣成以下6个默认成员函数&#xff0c;需要注意的是这6个中最重要的是前4个&#xff0c;最 后两个取地址重载不…

[数据集][目标检测]管道漏水泄漏破损检测数据集VOC+YOLO格式2614张4类

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;2614 标注数量(xml文件个数)&#xff1a;2614 标注数量(txt文件个数)&#xff1a;2614 标注…

10天速通Tkinter库——实践项目《植物杂交实验室》

一不小心就拖更了五天&#xff0c;私密马赛。但你们知道这五天我都是怎么过的吗&#xff0c;我起早贪黑&#xff08;起不来一点&#xff09;&#xff0c;每天勤勤恳恳撸代码&#xff0c;做设计&#xff08;谁家好人用ppt做设计哇&#xff09;&#xff0c;只为完成《植物杂交实验…

Vue 和 Element Plus 弹框组件详解:从基本实现到异步数据加载与自定义内容(实战)

目录 前言1. 基本知识2. 模版3. 实战 前言 主要是通过一个按钮触发一个按钮框&#xff0c;多种方式的逻辑&#xff0c;多种场景 原先通过实战总结&#xff0c;基本的知识推荐阅读&#xff1a; 详细分析Element Plus中的ElMessageBox弹窗用法&#xff08;附Demo及模版&#x…

【STM32单片机_(HAL库)】3-4-1【中断EXTI】【智能排队控制系统】LCD1602显示字符串

1.硬件 STM32单片机最小系统LCD1602显示模块 2.软件 驱动文件添加GPIO常用函数main.c程序 #include "sys.h" #include "delay.h" #include "led.h" #include "lcd1602.h"int main(void) {HAL_Init(); /* …

摄像头实时检查程序,插入设备,自动显示画面,支持多个摄像头,支持拍照,照片放大缩小

支持的特性 插入摄像头设备后&#xff0c;无需手动选择&#xff0c;自动显示摄像头画面&#xff0c;需要预先授权支持多个摄像头切换显示多个摄像头时支持 默认显示特定名称的摄像头支持拍照支持照片放大&#xff0c;缩小 显示效果 完整代码 <!DOCTYPE html> <html…

使用 AMD GPUs 进行基于 Transformers 的时间序列预测

Using AMD GPUs for Enhanced Time Series Forecasting with Transformers — ROCm Blogs 时间序列预测&#xff08;TSF&#xff09;是信号处理、数据科学和机器学习&#xff08;ML&#xff09;等领域的关键概念。TSF 通过分析系统的过去时间模式来预测其未来行为&#xff0c;利…

私域流量升级下的新机遇——“开源 AI 智能名片S2B2C 商城小程序”与新兴技术的融合

摘要&#xff1a;本文深入探讨了随着私域流量应用的进一步升级&#xff0c;智能对话式营销持续火爆的同时&#xff0c;CEM&#xff08;客户体验管理&#xff09;、MA&#xff08;营销自动化&#xff09;、CDP&#xff08;客户数据平台&#xff09;及 DAM&#xff08;数据资产管…

《黑神话:悟空》之光线追踪技术

8月20日&#xff0c;国产单机游戏《黑神话&#xff1a;悟空》终于上市&#xff0c;并以实力演绎了爆款游戏的“盛况空前”。 这款游戏的成功&#xff0c;不仅源自对经典文学《西游记》的深刻解读与创新演绎&#xff0c;更在于其背后强大的科技力量支撑。 空间计算功不可没 土…

游戏服务器架构:基于匿名函数的高性能异步定时器系统

作者&#xff1a;码客&#xff08;ygluu 卢益贵&#xff09; 关键词&#xff1a;游戏服务器架构、匿名函数、高性能、异步定时器。 一、前言 本文主要介绍适用于MMO/RPG游戏服务端的、基于匿名函数做定时器回调函数的、高性能异步触发的定时器系统的设计方案&#xff0c;以解决…

《深入浅出WPF》读书笔记.7依赖属性和附加属性

《深入浅出WPF》读书笔记.7依赖属性和附加属性 背景 总结一下wpf依赖属性和附加属性的底层逻辑&#xff0c;方便更好的理解使用。 属性 CLR属性由来 static属性和非static属性的区别 static属性:对类有意义&#xff0c;内存只有一个实例&#xff1b; 非static属性:对类实…

WPF—LiveCharts图表

LiveCharts图表 LiveCharts是一个简单灵活、交互式以及功能强大的跨平台图表库&#xff0c;支持wpf、winform...应用程序。 快速入门 安装 在应用程序中右键引用​&#xff0c;点击管理NuGet程序包​&#xff0c;选择浏览​&#xff0c;搜索LiveChartsCore.SkiaSharpView.W…

自动驾驶-机器人-slam-定位面经和面试知识系列10之高频面试题(04)

这个博客系列会分为C STL-面经、常考公式推导和SLAM面经面试题等三个系列进行更新&#xff0c;基本涵盖了自己秋招历程被问过的面试内容&#xff08;除了实习和学校项目相关的具体细节&#xff09;。在知乎和牛客也会同步更新&#xff0c;全网同号&#xff08;lonely-stone或者…

Cortex-A7的GIC(通用中断控制器):专有名词简介

0 资料 ARM Generic Interrupt Controller Architecture version 2.0 Architecture Specification1 专有名词简介 1.1 中断状态 说明&#xff1a; Inactive&#xff1a;未激活&#xff0c;中断无效。中断非挂起或非激活。 Pending&#xff1a;挂起&#xff0c;中断有效。等待…

【Web】NepCTF 2024题解

目录 PHP_MASTER!! NepDouble 蹦蹦炸弹&#xff08;boom_it&#xff09; NepRouter-白给 Always RCE First PHP_MASTER!! PHP反序列化键值逃逸mb_strpos与mb_substr连用导致的字符注入 https://www.cnblogs.com/EddieMurphy-blogs/p/18310518 flag在phpinfo里 payloa…

1/f噪声影响及解决措施

在将6位半数字万用表输入短接时&#xff0c;观察其输出。在逐渐增加均值次数后&#xff0c;噪声开始下降&#xff0c;达到一定程度后便停止下降&#xff0c;随着时间的推移&#xff0c;停止下降的噪声在逐渐增加&#xff0c;该部分主要是1/f噪声影响。 这种1/f噪声&#xff08;…

mPLUG-Owl3环境搭建推理测试

mPLUG-Owl3环境搭建&推理测试 引子 多模态的大模型也写了很多篇&#xff0c;阿里系的之前有一篇Qwen-VL的相关部署&#xff0c;感兴趣的童鞋请移步&#xff08;Qwen-VL环境搭建&推理测试-CSDN博客&#xff09;。今天这个mPLUG-Qwl3&#xff0c;更新换代也很快&#x…

Windows下线程的竞争与资源保护(win32-API)

一、前言 在线程编程中&#xff0c;资源共享与保护是一个核心议题&#xff0c;尤其当多个线程试图同时访问同一份资源时&#xff0c;如果不采取适当的措施&#xff0c;就会引发一系列的问题&#xff0c;如数据不一致、竞态条件、死锁等。为了确保数据的一致性和线程安全&#…

【游戏速递】 小猪冲刺:萌动指尖的极速挑战,小虎鲸Scratch资源站独家献映!

在线玩&#xff1a;Scratch小猪冲刺&#xff1a;全新挑战的几何冒险游戏-小虎鲸Scratch资源站 想象一下&#xff0c;一群憨态可掬的小猪&#xff0c;穿上炫酷的装备&#xff0c;踏上了追逐梦想的赛道。它们或跳跃、或滑行&#xff0c;灵活躲避各种障碍&#xff0c;只为那终点的…