0


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

yma16-logo

⭐前言

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

背景

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

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

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

  1. 原理使用canvas的createLinearGradient绘制渐变区域
  2. 监听点击坐标值,使用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. let isMouseDown = false;
  50. let colorValueInput = document.getElementById('colorValue');
  51. // 初始化画布
  52. function initCanvas() {
  53. // 填充画布背景为白色
  54. ctx.fillStyle = '#fff';
  55. ctx.fillRect(0, 0, canvas.width, canvas.height);
  56. }
  57. // 鼠标按下事件
  58. canvas.addEventListener('mousedown', function(event) {
  59. isMouseDown = true;
  60. handleColorPick(event);
  61. });
  62. // 鼠标移动事件
  63. canvas.addEventListener('mousemove', function(event) {
  64. if (isMouseDown) {
  65. handleColorPick(event);
  66. }
  67. });
  68. // 鼠标抬起事件
  69. canvas.addEventListener('mouseup', function() {
  70. isMouseDown = false;
  71. });
  72. // 取色函数
  73. function handleColorPick(event) {
  74. let rect = canvas.getBoundingClientRect();
  75. let x = event.clientX - rect.left;
  76. let y = event.clientY - rect.top;
  77. let imageData = ctx.getImageData(x, y, 1, 1).data;
  78. let color = `rgb(${imageData[0]}, ${imageData[1]}, ${imageData[2]})`;
  79. colorValueInput.value = color;
  80. }
  81. // 重置画布
  82. function resetCanvas() {
  83. initCanvas();
  84. colorValueInput.value = '';
  85. }
  86. initCanvas();
  87. }
  88. const demoCanvas=()=>{
  89. // 点击吸管工具
  90. document.getElementById('color-pick-button').addEventListener('click',(e)=>{
  91. console.log('color-pick-button',e)
  92. const canvas = document.getElementById("colorPickerCanvas");
  93. config.cavansDom = canvas
  94. if (canvas.getContext) {
  95. const ctx = canvas.getContext("2d");
  96. // background
  97. ctx.fillStyle = 'rgba(0, 0, 200, 0.5)';
  98. ctx.globalAlpha = 1
  99. ctx.fillRect(0, 0, ctx.canvas.width, ctx.canvas.height)
  100. const img = new Image();
  101. img.onload = function () {
  102. ctx.drawImage(img, 35, 0);
  103. };
  104. img.src = "/src/assets/csdn.png";
  105. }
  106. else {
  107. console.log('不支持canvas')
  108. }
  109. })
  110. }
  111. window.onload = () => {
  112. demoOne()
  113. }

效果如下:

在这里插入图片描述

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

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

登录后复制

  1. <input type="color">

效果如下

color

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

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

登录后复制

  1. // @ts-ignore
  2. import { Button ,message} from "tdesign-react";
  3. import {useRef} from 'react'
  4. const ColorDemo=()=>{
  5. const divRef=useRef(null)
  6. const openColorPicker=()=>{
  7. //@ts-ignore
  8. if (!window.EyeDropper) {
  9. message.warning("你的浏览器不支持 EyeDropper API")
  10. return;
  11. }
  12. //@ts-ignore
  13. const eyeDropper = new EyeDropper();
  14. eyeDropper
  15. .open()
  16. .then((result:any) => {
  17. console.log('result.sRGBHex',result.sRGBHex)
  18. //@ts-ignore
  19. divRef.current.style.background=result.sRGBHex
  20. })
  21. .catch((e:any) => {
  22. console.error(e)
  23. });
  24. };
  25. return <>
  26. color picker
  27. <div>
  28. <div ref={divRef} style={{width:'200px',height:'200px',background:'blue',border:'1px solid #dcdcdc',margin:'0 auto'}}>
  29. </div>
  30. <br/>
  31. <Button onClick={openColorPicker}>打开拾色器</Button>
  32. </div>
  33. </>
  34. }
  35. export default ColorDemo;

效果如下:

在这里插入图片描述

兼容性: 仅仅支持chrome 和 edge

在这里插入图片描述

⭐结束

本文分享到这结束,如有错误或者不足之处欢迎指出!

在这里插入图片描述

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

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

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

💖 最后,感谢你的阅读!

标签: 前端

本文转载自: https://blog.csdn.net/cnzzs/article/details/141875617
版权归原作者 egzosn 所有, 如有侵权,请联系我们删除。

“前端如何在30秒内实现吸管拾色器?”的评论:

还没有评论