96、【Ubuntu】【Hugo】搭建私人博客:搜索功能(一)

【声明】本博客所有内容均为个人业余时间创作,所述技术案例均来自公开开源项目(如Github,Apache基金会),不涉及任何企业机密或未公开技术,如有侵权请联系删除

背景

上篇 blog
【Ubuntu】【Hugo】搭建私人博客:_default&partials

分析了 Hugo 的 layouts/ 中,_default 模板和 partials 模板的区别,下面继续看搜索功能

搭建私人博客

首先来看 PaperMod 主题中的 layouts/_default/search.html 模板,其内容如下

go 复制代码
{{- define "main" }}

<header class="page-header">
    <h1>{{- (printf "%s&nbsp;" .Title ) | htmlUnescape -}}
        <svg xmlns="http://www.w3.org/2000/svg" width="28" height="28" viewBox="0 0 24 24" fill="none"
            stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
            <circle cx="11" cy="11" r="8"></circle>
            <line x1="21" y1="21" x2="16.65" y2="16.65"></line>
        </svg>
    </h1>
    {{- if .Description }}
    <div class="post-description">
        {{ .Description }}
    </div>
    {{- end }}
    {{- if not (.Param "hideMeta") }}
    <div class="post-meta">
        {{- partial "translation_list.html" . -}}
    </div>
    {{- end }}
</header>

<div id="searchbox">
    <input id="searchInput" autofocus placeholder="{{ .Params.placeholder | default (printf "%s ↵" .Title) }}"
        aria-label="search" type="search" autocomplete="off" maxlength="64">
    <ul id="searchResults" aria-label="search results"></ul>
</div>

{{- end }}{{/* end main */}}

标签信息

首先这里定义了页面头部

来看下这里的标签信息

  • <header>:语义化的 HTML5 标签,表示页面或文章的页头,class="page-header" 是 CSS 类名,方便后面用样式控制外观(比如加粗,居中,留白等)
  • <h1>:主标题标签,对 SEO 和可访问性很重要,通常每个页面只有一个 <h1>,代表当前页面的核心主题
  • <svg>:图标标签,内联了一个 SVG 图标,比如可以是一个小装饰图标,徽章,箭头等,这里是一个放大镜图标,表示搜索

SVG

OK,这里提到了 SVG 图标,下面来详细介绍下

SVG 全称 Scalable Vector Graphics,是一种基于 XML 的矢量图形格式,用于在网页中显示图标,插图等

SVG 的优点如下:

  • 无限缩放不模糊,因为是矢量,不是像素图
  • 文件小,尤其适合简单图标
  • 可直接用 CSS 控制颜色,大小,动画等
  • 内联嵌入 HTML,无需额外请求图片文件

OK,来看下 PaperMod search.html 这里的图标信息,首先是定义了形状

xml 复制代码
<circle cx="11" cy="11" r="8"></circle>
<line x1="21" y1="21" x2="16.65" y2="16.65"></line>

这是一个典型的搜索图标(放大镜形状),<circle> 表示一个圆圈(代表镜片),<line> 表示一条斜线(代表手柄),这个图标来自流行的开源图标库 Feather Icons 中的 search 图标

Feather Icons 里面还有很多其他好看的图标,可以自由选择

下载图标后,打开内容,按下 F12 进入开发者模式,可以看到里面的内容和 PaperMod 主题中几乎一模一样

xmlns

OK,看下一个元素 xmlns,这里 xmlns="http://www.w3.org/2000/svg" 是一个 XML 命名空间的声明,因为 SVG 本质上是 XML 文档,而 HTML 是另一种标记语言 ,当在 HTML 中内联嵌入 SVG 时,浏览器需要知道,接下来的这段 <svg>...</svg> 不是普通的 HTML 元素,而是 SVG 元素,xmlns="http://www.w3.org/2000/svg" 就是通知浏览器:下面的内容按照 SVG 规范进行解析

不过在大多数现代浏览器中,即使省略 xmlns 元素,内联 SVG 也仍可能正常显示,因为现代浏览器一般会做容错 ,但严格来说,xmlns 元素是必须的,尤其在一些 XHTML 文档中,某些旧版浏览器里,或者需要通过 XML 解析器处理时,所以总的来说,加上 xmlns 是良好的实践,可以确保跨平台的兼容性

另外还要提一下,<svg> 标签中的 <circle><line> 元素是 SVG 元素,属于 XML 语法(更准确地说,是 SVG 的 XML 语法),不是 HTML 原生元素


OK,本篇先到这里,如有疑问,欢迎评论区留言讨论,祝各位功力大涨,技术更上一层楼!!!更多内容见下篇 blog
【Ubuntu】【Hugo】搭建私人博客:搜索功能(二)

相关推荐
电子_咸鱼2 小时前
Linux IPC 实战:管道与共享内存的使用场景 + 底层原理全剖析
linux·运维·服务器·开发语言·网络·vscode·qt
修炼室2 小时前
在 Windows 上构建不占 C 盘的科研级 WSL 实验环境(Ubuntu 22.04)
c语言·windows·ubuntu
JiMoKuangXiangQu2 小时前
Linux USB 设备驱动框架简析
linux·usb 设备驱动
咕噜企业分发小米2 小时前
如何用云服务器搭建PUBG服务器?
运维·服务器
skywalk81632 小时前
快速启动wiki维基百科服务器 kiwix-serve --port=8080 wikipedia_zh_physics_mini_2025-12.zim
linux·运维·服务器·wiki
zl_dfq2 小时前
Linux 之 【文件】(文件共识原理、open、close、访问文件的本质、文件描述符)
linux
那些年的笔记2 小时前
Ubuntu22.04 英文界面转成中文界面
linux·运维·服务器
last demo2 小时前
docker基础
运维·docker·容器·eureka
袁煦丞 cpolar内网穿透实验室2 小时前
可视化管理服务器:cpolar 内网穿透实验室第 725 个成功挑战
运维·服务器·远程工作·内网穿透·cpolar