在这个系列教程中,我将带你从零开始构建一个功能完整的Chrome插件 - Sticky TODO。这个插件允许用户在任何网页上创建、编辑、拖拽和保存便签,就像在网页上贴便利贴一样。通过这个项目,你将学习Chrome插件开发的各个方面,从基本结构到高级功能。
项目概述
我们的Sticky TODO插件将实现以下功能:
基本功能
- 在任意网页创建便签
- 拖拽便签到任意位置
- 编辑便签内容
- 删除便签
- 保存便签(即使页面刷新也不会丢失)
UI功能
- 现代化的UI设计
- 深色/浅色主题切换
- 悬浮控制面板
- 便签最小化功能
高级功能
- 便签收缩功能(将便签收缩为小圆点)
- 便签磁吸功能(将便签磁吸到屏幕边缘)
- Notion集成(双向同步便签)
教程大纲
本教程分为四个主要部分:
- 项目初始化与基本结构:创建插件的基本文件结构,实现便签的创建、拖拽、编辑和删除功能
- UI改进与控制面板:改进UI设计,添加悬浮控制面板和主题切换功能
- 便签收缩与磁吸功能:实现便签收缩和磁吸功能,优化拖拽体验
- Notion集成功能:实现与Notion的双向同步,添加设置页面
第1部分:项目初始化与基本结构
1. 准备工作
所需工具
- 文本编辑器(推荐:Visual Studio Code)
- Chrome浏览器
- 基本的HTML、CSS和JavaScript知识
创建项目文件夹
首先,创建一个名为sticky-todo的文件夹,用于存放我们的插件文件。
2. 创建基本文件结构
Chrome插件需要几个基本文件。让我们一一创建它们:
2.1 创建manifest.json
manifest.json是Chrome插件的配置文件,它告诉浏览器插件的名称、版本、权限等信息。
在sticky-todo文件夹中创建manifest.json文件:
{
"manifest_version": 3,
"name": "Sticky TODO",
"version": "1.0",
"description": "在任意网页上创建、拖拽和保存便签",
"permissions": ["storage", "activeTab"],
"action": {
"default_popup": "popup.html",
"default_icon": {
"16": "images/icon16.png",
"48": "images/icon48.png",
"128": "images/icon128.png"
}
},
"icons": {
"16": "images/icon16.png",
"48": "images/icon48.png",
"128": "images/icon128.png"
},
"content_scripts": [
{
"matches": ["<all_urls>"],
"js": ["content.js"],
"css": ["styles.css"]
}
]
}
说明:
manifest_version: 使用最新的Manifest V3permissions: 请求存储权限(用于保存便签)和activeTab权限action: 定义点击插件图标时的行为content_scripts: 定义要注入到网页中的JavaScript和CSS文件
2.2 创建图标文件夹和图标
创建一个images文件夹,并在其中放置三个不同尺寸的图标:
sticky-todo/
├── images/
│ ├── icon16.png
│ ├── icon48.png
│ └── icon128.png
你可以使用任何图像编辑工具创建这些图标 ,或者使用在线工具生成它们。确保图标尺寸分别为16x16、48x48和128x128像素。
2.3 创建popup.html
popup.html是点击插件图标时显示的弹出窗口。
<!DOCTYPE html>
<html>
<head>
<title>Sticky TODO</title>
<style>
body {
width: 300px;
padding: 10px;
font-family: Arial, sans-serif;
}
h1 {
font-size: 18px;
margin-bottom: 10px;
}
button {
margin: 5px 0;
padding: 8px;
width: 100%;
background-color: #4CAF50;
color: white;
border: none;
border-radius: 4px;
cursor: pointer;
}
button:hover {
background-color: #45a049;
}
</style>
</head>
<body>
<h1>Sticky TODO</h1>
<button id="createNote">创建新便签</button>
<button id="clearNotes">清除所有便签</button>
<button id="toggleTheme">切换深色/浅色模式</button>
<script src="popup.js"></script>
</body>
</html>
2.4 创建popup.js
popup.js处理弹出窗口中的按钮点击事件:
// 当弹出窗口加载完成时
document.addEventListener('DOMContentLoaded', function() {
// 创建新便签按钮
document.getElementById('createNote').addEventListener('click', function() {
// 向当前标签页发送消息,请求创建新便签
chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
chrome.tabs.sendMessage(tabs[0].id, {action: "createNote"});
});
});
// 清除所有便签按钮
document.getElementById('clearNotes').addEventListener('click', function() {
// 向当前标签页发送消息,请求清除所有便签
chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
chrome.tabs.sendMessage(tabs[0].id, {action: "clearNotes"});
});
});
// 切换主题按钮
document.getElementById('toggleTheme').addEventListener('click', function() {
// 向当前标签页发送消息,请求切换主题
chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
chrome.tabs.sendMessage(tabs[0].id, {action: "toggleTheme"});
});
});
});