跳转至

自定义 SVG Icon 功能

本文档介绍如何在网站中使用自定义 SVG 图标替代 FontAwesome 图标。

概述

网站支持三种类型的图标:

  1. FontAwesome 图标:默认的图标系统,如 fas fa-house
  2. 自定义 SVG 图标:存放在 assets/media/icons/static/images/icons/ 目录中的 SVG 文件
  3. Emoji 图标:使用 emoji 字符作为图标

使用场景

自定义 SVG 图标可以应用于以下位置:

  • 导航菜单(主导航、下拉菜单)
  • 面包屑导航
  • 书籍目录菜单
  • Mega 下拉菜单
  • 其他使用 render-icon.html partial 的地方

SVG 图标存放位置

推荐位置(assets 目录)

assets/media/icons/
├── my-custom-icon.svg
├── cloud.svg
└── gear.svg

优势

  • 可以通过 Hugo Pipes 进行优化和处理
  • 支持资源指纹(fingerprinting)用于缓存破坏
  • 更好的构建时优化

备用位置(static 目录)

static/images/icons/
├── my-custom-icon.svg
├── cloud.svg
└── gear.svg

优势

  • 直接复制到输出目录,无需构建处理
  • 适合简单的 SVG 文件

注意:系统会优先尝试从 assets/media/icons/ 加载,如果未找到则回退到 static/images/icons/

SVG 文件要求

文件格式

  • 文件扩展名必须是 .svg
  • 确保 SVG 代码干净,移除不必要的元数据
  • 使用 viewBox 属性而非固定的 widthheight

推荐的 SVG 结构

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
  <path d="M12 2L2 7v10c0 5.55 3.84 10.74 9 12 5.16-1.26 9-6.45 9-12V7l-10-5z"/>
</svg>

关键点

  • 使用 fill="currentColor" 使图标继承文本颜色
  • 使用 viewBox 定义坐标系统
  • 保持路径简洁

SVG 优化工具

推荐使用以下工具优化 SVG 文件:

配置方法

1. 导航菜单配置

config/_default/menus.zh.tomlmenus.en.toml 中:

[[main]]
name = "博客"
URL = "/blog/"
weight = 10
pre = "custom my-blog-icon"  # 使用自定义 SVG
identifier = "blog"

[[main]]
name = "AI"
URL = "/ai/"
weight = 1 
pre = "fas fa-wand-magic-sparkles"  # 仍可使用 FontAwesome

[[main]]
name = "图书"
URL = "/book/"
weight = 24
pre = "emoji 📚"  # 使用 emoji
identifier = "book"

格式说明

  • FontAwesomepre = "fas fa-icon-name"pre = "far fa-icon-name"
  • 自定义 SVGpre = "custom icon-filename"(不含 .svg 扩展名)
  • Emojipre = "emoji 😀"

2. 面包屑导航配置

在页面或 section 的 front matter 中:

---
title: "我的页面"
icon: "my-custom-icon"     # SVG 文件名(不含扩展名)
icon_pack: "custom"         # 指定使用自定义 SVG
---

或使用 FontAwesome:

---
title: "我的页面"
icon: "house"               # FontAwesome 图标名
icon_pack: "fas"            # FontAwesome pack
---

或使用 Emoji:

---
title: "我的页面"
icon: "🏠"                  # Emoji 字符
icon_pack: "emoji"
---

3. 书籍目录配置

在书籍章节的 front matter 中:

---
title: "第一章"
weight: 1
icon: "chapter-icon"
icon_pack: "custom"
---

4. Mega 下拉菜单配置

data/zh/mega_menu.yamldata/en/mega_menu.yaml 中:

mega:
  blog:
    title: "博客"
    description: "技术文章和教程"
    viewAll:
      label: "查看全部"
      url: "/blog/"
      icon: "custom my-view-all-icon"  # 自定义 SVG
    columns:
      - title: "分类"
        items:
          - name: "云原生"
            icon: "custom cloud-icon"   # 自定义 SVG
            url: "/categories/cloud-native/"
          - name: "AI"
            icon: "fas fa-robot"         # FontAwesome
            url: "/categories/ai/"
          - name: "容器技术"
            icon: "emoji 🐳"             # Emoji
            url: "/categories/container/"

在代码中使用

如果你需要在自定义模板中使用图标,可以直接调用 render-icon.html partial:

使用 FontAwesome

{{ partial "render-icon.html" (dict "icon" "house" "pack" "fas" "class" "my-custom-class") }}

使用自定义 SVG

{{ partial "render-icon.html" (dict "icon" "my-icon" "pack" "custom" "alt" "My Icon") }}

使用 Emoji

{{ partial "render-icon.html" (dict "icon" "🏠" "pack" "emoji") }}

参数说明

  • icon(必需):图标标识符
  • FontAwesome:图标名称(如 "house")
  • 自定义 SVG:文件名(不含 .svg 扩展名)
  • Emoji:emoji 字符
  • pack(可选,默认 "fas"):图标包类型
  • "fas", "far", "fab", "fal":FontAwesome
  • "custom":自定义 SVG
  • "emoji":Emoji
  • class(可选):额外的 CSS 类名
  • alt(可选):SVG 图标的 alt 文本,默认使用 icon 参数值

CSS 样式定制

默认样式

所有 SVG 图标都会应用以下基础样式:

.svg-icon {
  display: inline-block;
  width: 1em;
  height: 1em;
  fill: currentColor;
  vertical-align: middle;
}

调整图标大小

使用预定义的大小类:

<img src="..." class="svg-icon icon-sm">  <!-- 小图标 -->
<img src="..." class="svg-icon icon-lg">  <!-- 大图标 -->
<img src="..." class="svg-icon icon-xl">  <!-- 超大图标 -->

自定义样式

你可以在自定义 CSS 中覆盖图标样式:

// 针对特定位置的图标
.nav-link .svg-icon {
  width: 1.2em;
  height: 1.2em;
}

// 针对特定图标
.svg-icon[alt="my-icon"] {
  filter: drop-shadow(0 0 2px rgba(0,0,0,0.2));
}

示例

完整示例:创建自定义导航图标

  1. 准备 SVG 文件

    创建 assets/media/icons/rocket.svg

    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
      <path d="M12 2.69l5.66 5.66a8 8 0 1 1-11.31 0z"/>
    </svg>
    
  2. 配置菜单

    编辑 config/_default/menus.zh.toml

    [[main]]
    name = "启动"
    URL = "/launch/"
    weight = 30
    pre = "custom rocket"
    
  3. 验证效果

    运行开发服务器并访问网站,应该能看到自定义的火箭图标。

故障排除

图标未显示

  1. 检查文件路径:确认 SVG 文件存在于正确的目录
  2. 检查文件名:确保文件名与配置中的 icon 参数匹配(不含扩展名)
  3. 检查 SVG 格式:确保 SVG 文件格式正确,使用 fill="currentColor"
  4. 清除缓存:运行 hugo --gc 清除 Hugo 缓存后重试

图标颜色不正确

确保 SVG 文件中使用 fill="currentColor" 而非固定颜色值:

<!-- ❌ 错误 -->
<path fill="#000000" d="..."/>

<!-- ✅ 正确 -->
<path fill="currentColor" d="..."/>

图标大小不合适

调整图标所在容器的字体大小,或添加自定义 CSS 类:

.my-custom-nav .svg-icon {
  width: 1.5em;
  height: 1.5em;
}

最佳实践

  1. 使用语义化的文件名:如 cloud-native.svg 而非 icon1.svg
  2. 保持 SVG 简洁:移除不必要的元数据和注释
  3. 使用 viewBox:确保图标在不同尺寸下正确缩放
  4. 统一图标风格:保持整个网站图标风格一致
  5. 优化文件大小:使用 SVGO 等工具优化 SVG 文件
  6. 提供回退方案:在配置中同时保留 FontAwesome 图标作为备选

相关文件

  • 图标渲染 partial:layouts/partials/render-icon.html
  • 样式定义:assets/scss/partials/_components.scss
  • 导航模板:layouts/partials/header.html
  • 面包屑模板:layouts/partials/breadcrumb.html
  • 书籍菜单模板:layouts/partials/book/book-menu.html
  • Mega 菜单模板:layouts/partials/menu/mega-dropdown.html

更新历史

  • 2025-11-13:初始版本,支持自定义 SVG、FontAwesome 和 Emoji 图标