【SSD系列】五分钟,不,三分钟,实现一个颜色拾取器chrome插件

前言

在 之前 不知道,但是可能超有用的 Web API 提到了 EyeDropper 拾色器,并提到 基于此做个取色插件,是不是分分钟就搞定呢?

答案就是: 分分钟搞定。

此外,欢迎关注 前端SSD系列 专栏。

一些有意思的前端内容,旨在3-10分钟里,有所获,又不为所累。

插件效果

直接先看效果。不仅仅可以取色浏览器本身,浏览器外也不在话下。

动手, 三分钟足以。

选择项目模板

选择一个合适的模板,比如

本文就以 chrome-extension-boilerplate-react-vite 为基础开发。

打开项目,主要需要改动的地方就是pages和配置 manifest.js, 既然说到这里了,就得简单了解一下这些pages下文件夹 和 chrome插件功能的对应关系

名字 功能/作用范围
background 后台 偷偷 运行的代码
content 打开满足条件标签页 页面的可运行的代码
devtools 打开开发者工具后的对应的tab
panel 打开开发者工具后的对应的tab下的内容
newtab 打开标签页
options 插件的配置
popup 点击插件后的弹框
sidepanel 侧边栏

每个块都还比较容易理解,今天的插件涉及的是 popup部分,简单介绍一下。

popup 点击 标注1 对应的插件图标后, 标注2 就是 popup的区域。

sidepanel

这算是比较新的一个能力了,简单介绍一下。 点击如下图的标注 1, 在标注2处可以选择相应的功能。 真个红色区域就是 side panel。

实现

更改 src\pages\popup\Popup.tsx 代码如下:

ts 复制代码
import '@pages/popup/Popup.css';
import withErrorBoundary from '@src/shared/hoc/withErrorBoundary';
import withSuspense from '@src/shared/hoc/withSuspense';
import { useState } from 'react';

const Popup = () => {
  const [backgroundColor, setBackgroundColor] = useState('');

  const onToPickColor = () => {
    if (!('EyeDropper' in window)) {
      alert("你的浏览器不支持 EyeDropper API");
      return;
    }
    // @ts-ignore
    const eyeDropper = new EyeDropper();
    const abortController = new AbortController();

    eyeDropper
      .open({ signal: abortController.signal })
      .then((result) => {
        setBackgroundColor(result.sRGBHex);
      })
      .catch((err: Error) => {
        alert(`发生错误:${err && err.message || '未知错误'}`)
      });
  }

  return (
    <div className='App'>
      <button className="start-button" onClick={onToPickColor}>打开拾色器</button>
      <div>
        颜色是:<span id="result">{backgroundColor}</span>
      </div>
      <div className='color-rect' style={{
        backgroundColor
      }}></div>
    </div>
  );
};

export default withErrorBoundary(withSuspense(Popup, <div> Loading ... </div>), <div> Error Occur </div>);

本地部署

  1. pnpm install
  2. npm run build
  3. chrome 浏览器输入 chrome://extensions/
  4. 加载已加压的扩展正序,选择项目里面的 dist 目录

小结

是不是很简单,一切都看起来没那么难,三分钟是不是都多了。

写在最后

不忘初衷,有所得,而不为所累,如果你觉得不错,你的一赞一评就是我前行的最大动力。

微信公众号:成长的程序世界 ,关注之后,海量电子书,打包拿走不送。

或者添加我的微信 dirge-cloud,一起学习。

引用

chrome-extensions-samples

相关推荐
jktantan7 小时前
Vue keep-alive 切标签后滚动位置回顶?因为 onDeactivated 里读到的 scrollTop 是 0
前端·javascript·vue.js
总要学点什么7 小时前
第89篇:三维特效-螺旋圆效果——让螺旋臂卷起一圈圈外扩的涟漪
开发语言·javascript·ecmascript·webgl·cesium·空间分析·1024程序员节
2601_962885728 小时前
quotes 字段全解:涨跌幅、振幅、换手率的口径与单位
java·前端·spring
excel8 小时前
encodeURI 和 encodeURIComponent 有什么区别?
前端
前端精髓8 小时前
调用openrouter的免费API模型
java·前端·javascript
赛博守夜人9 小时前
AI安全攻防与治理之十四:AI 安全测试不能脱离传统安全,Web、API、移动端与模型攻击面的组合拳
前端·人工智能·安全
开开心心_Every9 小时前
快速隐藏程序工具自定义快捷键一键切换
java·开发语言·前端·spring·智能手机·word·intellij-idea
networknomad9 小时前
OpenReplay:自己搭的会话回放工具,给前端排错用的
前端·其他
缓慢更新10 小时前
AI 辅助生成单测:从接口定义到用例的流水线
java·服务器·前端·网络·数据库·人工智能
陈随易11 小时前
AI 运维服务器,安全又可靠的方法
前端·后端·程序员