颜色选择器是前端交互中常见的功能组件,很多场景都需要用户自定义选择颜色,比如主题设置、绘图工具、表单配置等。原生JavaScript提供了多种方式实现颜色选择能力,既可以使用内置的input标签快速实现,也可以自定义绘制交互面板满足个性化需求。

一、使用原生input type color快速实现
如果只是需要基础的颜色选择功能,不需要自定义样式,直接使用HTML5提供的<input type="color">标签是最简单的方式,JavaScript只需要监听它的change事件就能获取选中的颜色值。
<!-- 原生颜色选择器结构 -->
<input type="color" id="nativeColorPicker" value="#ff0000">
<p>选中的颜色:<span id="colorShow">#ff0000</span></p>
<div id="colorBlock" style="width: 100px; height: 100px; background-color: #ff0000;"></div>
<script>
// 获取DOM元素
const colorPicker = document.getElementById('nativeColorPicker');
const colorShow = document.getElementById('colorShow');
const colorBlock = document.getElementById('colorBlock');
// 监听颜色变化事件
colorPicker.addEventListener('change', function(e) {
const selectedColor = e.target.value;
// 更新显示的颜色值和色块
colorShow.textContent = selectedColor;
colorBlock.style.backgroundColor = selectedColor;
});
</script>这种方式实现成本极低,但是样式完全由浏览器决定,无法自定义面板的外观和交互逻辑,适合对样式没有特殊要求的场景。
二、自定义Canvas颜色选择器实现
如果需要自定义颜色面板的样式、添加更多交互功能,可以通过Canvas绘制颜色面板,结合鼠标事件监听实现完整的颜色选择逻辑。
2.1 基础实现步骤
- 创建Canvas画布,绘制颜色渐变面板
- 监听Canvas的鼠标点击、移动事件,获取鼠标位置对应的颜色值
- 实时显示选中的颜色,支持颜色值格式转换
2.2 完整实现代码
// 获取Canvas元素和上下文
const canvas = document.getElementById('colorCanvas');
const ctx = canvas.getContext('2d');
const canvasWidth = canvas.width;
const canvasHeight = canvas.height;
// 绘制颜色面板:横向是色相,纵向是亮度/饱和度变化
function drawColorPanel() {
// 横向绘制色相渐变(0-360度)
const hueGradient = ctx.createLinearGradient(0, 0, canvasWidth, 0);
hueGradient.addColorStop(0, '#ff0000');
hueGradient.addColorStop(1/6, '#ffff00');
hueGradient.addColorStop(2/6, '#00ff00');
hueGradient.addColorStop(3/6, '#00ffff');
hueGradient.addColorStop(4/6, '#0000ff');
hueGradient.addColorStop(5/6, '#ff00ff');
hueGradient.addColorStop(1, '#ff0000');
ctx.fillStyle = hueGradient;
ctx.fillRect(0, 0, canvasWidth, canvasHeight);
// 纵向绘制亮度/饱和度渐变
const saturationGradient = ctx.createLinearGradient(0, 0, 0, canvasHeight);
saturationGradient.addColorStop(0, 'rgba(255,255,255,1)');
saturationGradient.addColorStop(0.5, 'rgba(255,255,255,0)');
saturationGradient.addColorStop(1, 'rgba(0,0,0,1)');
ctx.fillStyle = saturationGradient;
ctx.fillRect(0, 0, canvasWidth, canvasHeight);
}
// 根据鼠标位置获取颜色值
function getColorAtPosition(x, y) {
const pixel = ctx.getImageData(x, y, 1, 1).data;
const r = pixel[0];
const g = pixel[1];
const b = pixel[2];
return { r, g, b };
}
// RGB转十六进制颜色值
function rgbToHex(r, g, b) {
const toHex = (c) => {
const hex = c.toString(16);
return hex.length === 1 ? '0' + hex : hex;
};
return '#' + toHex(r) + toHex(g) + toHex(b);
}
// 初始化绘制面板
drawColorPanel();
// 监听Canvas点击事件
canvas.addEventListener('click', function(e) {
const rect = canvas.getBoundingClientRect();
const x = e.clientX - rect.left;
const y = e.clientY - rect.top;
// 获取选中颜色
const color = getColorAtPosition(x, y);
const hexColor = rgbToHex(color.r, color.g, color.b);
// 更新显示
document.getElementById('selectedHex').textContent = hexColor;
document.getElementById('selectedRgb').textContent = `rgb(${color.r}, ${color.g}, ${color.b})`;
document.getElementById('colorPreview').style.backgroundColor = hexColor;
});对应的HTML结构如下:
<canvas id="colorCanvas" width="300" height="200" style="border: 1px solid #ccc; cursor: crosshair;"></canvas> <div style="margin-top: 10px;"> <p>十六进制颜色:<span id="selectedHex">#ff0000</span></p> <p>RGB颜色:<span id="selectedRgb">rgb(255, 0, 0)</span></p> <div id="colorPreview" style="width: 50px; height: 50px; background-color: #ff0000; border: 1px solid #ccc;"></div> </div>
三、两种实现方式的选择建议
| 实现方式 | 优势 | 不足 | 适用场景 |
|---|---|---|---|
| 原生input type color | 实现简单,无需额外代码,兼容性好 | 样式不可自定义,功能固定 | 简单表单、无样式要求的颜色选择场景 |
| Canvas自定义实现 | 样式可完全自定义,可扩展更多功能(如透明度选择、预设颜色等) | 实现成本较高,需要处理更多交互逻辑 | 个性化UI、复杂交互的颜色选择场景 |
实际开发中可以根据自己的需求选择合适的实现方式,如果对样式没有特殊要求,优先使用原生input标签可以减少开发工作量;如果需要匹配项目的独特设计风格,自定义Canvas实现会更灵活。
JavaScript颜色选择器Canvasinput_type_colorRGB转十六进制修改时间:2026-05-29 23:57:01