


























因为在使用 SVG 图标的是否发现 Base64 代码真的很不直观,想预览一个打开一个浏览器标签,于是就想着将这些都在一个页面预览不就好了?所以,通过 Trae 的助力,开发了这个 SVG 图标库。
预览地址:
有以下特点😂:
SVG 图标库采用网格布局展示所有图标,每个图标都以卡片形式呈现,悬停时会有微妙的动画效果。用户可以一目了然地看到所有可用的图标,无需在无数个文件夹中翻找。
界面展示:

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

支持多种格式的输入:
界面展示:

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

svg/
├── index.php # 主入口文件
├── icons.txt # 存储SVG图标数据
├── includes/
│ ├── config.php # 配置文件
│ ├── security.php # 安全相关功能
│ └── svg_manager.php # SVG图标管理功能
└── assets/
├── css/
│ └── style.css # 样式文件
└── js/
└── script.js # JavaScript文件
问题表现:部署到使用 Cloudflare 加速的服务器后,点击图标或按钮没有反应,浏览器控制台显示 JavaScript 错误。
具体影响: 核心功能完全无法使用,用户无法预览或复制图标,也无法添加新图标等问题
技术原因:Cloudflare 的 Rocket Loader 功能会异步加载和执行 JavaScript 代码,干扰了事件监听器的绑定,导致事件处理函数无法正常触发。
解决思路:
代码示例:
// 使用捕获阶段的事件监听器
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);
})();
问题表现:浏览器控制台报 ARIA 可访问性错误,提示 "Blocked aria-hidden on an element because its descendant retained focus",影响网站的可访问性评分。
技术原因:当关闭模态框时,模态框中的按钮仍然保持焦点,而模态框被设置为 aria-hidden="true",违反了 WAI-ARIA 规范,因为辅助技术不应该将焦点隐藏在用户看不到的元素上。
解决思路:
代码示例:
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);
},
问题表现:网站加载时,浏览器控制台显示字体加载失败的错误,提示 "Failed to load resource: net::ERR_CONNECTION_CLOSED"。
技术原因:使用的国内一些字体库连接不稳定,导致字体无法正常加载,影响网站的视觉效果。
解决思路:
代码示例:
<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">
问题表现:用户提交表单后刷新页面,会导致表单重复提交,可能造成重复数据或其他意外行为。
技术原因:传统的表单提交方式会在页面刷新时重新发送请求,导致重复提交。
解决思路:
代码示例:
if ($successCount > 0) {
$_SESSION['message'] = '成功添加 ' . $successCount . ' 个SVG图标!';
// 重定向到同一个页面,防止重复提交
header('Location: ' . $_SERVER['PHP_SELF']);
exit;
}
SVG 图标库是一个简洁、高效的工具,解决了前端开发中图标管理的实际问题。通过模块化的代码结构、现代化的 UI 设计、完善的功能实现以及与 Cloudflare 的兼容性优化,它为用户提供了一个高效、可靠的 SVG 图标管理解决方案。
git:[@github/NoEggEgg/svg-icon-library]
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。