惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

罗磊的独立博客
Forbes - Security
Forbes - Security
Blog — PlanetScale
Blog — PlanetScale
P
Proofpoint News Feed
Apple Machine Learning Research
Apple Machine Learning Research
Google DeepMind News
Google DeepMind News
MyScale Blog
MyScale Blog
GbyAI
GbyAI
B
Blog RSS Feed
S
SegmentFault 最新的问题
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
小众软件
小众软件
The Last Watchdog
The Last Watchdog
W
WeLiveSecurity
Webroot Blog
Webroot Blog
S
Security @ Cisco Blogs
Hugging Face - Blog
Hugging Face - Blog
Microsoft Security Blog
Microsoft Security Blog
月光博客
月光博客
博客园 - 聂微东
F
Fortinet All Blogs
H
Hacker News: Front Page
A
About on SuperTechFans
Application and Cybersecurity Blog
Application and Cybersecurity Blog
C
Check Point Blog
V
V2EX
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Y
Y Combinator Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
N
News | PayPal Newsroom
Cisco Talos Blog
Cisco Talos Blog
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
The Cloudflare Blog
P
Privacy & Cybersecurity Law Blog
N
Netflix TechBlog - Medium
C
CXSECURITY Database RSS Feed - CXSecurity.com
Recorded Future
Recorded Future
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Google DeepMind News
Google DeepMind News
大猫的无限游戏
大猫的无限游戏
美团技术团队
Security Latest
Security Latest
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
I
InfoQ
Recent Announcements
Recent Announcements
The GitHub Blog
The GitHub Blog
Google Online Security Blog
Google Online Security Blog
T
The Exploit Database - CXSecurity.com

蛋蛋之家

SUMIFS和LET函数——让 Excel 自己动起来 Halo 博客晚间卡顿排查记:从"玄学卡顿"到"真凶落网" 我用这个开源项目,把 AI 绘画提示词变成了"代码"——awesome-gpt-image-2 深度体验报告 群晖部署 LX Music Server:浏览器就是你的音乐播放器【详细版】 500道Word题库太痛苦?于是我写了个智能学习平台 别用一个人的奔跑,耗尽两个人的余生——《你凭什么认为我会一直喜欢你呢》 博客评论自动填充新方案:兼容 Vue/React 响应式绑定与跨架构填充逻辑 2026 生产级指南:Halo 2.x + PostgreSQL 自动化部署与性能优化手册 从 Typecho 转向 Halo 2.x:全能型 Nginx 架构与 SEO 无损迁移指南 Typecho 迁移 Halo 完整教程:数据库视图解决表前缀 + 自动提取封面图 + 去重检测 我的 CodeBuddy 装备库:218个技能全公开 + 使用心得 为博客添加自定义评论表情 Comment2Bark:Typecho评论推送到Bark插件 又拍云插件 UpyunFile v1.2 更新:修复 Typecho 1.3.0 兼容性问题 手把手修复RSS 403:从PHP警告到Cloudflare拦截的全链路排查 网站被镜像怎么办?2026年反镜像攻防实战指南 VLESS + Reality + Vision:2026 极致隐蔽节点搭建全解析 给OpenList和Alist加上液态玻璃效果,颜值直接拉满! 网页截图瞬间“赛博飞升”?手把手教你根治 Windows HDR 截图发白 群晖 NAS 影音终极方案:Docker Rclone + OpenList 完美挂载 Plex 全攻略 告别重复劳动!一键填充评论的神奇书签脚本 - 蛋蛋之家 解锁思源笔记的隐藏力量:siyuan-patch 深度体验与技术实现 Oracle Cloud 自救指南:旧手机丢失后如何绕过 MFA 重新登录【更新2026年最新政策】 本站已加入“萌国ICP备案”联萌!😄 Excel 月报自动化指南:告别重复劳动,让数据主动为你服务 梦呓:为异地女友准备的2周年惊喜礼物 Typecho 多吉云插件优化:更灵活的存储目录配置 甲骨文云硬盘扩容指南:从50G到200G的“免费午餐”怎么吃? ⏰ 时间同步:当你的服务器开始“穿越”时,如何优雅地把它拉回现实 Typecho 又拍云文件管理插件修改版使用指南:新增自定义目录结构功能 华为鸿蒙6.0回退4.2记录 最近小公主情绪不佳 劳动节的家乡景色 烟台山公园一游 群晖搭建ChatGPT Web 推荐脚本:ChatGPT - 提示选择器 Activation Method for JetBrains Products (English version) JetBrains 系列产品激活方法 疫情三年后再进校园 修复searchEngineJump在谷歌搜索页面不生效问题 事情既然发生了,可以是遗憾,不要去后悔。 侄女的试唱会比赛 新一代图片编码格式测试 省科技馆之行 Typora Windows版破解补丁及主题推荐 在Typora中使用PicList上传图片 域名ICP备案之变更网站 Ubuntu 系统如何使用 root 用户登录 中国联通——让一切自由连不通 如何选购适合的口罩? 今天移动营业厅遇到一个小姐姐,真的好美 它不乐意 如何解决Typecho文章不是Markdown语法创建问题 探手抓住这一天的尾巴,为自己庆生 收到腾讯云自媒体分享计划2月份礼品 尝试百度Spider抓取异常问题 甲骨文DD重装系统及失联救砖教程 终于MrDoc升级v0.8.7成功了 Windows 端口查询及杀死进程 甲骨文实例开通与X-UI安装 国艺花鸟市场的悠闲 在思源笔记中使用群晖Synology C2对象存储服务 MrDoc升级v0.8.7失败 居居的手工作品 Linux系统时间同步命令小结 AList安装指南 宝塔面板降级 v7.7.0 及解除强制绑定手机、免费安装专业版插件的方法 修复群晖Synology Drive client右键菜单缺失问题 Windows11 展开折叠的右键菜单为传统模式 在 Windows 下批量将 Markdown 文档转为 Word 文档 Typecho的一些修改记录 Markdown语法——Mermaid 有两种新方案—CloudFlare官方免费CNAME接入教程 居居的新冠历程 群辉安装Transmission套件、增强汉化WebUI并备份做种列表 群晖 docker 部署思源笔记 Office for Mac 2019 License Installer 公众号通过api发送小程序消息 Windows 10下 iTunes 备份默认存储路径修改 Excel查找返回多个值,并将返回的值放在同一个单元格里面 七牛云测试域名失效后如何下载空间中的文件 入手三星860 evo 500g SSD固态硬盘 分享一套耐看的鼠标指针 如何重置OmniFocus数据库 Office for Mac 2016 License Installer Mac下配置终端+iTerm 2主题 如何制作苹果系统安装U盘 LNMP部署typecho,开启SSL、强制开启https Stylish样式如何设置为特定网址不生效? Typecho插件错误号:42S01的解决方法 电动车被偷了 热火 R150 上手开箱 UltraMon 3.3.0 汉化+注册机 如何用 MWeb 发布 Typecho 文章 测试 Mweb 发布到印象笔记功能 忘记了iPhone访问限制的密码该怎么办? 新玩具KAREE电子烟,先试试 Mac mini 2011 开启Handoff方法 见微知著 浅谈手游创新 PhoneClean Pro授权注册激活码
一个简洁高效的SVG图标库
吴蛋蛋 · 2026-03-01 · via 蛋蛋之家

引言

因为在使用 SVG 图标的是否发现 Base64 代码真的很不直观,想预览一个打开一个浏览器标签,于是就想着将这些都在一个页面预览不就好了?所以,通过 Trae 的助力,开发了这个 SVG 图标库。

预览地址:

让图标管理变得简单

有以下特点😂:

  • ✅ 显示SVG图标并支持点击复制base64编码
  • ✅ 支持提交新的SVG图标
  • ✅ 响应式设计,适配不同设备
  • ✅ 现代化的液态玻璃UI效果
  • ✅ 支持批量上传SVG图标
  • ✅ 自动检测重复图标
  • ✅ 支持多种输入格式(SVG代码、纯Base64编码、带data URL前缀的Base64编码)
  • ✅ 完善的表单验证和错误处理
  • ✅ CSRF防护确保安全

1. 直观的图标展示

SVG 图标库采用网格布局展示所有图标,每个图标都以卡片形式呈现,悬停时会有微妙的动画效果。用户可以一目了然地看到所有可用的图标,无需在无数个文件夹中翻找。

界面展示

SVG图标库主界面

2. 便捷的复制功能

用户只需点击图标,在弹出的模态框中点击相应按钮,就能:

  • 一键复制SVG代码,直接用于HTML
  • 一键复制Base64编码,带data URL前缀,可直接粘贴到CSS中
  • 复制成功后会显示通知提示,确保操作成功

界面展示

图标预览和复制界面

3. 图标添加功能

支持多种格式的输入:

  • 直接上传SVG代码
  • 上传Base64编码(带或不带data URL前缀)
  • 批量上传多个Base64编码(一次粘贴多个,系统自动处理)
  • 智能验证,确保SVG内容有效
  • 自动去重,防止重复图标

界面展示

SVG图标添加界面

4. 现代美观的界面

采用流行的液态玻璃 UI 设计风格,使用 backdrop-filter 和 box-shadow 实现现代化的模糊效果。界面简洁大方,动画流畅自然,响应式设计确保在手机、平板和桌面设备上都能完美展示。

界面展示

移动端适配界面

技术实现

前端技术

  • HTML5:语义化标签,良好的结构
  • CSS3:现代CSS特性,包括变量、动画、响应式设计
  • JavaScript (ES6+) :模块化代码组织,事件处理
  • 液态玻璃UI:使用backdrop-filter和box-shadow实现

后端技术

  • PHP 8.0+ :服务器端逻辑处理
  • 文件系统:存储SVG图标数据
  • 会话管理:实现PRG模式,防止表单重复提交

代码结构

svg/
├── index.php          # 主入口文件
├── icons.txt          # 存储SVG图标数据
├── includes/
│   ├── config.php     # 配置文件
│   ├── security.php   # 安全相关功能
│   └── svg_manager.php # SVG图标管理功能
└── assets/
    ├── css/
    │   └── style.css  # 样式文件
    └── js/
        └── script.js  # JavaScript文件

问题与解决方案

1. Cloudflare兼容性问题

问题表现:部署到使用 Cloudflare 加速的服务器后,点击图标或按钮没有反应,浏览器控制台显示 JavaScript 错误。

具体影响: 核心功能完全无法使用,用户无法预览或复制图标,也无法添加新图标等问题

技术原因:Cloudflare 的 Rocket Loader 功能会异步加载和执行 JavaScript 代码,干扰了事件监听器的绑定,导致事件处理函数无法正常触发。

解决思路

解决思路

  • 使用捕获阶段的事件监听器,避免事件冒泡被干扰
  • 实现双重初始化机制,确保代码在各种情况下都能正确初始化
  • 增强DOM元素检查,添加元素存在性检查和重试机制

代码示例

// 使用捕获阶段的事件监听器
this.DOM.iconGrid.addEventListener('click', (event) => {
    const card = event.target.closest('.icon-card');
    if (card) {
        event.stopPropagation();
        this.openPreviewModal(card);
    }
}, true); // 使用捕获阶段
// 初始化 - 使用更可靠的方式,避免Cloudflare干扰
(function() {
    // 等待DOM加载完成
    function initWhenReady() {
        if (document.readyState === 'loading') {
            document.addEventListener('DOMContentLoaded', function() {
                SvgIconLibrary.init();
            });
        } else {
            SvgIconLibrary.init();
        }
    }    // 立即执行初始化
    initWhenReady();    // 额外的保险措施:延迟初始化,确保所有资源都已加载
    setTimeout(function() {
        if (!window.SvgIconLibrary || !window.SvgIconLibrary.DOM || Object.keys(window.SvgIconLibrary.DOM).length === 0) {
            console.log('Secondary initialization attempt');
            SvgIconLibrary.init();
        }
    }, 1000);
})();

2. ARIA可访问性问题

问题表现:浏览器控制台报 ARIA 可访问性错误,提示 "Blocked aria-hidden on an element because its descendant retained focus",影响网站的可访问性评分。

技术原因:当关闭模态框时,模态框中的按钮仍然保持焦点,而模态框被设置为 aria-hidden="true",违反了 WAI-ARIA 规范,因为辅助技术不应该将焦点隐藏在用户看不到的元素上。

解决思路

解决思路

  • 在关闭模态框之前,检查当前获得焦点的元素是否在模态框内
  • 如果焦点在模态框内,将焦点移到页面主体
  • 先处理焦点,再设置aria-hidden="true"

代码示例

closePreviewModal: function() {
    // 确保焦点不留在隐藏的元素中
    const focusedElement = document.activeElement;
    if (this.DOM.previewModal.contains(focusedElement)) {
        // 将焦点移到页面主体
        document.body.focus();
    }
  
    this.DOM.previewModal.classList.remove('show');
    this.DOM.previewModal.setAttribute('aria-hidden', 'true');
    // 等待动画完成后隐藏
    setTimeout(() => {
        this.DOM.previewModal.style.display = 'none';
        // 清除当前图标数据
        this.currentIconData = null;
    }, 300);
},

3. 字体加载问题

问题表现:网站加载时,浏览器控制台显示字体加载失败的错误,提示 "Failed to load resource: net::ERR_CONNECTION_CLOSED"。

技术原因:使用的国内一些字体库连接不稳定,导致字体无法正常加载,影响网站的视觉效果。

解决思路

解决思路

  • 尝试使用其他国内字体源,如百度字体库、360字体库、字节跳动
  • 最终选择使用Google Fonts官方CDN,虽然在国内可能有一些延迟,但稳定性更高

代码示例

<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=Poppins:wght@400;500;600;700&display=swap">

4. 表单重复提交问题

问题表现:用户提交表单后刷新页面,会导致表单重复提交,可能造成重复数据或其他意外行为。

技术原因:传统的表单提交方式会在页面刷新时重新发送请求,导致重复提交。

解决思路

解决思路

  • 实现PRG(Post-Redirect-Get)模式
  • 使用会话存储消息,重定向后显示
  • 确保表单提交后不会因为刷新而重复提交

代码示例

if ($successCount > 0) {
    $_SESSION['message'] = '成功添加 ' . $successCount . ' 个SVG图标!';
    // 重定向到同一个页面,防止重复提交
    header('Location: ' . $_SERVER['PHP_SELF']);
    exit;
}

结语

SVG 图标库是一个简洁、高效的工具,解决了前端开发中图标管理的实际问题。通过模块化的代码结构、现代化的 UI 设计、完善的功能实现以及与 Cloudflare 的兼容性优化,它为用户提供了一个高效、可靠的 SVG 图标管理解决方案。

git:[@github/NoEggEgg/svg-icon-library]