本文档介绍 jijian 主题的模板结构、继承关系和自定义方法,帮助你深入理解主题的工作原理并进行定制开发。
模板结构概览 jijian 主题采用 Hugo 标准的模板层次结构:
t ├ │ │ │ │ │ │ │ │ ├ │ ├ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├ │ │ │ │ │ │ ├ └ h ─ ─ ─ ─ ─ ─ e ─ ─ ─ ─ ─ ─ m e _ ├ ├ ├ ├ ├ ├ ├ └ p └ p ├ ├ ├ ├ ├ ├ ├ ├ ├ ├ ├ ├ ├ ├ ├ ├ ├ ├ ├ ├ ├ └ s ├ ├ ├ ├ ├ └ 4 r s d ─ ─ ─ ─ ─ ─ ─ ─ a ─ a ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ h ─ ─ ─ ─ ─ ─ 0 o / e ─ ─ ─ ─ ─ ─ ─ ─ g ─ r ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ o ─ ─ ─ ─ ─ ─ 4 b j f e t r . o i a b b s l t a s r / p i h h f c p c t p p b s s c e t a a c s e e t ├ ├ └ t b f c v i r h t j u a l i i e r e s a a e e o a o o o o o r o h o d r u n u v x x e ─ ─ ─ c i i o e n a t s i l s a n s r c a s s l a a o r r v c s s e c a m i a t c s g t t m ─ ─ ─ o l g l r T w m . a t e n g t m h r . s s d d t d t e . t t a i r m t n h h t . e e p d i u l t e h l t n o k l . s i c x w . e e . a r h _ _ d a e e _ s o o o h n n l o x s e b r a i x t x f . e h . v h m h r r h l . t m n c l _ n p l r r m t d d a p _ c s i e p c t m t l . h . t h e . l r t . . t . h m e a r _ i t o a . e _ m _ _ t e c h / l . s a I l a h t h m t s h d m h h m h t l t v u i c s s t h d w l h f e n a e i h e l m . y t m t l m . t . l t t l t m a _ m c o . t i t _ o e o s g r m . t . . g h o m l m l h m h m m m l . l b o n h . o m h r a o / r d a h m h h . t u l l t l t l l l h i s n s t h n l e d d t a s _ t l t t h m t m m t n . s . m t _ a c . e p . j m m m t l s l l m k h . h l m l d o h r h h s l l l m / l s t h t l i i u t . . t o l . m t m s n n m h h m n h l m l t g t l t t l . t l . s . m m h m h . h l l t l t h t m # # # # # # # # # # # # # # # # # # # # # # # # # m # t m # # # # # # l # # # # # # # # # # l m l 默 基 空 单 列 标 时 搜 R 特 密 部 H 页 页 名 门 文 目 文 面 社 分 评 编 作 l S 头 底 S O T # 短 哔 增 可 竖 行 原 4 搜 认 础 白 篇 表 签 间 索 S 定 码 分 T 面 面 片 户 章 录 章 上 包 交 享 论 辑 # 者 # V 部 部 E p w 代 哩 强 折 排 内 始 0 索 模 模 页 文 页 / 线 页 S 页 保 模 M 顶 底 模 模 封 元 下 屑 图 按 系 文 信 # G 扩 扩 O e i S 码 哔 版 叠 文 图 4 引 板 板 面 章 面 分 归 面 面 护 板 L 部 部 式 式 面 信 篇 导 标 钮 统 章 多 息 自 展 展 n t c 哩 图 内 本 片 H 擎 模 页 类 档 订 模 页 导 首 首 图 息 导 航 链 语 带 定 图 区 区 模 t h 视 片 容 T 错 爬 板 面 归 页 阅 板 面 头 航 页 页 航 接 言 锚 义 标 域 域 板 G e e 频 M 误 虫 档 源 部 列 点 字 库 r r m L 页 配 页 表 的 数 a / a 面 置 标 统 p X . 题 计 h o C r 元 a g 数 r 据 d 结 s 构 化 元 数 数 据 据 模板继承关系 基础模板层次 b ├ │ │ │ │ │ │ │ │ ├ │ │ │ │ ├ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └ a ─ ─ ─ ─ s ─ ─ ─ ─ e o h ├ ├ ├ ├ └ h ├ ├ ├ └ m ├ │ │ │ │ │ │ │ ├ │ │ ├ ├ └ f ├ ├ ├ └ f e ─ ─ ─ ─ ─ e ─ ─ ─ ─ a ─ ─ ─ ─ ─ o ─ ─ ─ ─ . a ─ ─ ─ ─ ─ a ─ ─ ─ ─ i ─ ─ ─ ─ ─ o ─ ─ ─ ─ h d d n t t . M C F 主 t ├ ├ └ e L 主 语 导 s ├ ├ ├ ├ ├ ├ └ l ├ └ a s t e 版 返 主 e m h e S a 题 e ─ ─ ─ r o 题 言 航 b i ─ ─ ─ ─ ─ ─ ─ i ─ ─ r e e r 权 回 题 x l t t S v 脚 m ─ ─ ─ . g 切 切 菜 l n ─ ─ ─ ─ ─ ─ ─ s ─ ─ c a r . 信 顶 切 t m a i 本 p h o 换 换 单 o g t h r m h 息 部 换 e ( l 样 c l o x s t c l b t p t e s c . p c i c s t n 基 信 式 o a p _ c m k e r o o r d h o h o a v h . m d 础 ( 息 n t e c h l . e c s a i a m t r r e . h l _ 模 头 e n a e ( h a . t n t r m m t d s h t f 板 部 s g r m ( 主 t d h _ s _ e e l a . . t m ( o ) ) / r d a 导 内 m c t m l p _ n l h h m l 页 o a s _ 航 容 l r m e a o i t ( . t t l 脚 t p . j ) 区 u l t t s c s 列 h m m ( ) e h h s ) ( m a i t o . 表 t l l ( 标 r . t o 文 b . o . n h 页 m 搜 签 . h m n 章 s h n h s t ) l ( ( 索 / h t l . 页 . t _ t . m 名 归 页 分 t m h ) h m l m h l ( 片 档 ) 类 m l t t l i l t 门 模 页 页 l m m s m 户 式 ) ) l l t l 模 ) . 式 h ) t m l
核心模板详解 baseof.html - 基础模板 所有页面的基础骨架,定义了整体 HTML 结构:
1
2
3
4
5
6
7
8
9
10
11
12
13
<!DOCTYPE html>
< html lang = "{{ .Site.LanguageCode }}" dir = "auto" >
< head >
{{- partial "head.html" . -}}
</ head >
< body class = "{{ if .IsHome }}home{{ end }}" >
{{- partial "header.html" . -}}
< main class = "main" >
{{- block "main" . }}{{- end }}
</ main >
{{- partial "footer.html" . -}}
</ body >
</ html >
关键点 :
使用 block "main" 定义主内容区块 子模板通过 define "main" 填充内容 single.html - 文章页模板 单篇文章的展示模板:
文 ├ ├ ├ │ │ │ │ ├ ├ ├ ├ ├ ├ └ 章 ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ 页 ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ 结 构 面 文 文 ├ ├ ├ └ 多 目 文 编 分 上 评 包 章 章 ─ ─ ─ ─ 语 录 章 辑 享 下 论 屑 标 元 ─ ─ ─ ─ 言 正 链 按 篇 区 导 题 信 翻 ( 文 接 钮 导 航 息 发 阅 字 作 译 t 航 ( 布 读 数 者 列 o ( ( c ( ( 日 时 统 信 表 c e s ( o b p 期 长 计 息 . d h p m r o ( h i a o m e s t t t r s e a t r m _ e t n d _ a l p _ _ t c m n ) o i n s r e s s c a . u t l t o v h m a a . n _ t b . t h s l m s h i t . i l . t o m h n ) h m n l t k t l _ ) m s m ) l l . l i ) h ) s t t m . l h ) t m l )
list.html - 列表页模板 文章列表的展示模板,支持三种首页模式:
列 ├ │ │ │ ├ └ 表 ─ ─ ─ 页 ─ ─ ─ 结 构 首 ├ ├ └ 分 文 ├ ├ ├ └ 页 ─ ─ ─ 页 章 ─ ─ ─ ─ 模 ─ ─ ─ 导 条 ─ ─ ─ ─ 式 航 目 判 c p 默 封 标 日 摘 断 a o 认 面 题 期 要 r r 图 d t → ( M a 可 o l 文 选 d M 章 ) e o 列 d 表 → e c → a r p d o . r h t t a m l l . h t m l
head.html - 头部模板 包含所有 <head> 内的内容:
h ├ │ │ │ │ ├ ├ ├ │ │ │ ├ ├ │ │ │ └ e ─ ─ ─ ─ ─ ─ ─ a ─ ─ ─ ─ ─ ─ ─ d . M ├ ├ ├ └ 标 F C ├ ├ └ 主 S ├ ├ └ e h e ─ ─ ─ ─ 题 a S ─ ─ ─ 题 E ─ ─ ─ x t t ─ ─ ─ ─ v S ─ ─ ─ 切 O ─ ─ ─ t m a i 换 e l c v d k c 样 主 代 扩 脚 模 o x s n 标 h i e e o 式 样 码 展 本 板 p _ c d 结 签 a e s y n 式 高 样 e c h _ 构 r w c w 亮 式 n a e h s p r o g r m e e o i r r d a a t r p d a s _ d t t s p . j . i h h s h o . t o t n h m n m t l . l m h l t ( m 扩 l 展 区 域 )
自定义模板 方法一:覆盖主题模板 在站点根目录的 layouts 文件夹中创建同名模板文件,会自动覆盖主题模板:
y ├ │ │ │ │ └ o ─ ─ u ─ ─ r - l ├ │ └ t └ s a ─ ─ h ─ i y ─ ─ e ─ t o m e u _ └ p └ e j └ / t d ─ a ─ s i ─ s e ─ r ─ / j ─ / f t i a s i f a l ├ │ └ u i a o n a ─ ─ l n l o / y ─ ─ t g s t o / l / e u _ └ p └ e r t d ─ a ─ . . s e ─ r ─ h h / f t t t a s i f m m u i a o l l l n l o t g s t / l / e e r . . # # h h t t 覆 覆 m m 盖 盖 l l 主 主 题 题 的 的 s f i o n o g t l e e r . . h h t t m m l l
方法二:使用扩展模板 主题提供了 extend_head.html 和 extend_footer.html 扩展点:
添加自定义 CSS/JS :
创建 layouts/partials/extend_head.html:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!-- 自定义样式 -->
< style >
. my-custom-class {
color : red ;
}
</ style >
<!-- 引入外部 CSS -->
< link rel = "stylesheet" href = "https://example.com/style.css" >
<!-- 自定义脚本 -->
< script >
console . log ( 'Custom script loaded' );
</ script >
创建 layouts/partials/extend_footer.html:
1
2
3
4
5
6
7
<!-- 页脚自定义内容 -->
< div class = "custom-footer" >
自定义页脚内容
</ div >
<!-- 引入外部 JS -->
< script src = "https://example.com/script.js" ></ script >
方法三:创建新的部分模板 创建自定义部分模板并在主模板中引用:
创建 layouts/partials/my-component.html: 1
2
3
< div class = "my-component" >
{{ .Text }}
</ div >
在其他模板中引用: 1
{{ partial "my-component.html" (dict "Text" "Hello World") }}
页面类型模板 归档页 (archives.html) 时间线归档页面,按年份和月份展示所有文章:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{{ define "main" }}
< div class = "archive" >
< h1 > {{ .Title }}</ h1 >
{{ range .Site.RegularPages.GroupByDate "2006" }}
< div class = "archive-year" >
< h2 > {{ .Key }}</ h2 >
{{ range .Pages.GroupByDate "01月" }}
< div class = "archive-month" >
< h3 > {{ .Key }}</ h3 >
{{ range .Pages }}
< article >
< time > {{ .Date.Format "01-02" }}</ time >
< a href = "{{ .Permalink }}" > {{ .Title }}</ a >
</ article >
{{ end }}
</ div >
{{ end }}
</ div >
{{ end }}
</ div >
{{ end }}
访问路径 :/archives/
配置方法 :
1
2
3
4
5
6
menu :
main :
- identifier : archives
name : 归档
url : /archives/
weight : 20
搜索页 (search.html) Pagefind 搜索页面:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{{ define "main" }}
< div class = "search" >
< h1 > {{ .Title }}</ h1 >
< div id = "search" ></ div >
< link href = "/pagefind/pagefind-ui.css" rel = "stylesheet" >
< script src = "/pagefind/pagefind-ui.js" ></ script >
< script >
new PagefindUI ({
element : "#search" ,
showSubResults : true ,
showImages : false
});
</ script >
</ div >
{{ end }}
访问路径 :/search/
构建搜索索引 :
1
hugo && npx pagefind --site public --output-path public/pagefind
标签/分类页 (terms.html) 标签和分类的列表页:
1
2
3
4
5
6
7
8
9
10
11
12
13
{{ define "main" }}
< div class = "terms" >
< h1 > {{ .Title }}</ h1 >
< ul >
{{ range .Pages }}
< li >
< a href = "{{ .Permalink }}" > {{ .Title }}</ a >
< span > {{ len .Pages }} 篇</ span >
</ li >
{{ end }}
</ ul >
</ div >
{{ end }}
访问路径 :
404 页面 错误页面模板:
1
2
3
4
5
6
7
{{ define "main" }}
< div class = "error-404" >
< h1 > 404</ h1 >
< p > 页面未找到</ p >
< a href = "{{ .Site.BaseURL }}" > 返回首页</ a >
</ div >
{{ end }}
模板变量 全局变量 在模板中可使用的 Hugo 变量:
变量 说明 .Site站点对象 .Page当前页面对象 .Title页面标题 .Content页面内容 .Summary页面摘要 .Date发布日期 .Lastmod最后修改日期 .Permalink页面永久链接 .RelPermalink页面相对链接 .Params页面参数 .Site.Params站点参数
常用方法 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<!-- 获取配置参数 -->
{{ .Site.Params.author }}
<!-- 条件判断 -->
{{ if .Site.Params.ShowToc }}
{{ partial "toc.html" . }}
{{ end }}
<!-- 循环 -->
{{ range .Site.Menus.main }}
< a href = "{{ .URL }}" > {{ .Name }}</ a >
{{ end }}
<!-- 日期格式化 -->
{{ .Date.Format "2006年01月02日" }}
<!-- 字数统计 -->
{{ .WordCount }}
<!-- 阅读时长 -->
{{ .ReadingTime }}
部分模板详解 toc.html - 目录模板 生成文章目录,支持多种显示模式:
配置参数 :
1
2
3
4
5
6
7
params :
ShowToc : true
TocOpen : true
TocPosition : auto # left / right / auto
tocHover : true # 悬浮模式
tocHoverDelay : 200 # 悬浮延迟
tocHideDelay : 2000 # 隐藏延迟
social_icons.html - 社交图标模板 显示社交图标,支持悬浮二维码:
配置示例 :
1
2
3
4
5
6
params :
socialIcons :
- name : bilibili
url : https://space.bilibili.com/xxxxxx
title : 哔哩哔哩
hoverImage : /img/bilibili-qr.png
集成 Giscus 评论系统:
配置示例 :
1
2
3
4
5
6
7
params :
comments : true
giscus :
repo : "user/repo"
repoId : "R_xxxxx"
category : "Announcements"
categoryId : "DIC_xxxxx"
自定义示例 添加文章底部广告 创建 layouts/partials/extend_footer.html:
1
2
3
4
5
{{ if .IsPage }}
< div class = "post-ad" >
< p > 如果觉得文章有帮助,请支持作者 ❤️</ p >
</ div >
{{ end }}
添加阅读进度条 创建 layouts/partials/extend_head.html:
1
2
3
4
5
6
7
8
9
10
11
12
< style >
. reading-progress {
position : fixed ;
top : 0 ;
left : 0 ;
width : 0 % ;
height : 3 px ;
background : linear-gradient ( to right , #4CAF50 , #2196F3 );
z-index : 9999 ;
transition : width 0.1 s ease ;
}
</ style >
创建 layouts/partials/extend_footer.html:
1
2
3
4
5
6
7
8
9
10
11
{{ if .IsPage }}
< div class = "reading-progress" id = "readingProgress" ></ div >
< script >
window . addEventListener ( 'scroll' , function () {
var winScroll = document . body . scrollTop || document . documentElement . scrollTop ;
var height = document . documentElement . scrollHeight - document . documentElement . clientHeight ;
var scrolled = ( winScroll / height ) * 100 ;
document . getElementById ( "readingProgress" ). style . width = scrolled + "%" ;
});
</ script >
{{ end }}
自定义文章归档样式 创建 layouts/_default/archives.html:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{{ define "main" }}
< div class = "archive-custom" >
< h1 > 文章归档</ h1 >
{{ range .Site.RegularPages.GroupByDate "2006" }}
< div class = "year-group" >
< h2 class = "year-title" > {{ .Key }}年</ h2 >
{{ range .Pages }}
< article class = "archive-item" >
< time datetime = "{{ .Date.Format " 2006-01-02 " }}" >
{{ .Date.Format "01-02" }}
</ time >
< a href = "{{ .Permalink }}" > {{ .Title }}</ a >
< span class = "category" >
{{ range .Params.categories }}{{ . }}{{ end }}
</ span >
</ article >
{{ end }}
</ div >
{{ end }}
</ div >
{{ end }}
加载评论中...