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】搭建私人博客:搜索功能(二)

相关推荐
chlk12317 小时前
Linux文件权限完全图解:读懂 ls -l 和 chmod 755 背后的秘密
linux·操作系统
舒一笑17 小时前
Ubuntu系统安装CodeX出现问题
linux·后端
改一下配置文件18 小时前
Ubuntu24.04安装NVIDIA驱动完整指南(含Secure Boot解决方案)
linux
碳基沙盒18 小时前
OpenClaw 多 Agent 配置实战指南
运维
深紫色的三北六号1 天前
Linux 服务器磁盘扩容与目录迁移:rsync + bind mount 实现服务无感迁移(无需修改配置)
linux·扩容·服务迁移
SudosuBash1 天前
[CS:APP 3e] 关于对 第 12 章 读/写者的一点思考和题解 (作业 12.19,12.20,12.21)
linux·并发·操作系统(os)
哈基咪怎么可能是AI2 天前
为什么我就想要「线性历史 + Signed Commits」GitHub 却把我当猴耍 🤬🎙️
linux·github
十日十行2 天前
Linux和window共享文件夹
linux
木心月转码ing3 天前
WSL+Cpp开发环境配置
linux
蝎子莱莱爱打怪4 天前
Centos7中一键安装K8s集群以及Rancher安装记录
运维·后端·kubernetes