前言
之前使用 Halo 时,可以通过插件实现瞬间页面,类似发朋友圈一样。对我来说,一些简单的内容又不想单独作为一篇文章,瞬间页可以很好的满足需求。 但是转用 hugo 后,搜索了很多教程和优秀的博主站点都没有该功能。抄不了那没办法只能硬着头皮自己码代码了。
如果你不想了解实现过程,可直接跳转到 完整代码,直接复制完整代码。 如果你使用的是本站开源主题 PaperMod-PE 可直接跳转 使用教程。
效果展示
你可以前往 🌟 瞬间 预览本站最新的实现效果。
基本思路
moments
来作为瞬间页内容的来源,每条瞬间一个 md
文件。页面模板
为了展示瞬间的内容,第一步新建一个瞬间页面模板,来容纳每一条瞬间。
基于我们的目标,需要将多个 md
文件内容容纳到一个页面,并且考虑到未来内容很多时的还需要分页展示,所以这里采用 Section page templates。
根据文档 Section pages 可知,我们可以使用多种形式来创建这个界面模板。我们这里以 layouts/section/list.html
形式为例。
创建 list.html
,路径为 layouts/moments/list.html
,瞬间界面结构在此定义。
本站瞬间界面结构参考微信朋友圈实现。
Build options
基于我们的目标,将多个 md
文件整合到一个界面后,那么就不应该在单独渲染每一条瞬间原本的界面,否则会污染整个站点的结构(如 site.Pages
包含很多瞬间的内容,这不是我们希望看到的)。
通过查阅官方文档,了解到 Hugo Build options。这也是我们实现这个功能的一个核心。
根据文档内容,我们可以创建 _index.md
:
|
|
这样我们重启 hugo,就可以访问 http://localhost:1313/moments/
界面了,并且 content/moments
目录下所有 md
都不会被渲染成页面。
评论
根据 Giscus 官方文档 可知,我们可以通过修改参数 data-mapping="specific"
并指定 data-term
, 来自定义页面 ↔️ discussion 映射关系。
这使得我们能为每个瞬间实现评论功能。
由于 giscus 实现方式,没办法同时显示所有瞬间评论内容,因此采用更简单粗暴的方式,用户主动点击右下角评论按钮再展示评论区。
通过在页面模板中,将每个瞬间的 slug
赋值到评论按钮的属性 (data-slug
) 上,然后通过这个值在 JS 中动态生成每个瞬间的 data-term
。
如果你的站点使用的不是 Giscus,你可以参考你的评论系统的官方文档来修改评论按钮的点击方法 function showComment(element)
。
使用教程
PaperMod-PE
请先更新到最新版本。
创建 _index.md
: (内容参考如下)
|
|
DateFormat
:修改瞬间显示的时间格式。你可以参考 官方文档 自定义你的时间格式。
如果未配置此项,则默认使用站点的 DateFormat
。即:(以下为示例)
|
|
这样你就可以访问瞬间界面 /moments
。
如何新增一条瞬间
在 moments
目录下创建一个 md
文档,frontmatter
参考如下:
|
|
参数说明:
date
是可选的。在瞬间左下角显示的时间。(建议显示指定该值,如果你未配置此项,也可能显示时间,因为赋值方式为.Param "date"
)slug
是必须的。它涉及到与评论绑定,建议使用 UUID 或随机数来保证不重复。tags
是可选的。标记这条瞬间的标签,可以为多个。(注意,此标签与文章标签无关)hideComment
是可选的。如果为true
则不会在这个瞬间的右下角显示评论按钮。
完整代码
moments.html
|
|
moments.css
|
|
感谢您的耐心阅读!来选个表情,或者留个评论吧!