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

打印 上一主题 下一主题

主题 969|帖子 969|积分 2922


⭐媒介

各人好,我是yma16,本文分享 前端react——实现浏览器页面的吸管拾色器功能。
配景
   在chrome web端快速实现一个页面的取色器功能, 分为两个场景
  

  • 固定区域小范围取色
  • 当前页面取色
  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 实现区域范围的取色器


  • 原理使用canvas的createLinearGradient绘制渐变区域
  • 监听点击坐标值,使用canvas的getImageData获取像素颜色值
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7.     <link href="style.css" rel="stylesheet" type="text/css" />
  8.     <title>InsCode</title>
  9. </head>
  10. <body>
  11.     <div class="container">
  12.         <img src="src/assets/logo.svg" alt="InsCode">
  13.         <div>欢迎来到 InsCode</div>
  14.         <p>Choose your monster's colors:</p>
  15.     </div>
  16.     <div>
  17.         demo1  固定区域的颜色范围
  18.         <div class="color-picker">
  19.             <canvas id="colorCanvas" width="300" height="300"></canvas>
  20.             <p id="colorValue">#000000</p>
  21.         </div>
  22.     </div>
  23.     <script src="script.js"></script>
  24. </body>
  25. </html>
复制代码
js逻辑部分
  1. const demoOne=()=>{
  2.     const canvas = document.getElementById('colorCanvas');
  3.     const ctx = canvas.getContext('2d');
  4.     const colorValue = document.getElementById('colorValue');
  5.     // 创建渐变颜色盘
  6.     const createGradient = () => {
  7.         const width = canvas.width;
  8.         const height = canvas.height;
  9.         // 创建水平渐变
  10.         const gradientH = ctx.createLinearGradient(0, 0, width, 0);
  11.         gradientH.addColorStop(0, 'red');
  12.         gradientH.addColorStop(0.16, 'yellow');
  13.         gradientH.addColorStop(0.33, 'green');
  14.         gradientH.addColorStop(0.5, 'cyan');
  15.         gradientH.addColorStop(0.66, 'blue');
  16.         gradientH.addColorStop(0.83, 'magenta');
  17.         gradientH.addColorStop(1, 'red');
  18.         ctx.fillStyle = gradientH;
  19.         ctx.fillRect(0, 0, width, height);
  20.         // 创建垂直渐变
  21.         const gradientV = ctx.createLinearGradient(0, 0, 0, height);
  22.         gradientV.addColorStop(0, 'rgba(255,255,255,1)');
  23.         gradientV.addColorStop(0.5, 'rgba(255,255,255,0)');
  24.         gradientV.addColorStop(0.5, 'rgba(0,0,0,0)');
  25.         gradientV.addColorStop(1, 'rgba(0,0,0,1)');
  26.         ctx.fillStyle = gradientV;
  27.         ctx.fillRect(0, 0, width, height);
  28.     };
  29.     // 获取选中的颜色
  30.     const pickColor = (event) => {
  31.         const x = event.offsetX;
  32.         const y = event.offsetY;
  33.         const imageData = ctx.getImageData(x, y, 1, 1).data;
  34.         const r = imageData[0];
  35.         const g = imageData[1];
  36.         const b = imageData[2];
  37.         const hex = `#${((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1).toUpperCase()}`
  38.         colorValue.textContent = hex;
  39.         document.body.style.backgroundColor = hex;
  40.     };
  41.     // 初始化颜色盘
  42.     createGradient();
  43.     // 添加事件监听器
  44.     canvas.addEventListener('click', pickColor);
  45. }
  46. const demoTwo=()=>{
  47.     const canvas = document.getElementById('colorPickerCanvas');
  48.     const ctx = canvas.getContext('2d');
  49.    
  50.     let isMouseDown = false;
  51.     let colorValueInput = document.getElementById('colorValue');
  52.    
  53.     // 初始化画布
  54.     function initCanvas() {
  55.         // 填充画布背景为白色
  56.         ctx.fillStyle = '#fff';
  57.         ctx.fillRect(0, 0, canvas.width, canvas.height);
  58.     }
  59.    
  60.     // 鼠标按下事件
  61.     canvas.addEventListener('mousedown', function(event) {
  62.         isMouseDown = true;
  63.         handleColorPick(event);
  64.     });
  65.    
  66.     // 鼠标移动事件
  67.     canvas.addEventListener('mousemove', function(event) {
  68.         if (isMouseDown) {
  69.             handleColorPick(event);
  70.         }
  71.     });
  72.    
  73.     // 鼠标抬起事件
  74.     canvas.addEventListener('mouseup', function() {
  75.         isMouseDown = false;
  76.     });
  77.    
  78.     // 取色函数
  79.     function handleColorPick(event) {
  80.         let rect = canvas.getBoundingClientRect();
  81.         let x = event.clientX - rect.left;
  82.         let y = event.clientY - rect.top;
  83.    
  84.         let imageData = ctx.getImageData(x, y, 1, 1).data;
  85.         let color = `rgb(${imageData[0]}, ${imageData[1]}, ${imageData[2]})`;
  86.         colorValueInput.value = color;
  87.     }
  88.    
  89.     // 重置画布
  90.     function resetCanvas() {
  91.         initCanvas();
  92.         colorValueInput.value = '';
  93.     }
  94.    
  95.     initCanvas();
  96. }
  97. const demoCanvas=()=>{
  98.     // 点击吸管工具
  99.     document.getElementById('color-pick-button').addEventListener('click',(e)=>{
  100.         console.log('color-pick-button',e)
  101.         const canvas = document.getElementById("colorPickerCanvas");
  102.         config.cavansDom = canvas
  103.         if (canvas.getContext) {
  104.             const ctx = canvas.getContext("2d");
  105.             // background
  106.             ctx.fillStyle = 'rgba(0, 0, 200, 0.5)';
  107.             ctx.globalAlpha = 1
  108.             ctx.fillRect(0, 0, ctx.canvas.width, ctx.canvas.height)
  109.             const img = new Image();
  110.             img.onload = function () {
  111.                 ctx.drawImage(img, 35, 0);
  112.             };
  113.             img.src = "/src/assets/csdn.png";
  114.    
  115.         }
  116.         else {
  117.             console.log('不支持canvas')
  118.         }
  119.     })
  120. }
  121. window.onload = () => {
  122.     demoOne()
  123. }
复制代码
结果如下:

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

原生的 color 输入自带 拾色器
标签用法
  1. <input type="color">
复制代码
结果如下

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

大连全瓷种植牙齿制作中心

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表