Picked colors

Clear All

JavaScript

const colorPickerBtn = document.querySelector(\\\"#color-picker\\\");const clearAll = document.querySelector(\\\".clear-all\\\");const colorList = document.querySelector(\\\".all-colors\\\");const pickedColors = JSON.parse(localStorage.getItem(\\\"picked-colors\\\") || \\\"[]\\\");const copyColor = (elem) => {    elem.innerText = \\\"Copied\\\";    navigator.clipboard.writeText(elem.dataset.color);    setTimeout(() => elem.innerText = elem.dataset.color, 1000);}const showColor = () => {    if (!pickedColors.length) return;    colorList.innerHTML = pickedColors.map(color => `        
  • ${color}
  • `).join(\\\"\\\"); document.querySelector(\\\".picked-colors\\\").classList.remove(\\\"hide\\\"); document.querySelectorAll(\\\".color\\\").forEach(li => { li.addEventListener(\\\"click\\\", e => copyColor(e.currentTarget.lastElementChild)); });}showColor();const activateEyeDropper = () => { document.body.style.display = \\\"none\\\"; setTimeout(async () => { try { const eyeDropper = new EyeDropper(); const { sRGBHex } = await eyeDropper.open(); navigator.clipboard.writeText(sRGBHex); if (!pickedColors.includes(sRGBHex)) { pickedColors.push(sRGBHex); localStorage.setItem(\\\"picked-colors\\\", JSON.stringify(pickedColors)); showColor(); } } catch (error) { alert(\\\"Failed to copy the color code!\\\"); } document.body.style.display = \\\"block\\\"; }, 10);}const clearAllColors = () => { pickedColors.length = 0; localStorage.setItem(\\\"picked-colors\\\", JSON.stringify(pickedColors)); document.querySelector(\\\".picked-colors\\\").classList.add(\\\"hide\\\");}clearAll.addEventListener(\\\"click\\\", clearAllColors);colorPickerBtn.addEventListener(\\\"click\\\", activateEyeDropper);

    CSS

    @import url(\\'https://fonts.googleapis.com/css2?family=Poppins:wght@400;500;600&display=swap\\');* {  margin: 0;  padding: 0;  box-sizing: border-box;  font-family: \\\"Poppins\\\", sans-serif;}.popup {  width: 350px;  background: #fff;}.popup :where(.picker, header, .all-colors) {  display: flex;  align-items: center;}.popup .picker {  padding: 30px 0;  background: #E3F2FD;  justify-content: center;}.picker #color-picker {  border: none;  outline: none;  color: #fff;  font-size: 1rem;  cursor: pointer;  padding: 10px 20px;  border-radius: 5px;  background: #5372F0;  transition: 0.3s ease;}#color-picker:hover {  background: #2c52ed;}.picked-colors {  margin: 10px 15px;}.picked-colors header {  justify-content: space-between;}header .title {  font-size: 1rem;}header .clear-all {  cursor: pointer;  font-size: 0.9rem;  color: #5372F0;}header .clear-all:hover {  color: #143feb;}.picked-colors.hide {  display: none;}.picked-colors .all-colors {  flex-wrap: wrap;  list-style: none;  margin: 10px 0 15px;}.all-colors .color {  display: flex;  cursor: pointer;  margin-bottom: 10px;  width: calc(100% / 3);}.all-colors .rect {  height: 21px;  width: 21px;  display: block;  margin-right: 8px;  border-radius: 5px;}.all-colors .color span {  font-size: 0.96rem;  font-weight: 500;  text-transform: uppercase;  font-family: \\\"Open sans\\\";}

    现场演示

    您可以按照上面的安装说明在本地测试扩展。安装后,扩展程序的弹出窗口将允许您选择颜色并管理您的颜色历史记录。

    结论

    此颜色选择器扩展演示了如何将 EyeDropper API 集成到浏览器扩展中,为用户提供了一个方便的颜色选择和管理工具。无论您是设计师还是喜欢使用颜色的人,此扩展都可以增强您的工作流程。

    制作人员

    作者

    Abhishek Gurjar 是一位专注的 Web 开发人员,热衷于创建实用且功能齐全的 Web 应用程序。在 GitHub 上查看他的更多项目。

    ","image":"http://www.luping.net/uploads/20240916/172648405066e80e527c1e7.jpg","datePublished":"2024-11-01T06:40:36+08:00","dateModified":"2024-11-01T06:40:36+08:00","author":{"@type":"Person","name":"luping.net","url":"https://www.luping.net/articlelist/0_1.html"}}
    ”工欲善其事,必先利其器。“—孔子《论语.录灵公》
    首页 > 编程 > 构建颜色选择器扩展

    构建颜色选择器扩展

    发布于2024-11-01
    浏览:423

    Building a Color Picker Extension

    介绍

    在这篇博文中,我们将探索如何创建一个简单但功能强大的颜色选择器浏览器扩展。此扩展允许用户轻松地从屏幕上选择颜色,查看所选颜色的历史记录,并通过简单的交互来管理调色板。

    项目概况

    颜色选择器扩展提供了一个用户友好的界面:

    • 使用 EyeDropper API 从屏幕上选取颜色。
    • 查看所选颜色的历史记录。
    • 将颜色代码复制到剪贴板。
    • 清除所有选取的颜色。

    特征

    • 颜色选择:使用 EyeDropper API 从屏幕的任何部分选择颜色。
    • 颜色历史记录:维护易于访问的所选颜色列表。
    • 剪贴板复制:快速复制颜色代码到剪贴板。
    • 全部清除:只需单击一下即可从历史记录中删除所有颜色。

    使用的技术

    • HTML:扩展程序弹出窗口的标记。
    • CSS:弹出窗口及其元素的样式。
    • JavaScript:处理颜色拾取、显示颜色历史记录以及管理剪贴板操作。
    • EyeDropper API:允许从屏幕上选取颜色。
    • localStorage:存储跨会话选择的颜色。

    项目结构

    1. HTML (index.html):包含颜色选择器界面的结构。
    2. CSS (style.css):设置弹出窗口及其元素的样式。
    3. JavaScript (script.js):管理诸如选择颜色、显示颜色以及与本地存储交互等功能。
    4. Manifest (manifest.json):定义扩展的元数据和配置。

    安装

    本地测试扩展:

    1. 将文件保存到目录中。
    2. 打开 Chrome 并导航至 chrome://extensions/。
    3. 启用“开发者模式”(右上角切换)。
    4. 点击“加载解压”并选择您的项目目录。

    用法

    1. 单击扩展弹出窗口中的“选择颜色”按钮以激活颜色选择器。
    2. 从屏幕上的任意位置选择颜色。
    3. 在弹出窗口中查看选取的颜色,然后单击任何颜色将其代码复制到剪贴板。
    4. 单击“全部清除”可从历史记录中删除所有颜色。

    代码说明

    超文本标记语言

    
    
        
        
    
    
        
    
    
    

    JavaScript

    const colorPickerBtn = document.querySelector("#color-picker");
    const clearAll = document.querySelector(".clear-all");
    const colorList = document.querySelector(".all-colors");
    const pickedColors = JSON.parse(localStorage.getItem("picked-colors") || "[]");
    
    const copyColor = (elem) => {
        elem.innerText = "Copied";
        navigator.clipboard.writeText(elem.dataset.color);
        setTimeout(() => elem.innerText = elem.dataset.color, 1000);
    }
    
    const showColor = () => {
        if (!pickedColors.length) return;
        colorList.innerHTML = pickedColors.map(color => `
            
  • ${color}
  • `).join(""); document.querySelector(".picked-colors").classList.remove("hide"); document.querySelectorAll(".color").forEach(li => { li.addEventListener("click", e => copyColor(e.currentTarget.lastElementChild)); }); } showColor(); const activateEyeDropper = () => { document.body.style.display = "none"; setTimeout(async () => { try { const eyeDropper = new EyeDropper(); const { sRGBHex } = await eyeDropper.open(); navigator.clipboard.writeText(sRGBHex); if (!pickedColors.includes(sRGBHex)) { pickedColors.push(sRGBHex); localStorage.setItem("picked-colors", JSON.stringify(pickedColors)); showColor(); } } catch (error) { alert("Failed to copy the color code!"); } document.body.style.display = "block"; }, 10); } const clearAllColors = () => { pickedColors.length = 0; localStorage.setItem("picked-colors", JSON.stringify(pickedColors)); document.querySelector(".picked-colors").classList.add("hide"); } clearAll.addEventListener("click", clearAllColors); colorPickerBtn.addEventListener("click", activateEyeDropper);

    CSS

    @import url('https://fonts.googleapis.com/css2?family=Poppins:wght@400;500;600&display=swap');
    * {
      margin: 0;
      padding: 0;
      box-sizing: border-box;
      font-family: "Poppins", sans-serif;
    }
    .popup {
      width: 350px;
      background: #fff;
    }
    .popup :where(.picker, header, .all-colors) {
      display: flex;
      align-items: center;
    }
    .popup .picker {
      padding: 30px 0;
      background: #E3F2FD;
      justify-content: center;
    }
    .picker #color-picker {
      border: none;
      outline: none;
      color: #fff;
      font-size: 1rem;
      cursor: pointer;
      padding: 10px 20px;
      border-radius: 5px;
      background: #5372F0;
      transition: 0.3s ease;
    }
    #color-picker:hover {
      background: #2c52ed;
    }
    .picked-colors {
      margin: 10px 15px;
    }
    .picked-colors header {
      justify-content: space-between;
    }
    header .title {
      font-size: 1rem;
    }
    header .clear-all {
      cursor: pointer;
      font-size: 0.9rem;
      color: #5372F0;
    }
    header .clear-all:hover {
      color: #143feb;
    }
    .picked-colors.hide {
      display: none;
    }
    .picked-colors .all-colors {
      flex-wrap: wrap;
      list-style: none;
      margin: 10px 0 15px;
    }
    .all-colors .color {
      display: flex;
      cursor: pointer;
      margin-bottom: 10px;
      width: calc(100% / 3);
    }
    .all-colors .rect {
      height: 21px;
      width: 21px;
      display: block;
      margin-right: 8px;
      border-radius: 5px;
    }
    .all-colors .color span {
      font-size: 0.96rem;
      font-weight: 500;
      text-transform: uppercase;
      font-family: "Open sans";
    }
    

    现场演示

    您可以按照上面的安装说明在本地测试扩展。安装后,扩展程序的弹出窗口将允许您选择颜色并管理您的颜色历史记录。

    结论

    此颜色选择器扩展演示了如何将 EyeDropper API 集成到浏览器扩展中,为用户提供了一个方便的颜色选择和管理工具。无论您是设计师还是喜欢使用颜色的人,此扩展都可以增强您的工作流程。

    制作人员

    • EyeDropper API:提供从屏幕上选取颜色的功能。
    • Poppins 字体:用于设置弹出窗口中文本的样式。

    作者

    Abhishek Gurjar 是一位专注的 Web 开发人员,热衷于创建实用且功能齐全的 Web 应用程序。在 GitHub 上查看他的更多项目。

    版本声明 本文转载于:https://dev.to/abhishekgurjar/building-a-color-picker-extension-20i9?1如有侵犯,请联系[email protected]删除
    最新教程 更多>
    • 为什么Microsoft Visual C ++无法正确实现两台模板的实例?
      为什么Microsoft Visual C ++无法正确实现两台模板的实例?
      The Mystery of "Broken" Two-Phase Template Instantiation in Microsoft Visual C Problem Statement:Users commonly express concerns that Micro...
      编程 发布于2025-03-12
    • UTF-8 vs. Latin-1:字符编码大揭秘!
      UTF-8 vs. Latin-1:字符编码大揭秘!
      [utf-8和latin1 在他们的应用中,出现了一个基本问题:什么辨别特征区分了这两个编码?超出其字符表现能力,UTF-8具有额外的几个优势。从历史上看,MySQL对UTF-8的支持仅限于每个字符的三个字节,这阻碍了基本多语言平面(BMP)之外的字符的表示。但是,随着MySQL 5.5的出现,...
      编程 发布于2025-03-12
    • 大批
      大批
      [2 数组是对象,因此它们在JS中也具有方法。 切片(开始):在新数组中提取部分数组,而无需突变原始数组。 令ARR = ['a','b','c','d','e']; // USECASE:提取直到索引作...
      编程 发布于2025-03-12
    • 如何在Java字符串中有效替换多个子字符串?
      如何在Java字符串中有效替换多个子字符串?
      在java 中有效地替换多个substring,需要在需要替换一个字符串中的多个substring的情况下,很容易求助于重复应用字符串的刺激力量。 However, this can be inefficient for large strings or when working with nu...
      编程 发布于2025-03-12
    • Part SQL注入系列:高级SQL注入技巧详解
      Part SQL注入系列:高级SQL注入技巧详解
      [2 Waymap pentesting工具:单击此处 trixsec github:单击此处 trixsec电报:单击此处 高级SQL注入利用 - 第7部分:尖端技术和预防 欢迎参与我们SQL注入系列的第7部分!该分期付款将攻击者采用的高级SQL注入技术 1。高...
      编程 发布于2025-03-12
    • 为什么PYTZ最初显示出意外的时区偏移?
      为什么PYTZ最初显示出意外的时区偏移?
      与pytz 最初从pytz获得特定的偏移。例如,亚洲/hong_kong最初显示一个七个小时37分钟的偏移: 差异源利用本地化将时区分配给日期,使用了适当的时区名称和偏移量。但是,直接使用DateTime构造器分配时区不允许进行正确的调整。 example pytz.timezone(...
      编程 发布于2025-03-12
    • 如何修复\“常规错误:2006 MySQL Server在插入数据时已经消失\”?
      如何修复\“常规错误:2006 MySQL Server在插入数据时已经消失\”?
      How to Resolve "General error: 2006 MySQL server has gone away" While Inserting RecordsIntroduction:Inserting data into a MySQL database can...
      编程 发布于2025-03-12
    • 我们如何保护有关恶意内容的文件上传?
      我们如何保护有关恶意内容的文件上传?
      对文件上载上传到服务器的安全性问题可以引入重大的安全风险,因为用户可能会提供潜在的恶意内容。了解这些威胁并实施有效的缓解策略对于维持应用程序的安全性至关重要。用户可以将文件名操作以绕过安全措施。避免将其用于关键目的或使用其原始名称保存文件。用户提供的MIME类型可能不可靠。使用服务器端检查确定实际...
      编程 发布于2025-03-12
    • 如何使用JavaScript中的正则表达式从字符串中删除线路断裂?
      如何使用JavaScript中的正则表达式从字符串中删除线路断裂?
      在此代码方案中删除从字符串在JavaScript中解决此问题,根据操作系统的编码,对线断裂的识别不同。 Windows使用“ \ r \ n”序列,Linux采用“ \ n”,Apple系统使用“ \ r。” 来满足各种线路断裂的变化,可以使用以下正则表达式: [&& && &&&&&&&&&&&...
      编程 发布于2025-03-12
    • 为什么使用Firefox后退按钮时JavaScript执行停止?
      为什么使用Firefox后退按钮时JavaScript执行停止?
      导航历史记录问题:JavaScript使用Firefox Back Back 此行为是由浏览器缓存JavaScript资源引起的。要解决此问题并确保在后续页面访问中执行脚本,Firefox用户应设置一个空功能。 警报'); }; alert('inline Alert')...
      编程 发布于2025-03-12
    • 如何使用PHP将斑点(图像)正确插入MySQL?
      如何使用PHP将斑点(图像)正确插入MySQL?
      essue VALUES('$this->image_id','file_get_contents($tmp_image)')";This code builds a string in PHP, but the function call ...
      编程 发布于2025-03-12
    • 我可以将加密从McRypt迁移到OpenSSL,并使用OpenSSL迁移MCRYPT加密数据?
      我可以将加密从McRypt迁移到OpenSSL,并使用OpenSSL迁移MCRYPT加密数据?
      将我的加密库从mcrypt升级到openssl 问题:是否可以将我的加密库从McRypt升级到OpenSSL?如果是这样,如何?答案:是的,可以将您的Encryption库从McRypt升级到OpenSSL。可以使用openssl。附加说明: [openssl_decrypt()函数要求iv参...
      编程 发布于2025-03-12
    • 在Java中使用for-to-loop和迭代器进行收集遍历之间是否存在性能差异?
      在Java中使用for-to-loop和迭代器进行收集遍历之间是否存在性能差异?
      For Each Loop vs. Iterator: Efficiency in Collection TraversalIntroductionWhen traversing a collection in Java, the choice arises between using a for-...
      编程 发布于2025-03-12
    • 如何检查对象是否具有Python中的特定属性?
      如何检查对象是否具有Python中的特定属性?
      方法来确定对象属性存在寻求一种方法来验证对象中特定属性的存在。考虑以下示例,其中尝试访问不确定属性会引起错误: >>> a = someClass() >>> A.property Trackback(最近的最新电话): 文件“ ”,第1行, AttributeError: SomeClass...
      编程 发布于2025-03-12
    • Java HashSet/LinkedHashSet随机元素获取方法详解
      Java HashSet/LinkedHashSet随机元素获取方法详解
      在编程中找到一个随机元素,在编程中找到一个随机元素,从集合(例如集合)中选择一个随机元素很有用。 Java提供了多种类型的集合,包括障碍物和链接HASHSET。本文将探讨如何从这些特定集合实现的过程中选择一个随机元素。的java的hashset和linkedhashset a HashSet代表...
      编程 发布于2025-03-12

    免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

    Copyright© 2022 湘ICP备2022001581号-3