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日

相关文章

  • CSS文本如何折行介绍

    以下是“CSS文本如何折行介绍”的完整攻略: CSS文本如何折行介绍 在 CSS 中,可以使用 word-wrap 和 white-space 属性来控制文本的折行方式。以下是一些常用的方法。 方法1:使用 word-wrap 属性 word-wrap 属性用于控制文本的折行方式,以下是一些常用的方法: word-wrap: normal:默认值,不允许单词…

    css 2023年5月18日
    00
  • 引入代码检查工具stylelint实战问题经验总结分享

    引入代码检查工具stylelint可以帮助我们规范化CSS代码,避免出现因细节问题导致的BUG。下面是引入stylelint工具的完整攻略: 第一步:安装stylelint npm install –save-dev stylelint stylelint-config-standard 以上命令会安装stylelint及其标准配置。如果你需要使用其他配置…

    css 2023年6月9日
    00
  • DNF暗精灵遗迹入口在哪 暗精灵遗迹进入条件介绍

    DNF暗精灵遗迹入口在哪 DNF暗精灵遗迹是游戏中非常受欢迎的副本之一,玩家们通过完成该副本可以获得游戏中的许多稀有道具和奖励。那么如何进入暗精灵遗迹呢?下面我来详细介绍一下。 找到暗精灵遗迹的入口 暗精灵遗迹的入口位置位于永恒之地中,具体位置为(373,153)。在永恒之地中使用快捷键“M”打开地图,可以很方便的找到入口。 暗精灵遗迹进入条件介绍 进入暗精…

    css 2023年6月10日
    00
  • 浅析css中使用border属性与display属性的方法

    浅析 CSS 中使用 border 属性与 display 属性的方法 什么是 border 属性? CSS border 属性用于设置 HTML 元素的边框样式、宽度和颜色。 语法 border: border-width border-style border-color; 其中,border-width 用于设置边框的宽度,默认为 0;border-s…

    css 2023年6月10日
    00
  • Dreamweaver按钮怎么添加立体阴影效果?

    添加立体阴影效果是提高网页设计质量的一个关键步骤。下面,我将为您提供详细的攻略步骤,并搭配两条示例说明。 准备工作 在添加立体阴影效果之前,需要准备一些必要的工作: 安装Photoshop软件,用于制作图像。 在Dreamweaver软件中打开需要添加立体阴影效果的按钮图像。 添加立体阴影效果 以下是添加立体阴影效果的详细步骤: 在Dreamweaver软件…

    css 2023年6月11日
    00
  • CSS网页布局全精通

    CSS网页布局全精通攻略 CSS网页布局是Web开发中的重要技能之一,它可以帮助开发者实现各种复杂的页面布局效果。本攻略将详细讲解CSS网页布局的全套技巧,包括基本原理、制作方法和示例说明。 1. 基本原理 CSS网页布局的基本原理是使用CSS的盒模型和定位属性来控制元素的位置和大小,从而实现各种复杂的页面布局效果。盒模型包括元素的内容、内边距、边框和外边距…

    css 2023年5月18日
    00
  • Flash cs6怎么使用网页格式改变文本颜色?

    针对“Flash cs6怎么使用网页格式改变文本颜色?”,以下是标准的markdown格式文本的攻略: Flash cs6怎么使用网页格式改变文本颜色? 步骤一:选中需要修改的文本 在Flash中打开需要修改颜色的文本位置,选择需要改变颜色的文本。 步骤二:打开颜色面板 在Flash中点击顶部菜单栏的“窗口” -> “颜色”,打开颜色面板。 步骤三:选…

    css 2023年6月9日
    00
  • js实现随机数小游戏

    下面是JS实现随机数小游戏的完整攻略: 需求分析 实现随机数游戏需要满足以下基本需求: 用户可以通过点击按钮开始游戏; 程序会生成一个随机数; 用户需要输入一个数进行猜测; 如果猜测的数与随机数相等,则提示用户猜对了并计算游戏时间; 如果猜测的数与随机数不相等,则提示用户猜错了并显示猜错次数,同时根据猜错次数给出提示。 实现步骤 下面是实现随机数游戏需要遵循…

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