const gradientV = context.createLinearGradient(0, 0, 0, height);
gradientV.addColorStop(0, "rgba(255, 255, 255, 1)"); // white
gradientV.addColorStop(0.5, "rgba(255, 255, 255, 0)");
gradientV.addColorStop(0.5, "rgba(0, 0, 0, 0)"); // transparent
gradientV.addColorStop(1, "rgba(0, 0, 0, 1)"); // black
context.fillStyle = gradientV;
context.fillRect(0, 0, width, height);
最后,当点击画布时,需要点击颜色。这里使用的技术是定位鼠标单击事件的 x/y 位置。然后,在 x/y 位置使用 getImageData 函数获取该位置的红色、绿色和蓝色值。
ini
复制代码
canvas.addEventListener('click', e => pickColor(e, canvas, circle, selected));
function pickColor(event, canvas, circle, selected) {
const rect = event.target.getBoundingClientRect();
const x = event.clientX - rect.left;
const y = event.clientY - rect.top;
const context = canvas.getContext('2d');
const imgData = context.getImageData(x, y, 1, 1);
const [r, g, b] = imgData.data;
const [h, s, l] = rgb2hsl(r, g, b);
const selectedColor = l < 0.5 ? '#FFF' : '#000';
circle.style.top = (y - 6) + 'px';
circle.style.left = (x - 6) + 'px';
circle.style.borderColor = selectedColor;
selected.innerText = Object.values(toCss(r,g,b,h,s,l))
.toString().replace(/\)\,/g, ') ');
selected.style.backgroundColor = toCss(r,g,b,h,s,l).hex;
selected.style.color = selectedColor;
canvas.dispatchEvent(new CustomEvent('color-selected', {
bubbles: true, detail: {r, g, b, h, s, l}
}));
}