js实现拾色器插件(ColorPicker)

实现一个拾色器插件(ColorPicker)主要涉及以下几个部分:HTML结构、CSS样式和JavaScript脚本。

HTML结构

在HTML中,我们需要创建一个颜色选择器的容器元素,以及一些控制颜色选择器的元素。一般来说,颜色选择器的容器是一个div元素,选择器的控制元素有颜色预览区、色调选择器、饱和度选择器、红、绿、蓝(RGB)颜色选择器以及确定和取消按钮。

具体的HTML结构可以参考以下代码片段:

<div class="color-picker-container">
  <div class="color-preview"></div>
  <div class="hue-slider"></div>
  <div class="saturation-brightness"></div>
  <div class="rgb-sliders">
    <input type="range" min="0" max="255" step="1" class="red-slider">
    <input type="range" min="0" max="255" step="1" class="green-slider">
    <input type="range" min="0" max="255" step="1" class="blue-slider">
  </div>
  <div class="color-picker-buttons">
    <button class="confirm-button">确认</button>
    <button class="cancel-button">取消</button>
  </div>
</div>

CSS样式

为了使颜色选择器的外观呈现出良好的效果,我们需要为其添加一些CSS样式。具体来说,我们需要为选择器的元素添加宽度、高度、背景色等样式,还需要为按钮等元素设置样式。

以下是针对上述HTML结构的CSS样式:

.color-picker-container {
  width: 300px;
  height: 250px;
  position: relative;
  border: 1px solid #ccc;
  background-color: #eee;
  padding: 10px;
}

.color-preview {
  width: 50px;
  height: 50px;
  float: left;
  background-color: #000;
  margin-right: 10px;
}

.hue-slider {
  width: 20px;
  height: 150px;
  background: linear-gradient(to bottom, #f00 0%, #ff0 17%, #0f0 33%, #0ff 50%, #00f 67%, #f0f 83%, #f00 100%)
}

.saturation-brightness {
  width: 130px;
  height: 150px;
  position: relative;
  background-color: #f00;
  margin-left: 10px;
}

.rgb-sliders {
  margin-top: 10px;
}

.red-slider, .green-slider, .blue-slider {
  width: 80px;
  height: 30px;
}

.color-picker-buttons {
  position: absolute;
  bottom: 0;
  right: 0;
  margin: 10px;
}

.confirm-button, .cancel-button {
  padding: 5px 10px;
  border-radius: 3px;
  border: none;
  margin-right: 5px;
}

.confirm-button {
  background-color: #007bff;
  color: #fff;
}

.cancel-button {
  background-color: #6c757d;
  color: #fff;
}

JavaScript脚本

JavaScript脚本主要用于实现用户与颜色选择器的交互,并根据用户的操作更新颜色选择器的预览和输出。以下是完整的JavaScript实现:

(function () {
  // 颜色选择器元素
  const colorPickerContainer = document.querySelector('.color-picker-container');
  // 颜色预览区元素
  const colorPreview = colorPickerContainer.querySelector('.color-preview');
  // 色调选择器元素
  const hueSlider = colorPickerContainer.querySelector('.hue-slider');
  // 饱和度选择器元素
  const saturationBrightness = colorPickerContainer.querySelector('.saturation-brightness');
  // RGB颜色选择器元素
  const redSlider = colorPickerContainer.querySelector('.red-slider');
  const greenSlider = colorPickerContainer.querySelector('.green-slider');
  const blueSlider = colorPickerContainer.querySelector('.blue-slider');
  // 确认和取消按钮
  const confirmButton = colorPickerContainer.querySelector('.confirm-button');
  const cancelButton = colorPickerContainer.querySelector('.cancel-button');

  // 当前颜色
  let currentColor = '#ffffff';

  /**
   * rgb格式转换为十六进制格式
   * @param {number} rgb - r, g 或 b 值,范围为 0-255
   * @returns {string} - 转换后的十六进制值,例如 '00' - 'ff'
   */
  function rgbToHex(rgb) {
    const hex = Number(rgb).toString(16);
    return hex.length === 1 ? '0' + hex : hex;
  }

  /**
   * 将rgb颜色值转换为十六进制格式
   * @param {number[]} rgbArray - RGB值组成的数组
   * @returns {string} - 十六进制格式的颜色值,例如 '#ffffff'
   */
  function rgbArrayToHex(rgbArray) {
    return '#' + rgbArray.map(rgbToHex).join('');
  }

  /**
   * 将十六进制颜色值转换为RGB颜色值
   * @param {string} hex - 十六进制颜色值,例如 '#ffffff'
   * @returns {number[]} - RGB颜色值,例如 [255, 255, 255]
   */
  function hexToRgbArray(hex) {
    const r = parseInt(hex.substring(1,3), 16);
    const g = parseInt(hex.substring(3,5), 16);
    const b = parseInt(hex.substring(5,7), 16);
    return [r, g, b];
  }

  /**
   * 更新颜色预览区和RGB颜色选择器
   * @param {string} color - 十六进制格式的颜色值
   */
  function updateColor(color) {
    colorPreview.style.backgroundColor = color;
    const [r, g, b] = hexToRgbArray(color);
    redSlider.value = r;
    greenSlider.value = g;
    blueSlider.value = b;
  }

  /**
   * 更新当前颜色
   * @param {string} color - 十六进制格式的颜色值
   */
  function setCurrentColor(color) {
    currentColor = color;
    updateColor(currentColor);
  }

  /**
   * 在选择器元素中定位给定的位置(页面x,y)
   * @param {HTMLElement} el - 选择器元素
   * @param {number} x - 页面x位置
   * @param {number} y - 页面y位置
   */
  function setPosition(el, x, y) {
    el.style.left = x + 'px';
    el.style.top = y + 'px';
  }

  // 初始化颜色
  setCurrentColor(currentColor);
  // 初始化位置
  setPosition(colorPickerContainer, 200, 200);

  // 色调选择器
  hueSlider.addEventListener('mousedown', function (e) {
    const sliderRect = hueSlider.getBoundingClientRect();
    const y = e.clientY - sliderRect.top;
    const h = hueSlider.offsetHeight;
    const hue = 360 - y / h * 360;
    const color = `hsl(${hue}, 100%, 50%)`;
    setCurrentColor(color);
  });

  // 饱和度和亮度选择器
  saturationBrightness.addEventListener('mousedown', function (e) {
    const sbRect = saturationBrightness.getBoundingClientRect();
    const x = e.clientX - sbRect.left;
    const y = e.clientY - sbRect.top;
    const s = x / sbRect.width;
    const b = (sbRect.height - y) / sbRect.height;
    const [r, g, b0] = hexToRgbArray(currentColor);
    const hsl = rgbToHsl(r, g, b0);
    const color = `hsl(${hsl.h}, ${(s * 100).toFixed(2)}%, ${(b * 100).toFixed(2)}%)`;
    setCurrentColor(color);
  });

  // RGB颜色选择器
  redSlider.addEventListener('input', function () {
    const [r, g, b] = hexToRgbArray(currentColor);
    const color = rgbArrayToHex([this.value, g, b]);
    setCurrentColor(color);
  });

  greenSlider.addEventListener('input', function () {
    const [r, g, b] = hexToRgbArray(currentColor);
    const color = rgbArrayToHex([r, this.value, b]);
    setCurrentColor(color);
  });

  blueSlider.addEventListener('input', function () {
    const [r, g, b] = hexToRgbArray(currentColor);
    const color = rgbArrayToHex([r, g, this.value]);
    setCurrentColor(color);
  });

  // 确认,取消按钮
  confirmButton.addEventListener('click', function () {
    console.log('确认后的颜色为:', currentColor);
  });

  cancelButton.addEventListener('click', function () {
    console.log('取消');
  });
})();

以上是完整的实现代码和效果演示,通过改变色调选择器、饱和度选择器和RGB颜色选择器,可以实时更新颜色预览区的颜色值,并且可以通过确认按钮输出最终的颜色值。以下是两个具体的示例说明:

示例1:如何将拾色器嵌入到表单中

在表单中添加一个颜色选择器,用户可以通过它选择颜色。当用户提交表单时,选定的颜色将以十六进制格式的字符串形式提交给服务器。

以下是HTML代码片段:

<form id="my-form">
  <label for="color-input">请选择颜色:</label>
  <input type="text" id="color-input" name="color">
  <input type="button" value="选择颜色" id="color-picker-button">
</form>

在JavaScript脚本中添加以下代码:

const colorInput = document.querySelector('#color-input');
const colorPickerButton = document.querySelector('#color-picker-button');
// 在按钮上添加点击事件,显示颜色选择器
colorPickerButton.addEventListener('click', function () {
  // 在表单容器中创建颜色选择器
  const colorPickerContainer = document.createElement('div');
  // 添加颜色选择器到body中
  document.body.appendChild(colorPickerContainer);
  // 初始化位置
  setPosition(colorPickerContainer, 200, 200);
  // 颜色选择器的处理逻辑
  // ...
  // 确认按钮的回调函数
  confirmButton.addEventListener('click', function () {
    const color = currentColor;
    colorInput.value = color;
    colorPickerContainer.remove();
  });
  // 取消按钮的回调函数
  cancelButton.addEventListener('click', function () {
    colorPickerContainer.remove();
  });
});

在这个例子中,我们使用了按钮来触发颜色选择器的显示。当用户选择颜色并单击确认按钮时,我们将所在的颜色值设置为输入框的值,并将颜色选择器从页面中删除。

示例2:如何创建专业的拾色器插件

如何创建一个专业的、高性能的拾色器插件?该插件可以根据浏览器的能力来适当增强自己,提供更好的用户体验。以下是具体的实现:

```
var ColorPicker = function (options) {
this.container = options.container;
this.color = options.color || '#ffffff';
this.onSelect = options.onSelect || function () {};
this.onCancel = options.onCancel || function () {};
this.init();
};

ColorPicker.prototype = {
/
* 创建DOM元素
*/
createElement: function (tag, attrs, styles) {
var el = document.createElement(tag);
for (var key in attrs) {
el.setAttribute(key, attrs[key]);
}
for (var key in styles) {
el.style[key] = styles[key];
}
return el;
},
/

* 设置元素位置
/
setPosition: function (el, x, y) {
el.style.left = x + 'px';
el.style.top = y + 'px';
},
/

* 将rgb格式转换为十六进制格式
/
rgbToHex: function (rgb) {
const hex = Number(rgb).toString(16);
return hex.length === 1 ? '0' + hex : hex;
},
/
* 将rgb颜色值转换为十六进制格式
*/
rgbArrayToHex: function (rgbArray) {
return '#' + rgbArray.map(this.rgbToHex).join('');
},
/

* 将十六进制颜色值转换为RGB颜色值
/
hexToRgbArray: function (hex) {
const r = parseInt(hex.substring(1,3), 16);
const g = parseInt(hex.substring(3,5), 16);
const b = parseInt(hex.substring(5,7), 16);
return [r, g, b];
},
/

* 更新颜色预览区和RGB颜色选择器
/
updateColor: function (color) {
this.colorPreview.style.backgroundColor = color;
const [r, g, b] = this.hexToRgbArray(color);
this.redSlider.value = r;
this.greenSlider.value = g;
this.blueSlider.value = b;
},
/
* 更新当前颜色
*/
setCurrentColor: function (color) {
this.color = color;
this.updateColor(this.color);
},
/

* 色调选择器的回调函数
/
hueSliderCallback: function (e) {
const sliderRect = this.hueSlider.getBoundingClientRect();
const y = e.clientY - sliderRect.top;
const h = this.hueSlider.offsetHeight;
const hue = 360 - y / h * 360;
const color = hsl(${hue}, 100%, 50%);
this.setCurrentColor(color);
},
/

* 饱和度和亮度选择器的回调函数
/
saturationBrightnessCallback: function (e) {
const sbRect = this.saturationBrightness.getBoundingClientRect();
const x = e.clientX - sbRect.left;
const y = e.clientY - sbRect.top;
const s = x / sbRect.width;
const b = (sbRect.height - y) / sbRect.height;
const [r, g, b0] = this.hexToRgbArray(this.color);
const hsl = rgbToHsl(r, g, b0);
const color = hsl(${hsl.h}, ${(s * 100).toFixed(2)}%, ${(b * 100).toFixed(2)}%);
this.setCurrentColor(color);
},
/
* RGB颜色选择器的回调函数
*/
rgbSlidersCallback: function () {
const [r, g, b] = this.hexToRgbArray(this.color);
const color = this.rgbArrayToHex([this.redSlider.value, this.greenSlider.value, this.blueSlider.value]);
this.setCurrentColor(color);
},
/

* 初始化拾色器
*/
init: function () {
// 创建元素
this.colorPickerContainer = this.createElement('div', { class: 'color-picker-container' });
this.colorPreview = this.createElement('div', { class: 'color-preview' });
this.hueSlider = this.createElement('div', { class: 'hue-slider' });
this.saturationBrightness = this.createElement('div', { class: 'saturation-brightness' });
this.redSlider = this.createElement('input', { class: 'red-slider', type: 'range', min: 0, max: 255, step: 1 });
this.greenSlider = this.createElement('input', { class: 'green-slider', type: 'range', min: 0, max: 255, step: 1 });
this.blueSlider = this.createElement('input', { class: 'blue-slider', type: 'range', min: 0, max: 255, step: 1 });
this.confirmButton = this.createElement('button', { class: 'confirm-button' }, { background: '#007bff', color: '#fff', padding: '5px 10px', borderRadius: '3px', border: 'none', marginRight: '5px' });
this.cancelButton = this.createElement('button', { class: 'cancel-button' }, { background: '#6c757d', color: '#fff', padding: '5px 10px', borderRadius: '3px', border: 'none' });
this.colorPickerContainer.appendChild(this.colorPreview);
this.colorPickerContainer.appendChild(this.hueSlider);
this.colorPickerContainer.appendChild(this.saturationBrightness);
this.colorPickerContainer.appendChild(this.redSlider);
this.colorPickerContainer.appendChild(this.greenSlider);
this.colorPickerContainer.appendChild

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:js实现拾色器插件(ColorPicker) - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • JavaScript实现雪花飘落效果

    下面是JavaScript实现雪花飘落效果的完整攻略。 确定页面布局和样式 在实现雪花飘落效果前,首先要确定页面布局和样式。可以在页面内添加一个div,作为雪花飘落区域,然后设置该div的样式,如设置背景颜色,宽度和高度等。 示例代码: <body> <div id="snow-area"></div>…

    css 2023年6月10日
    00
  • 深入理解移动前端开发之viewport

    深入理解移动前端开发之viewport 在进行移动端开发时,常常需要设置 viewport 来适配不同的设备。但是 viewport 的工作原理并不是那么容易理解,本文将介绍什么是 viewport,为什么需要设置 viewport 以及如何设置 viewport 以适应不同设备的屏幕。 1. 什么是viewport viewport 是网页在移动端设备上的…

    css 2023年6月10日
    00
  • 详解CSS故障艺术

    详解CSS故障艺术攻略 简介 《详解CSS故障艺术》一书讲述了许多关于CSS的奇奇怪怪的现象,通过本书的学习,你可以更好地了解CSS,并且可以进行更加灵活且高效的编码。 攻略 熟悉CSS属性 首先,我们需要掌握一些CSS属性。CSS属性是CSS的基础,熟练掌握这些属性可以让你更好地应对各种CSS故障。 例如,display属性可以用来控制元素的显示方式。po…

    css 2023年6月10日
    00
  • 全面解读Spring Boot 中的Profile配置体系

    来讲解一下“全面解读Spring Boot 中的Profile配置体系”的攻略吧! 简介 在Spring Boot中,Profile(简称环境)是一项非常重要的概念。通过使用Profile,可以让我们的应用在不同的环境下运行,比如开发环境和生产环境,从而使得应用更加灵活、更加可配置,从而能够更好地处理不同的问题。 在Spring Boot中,Profile是…

    css 2023年6月9日
    00
  • html中把多余文字转化为省略号的实现方法方法

    实现方法: 在CSS中使用text-overflow:ellipsis; 属性可以把多余的文字自动转化为省略号。需要注意的是,为了使该属性生效,需要同时设置overflow:hidden;和white-space:nowrap;属性。 示例1: <p class="ellipsis">这是一段非常非常长的文字,它可能显示不完&…

    css 2023年6月10日
    00
  • 原生JavaScript实现进度条

    下面是“原生JavaScript实现进度条”的完整攻略,包括实现过程、代码示例和具体讲解。 1. 实现过程 1.1 顶部进度条 实现顶部进度条的关键是获取当前页面的加载进度,并将其转化为进度条的宽度并实时更新,下面是代码示例: <!DOCTYPE html> <html> <head> <meta charset=&…

    css 2023年6月10日
    00
  • html+css实现图片扫描仪特效

    实现图片扫描仪特效可以通过HTML和CSS的结合来完成。下面是具体的攻略: 步骤1:准备材料 首先,我们需要准备一张需要扫描的图片,可以是本地的图片或者是远程图片。然后,根据这张图片的大小来选择生成的小图的数量,一般来说,每行生成5个到10个小图比较合适。 步骤2:创建HTML结构 接下来,我们需要创建HTML结构,以便后续加入CSS样式。我们可以创建一个d…

    css 2023年6月10日
    00
  • jQuery的animate函数学习记录

    jQuery的animate函数学习记录 本文将详细介绍 jQuery 的 animate 函数的使用方法和注意事项。 简介 animate() 方法是 jQuery 核心库中最常用的方法之一,它通常用于实现页面元素的动态效果。通过使用 animate() 方法,我们可以在一定的时间段内(如1000毫秒)逐步地改变一个元素的属性(如位置、大小、背景色等),从…

    css 2023年6月11日
    00
合作推广
合作推广
分享本页
返回顶部