惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

F
Fortinet All Blogs
爱范儿
爱范儿
P
Proofpoint News Feed
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
T
Tailwind CSS Blog
J
Java Code Geeks
宝玉的分享
宝玉的分享
Jina AI
Jina AI
B
Blog
N
Netflix TechBlog - Medium
Recent Announcements
Recent Announcements
aimingoo的专栏
aimingoo的专栏
腾讯CDC
C
Check Point Blog
The Cloudflare Blog
阮一峰的网络日志
阮一峰的网络日志
博客园 - Franky
罗磊的独立博客
B
Blog RSS Feed
WordPress大学
WordPress大学
小众软件
小众软件
博客园 - 叶小钗
M
MIT News - Artificial intelligence
GbyAI
GbyAI

atpX

自建 S3 兼容对象存储服务 Garage 听风的歌 偶尔是深夜就好了 新玩具 AirPods Pro 3 公交车上的时间 从 WHOIS 到 RDAP 通过 WireGuard 访问 NFS 共享文件 自建音乐串流服务探索 我停止了探索 Fediverse 互联网背景噪音 我的数字生活降级 小城与确定性的墙 一只特立独行的猪 Fediverse 与社交 承认的勇气 mediaX - 轻量书影音记录管理工具 我的博客写作流程 网站新增 Misc 页面 擅长对线的鲍勃 在 Chroot 环境下使用 Rsync 同步 再见 JavaScript 当我玩博客时我在玩什么 为什么我的博客没有友链页面 小熊猫与大熊猫 (HDR 照片测试) 是时候为网站开启 HTTP/3 支持了吗 使用 AdGuard Home 搭建自用 DoH 服务 谈谈读书与消遣 2023 年终总结 西安两日游 从 AirPods「升级」到 EarPods
Hugo 使用 Fancybox 实现图片灯箱/放大功能
ATP · 2021-08-21 · via atpX

我的小破站一直都在用 Fancybox 实现图片灯箱效果,但是本站是用 Typecho 搭建的,使用 PHP 直接替换图片的链接格式就好了,实现起来比较简单。前段时间用 Hugo 搭建了一个静态网站,感觉实现起来就比较麻烦主要是懒,所以一直搁置了,现在需求已经迫在眉睫了,花了点时间研究一些。

hugo-fancybox
Fancybox 官网文档页面。

最开始的思路是通过 js 实现,但效率似乎不高,实现起来也麻烦。对于 Hugo 本身的 Markdown 渲染方式也没有过多的了解,网上的方法大多是引入 Fancybox 组件后通过 shortcode 的方式调用 html 实现,但这样的话以前文章的图片还得去一个一个修改,平时写起来也麻烦。

好在无意中看到了 Maupassant 主题的一个 PR,查阅文档后发现他的方法是新增一个 render-image.html 文件,通过 Markdown Render Hooks 的方式覆盖 Hugo 的 Markdown 渲染方式,就可以轻松的解析和处理图片内容,结构如下:

layouts
└── _default
    └── _markup
        ├── render-image.html
        ├── render-image.rss.xml
        └── render-link.html

官方解释可以通过该文件实现替换链接,修改 img 样式,例如添加 target=_blank 属性等功能。

因此,只要借助这个方法,就可以轻松的实现 Fancybox 的功能了,你只需要做以下三步:

  1. 修改网站根目录下的 config.toml 或者 config.yaml 文件,我的配置文件为 toml 格式,yaml 需要自行调整格式,在 [param] 参数下添加以下内容:
[param]
    fancybox = true
  1. 在你的主题目录下创建以下路径和文件:
/layouts/_default/_markup/render-image.html

编辑 render-image.html 添加以下内容:

{{if .Page.Site.Params.fancybox }}
<div class="post-img-view">
<a data-fancybox="gallery" href="{{ .Destination | safeURL }}">
<img src="{{ .Destination | safeURL }}" alt="{{ .Text }}" {{ with .Title}} title="{{ . }}"{{ end }} />
</a>
</div>
{{ end }}
  1. 在你主题 layouts/partials 目录下的 head.html 或者 footer.html 中添加:
{{if .Page.Site.Params.fancybox }}
<script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.min.js"></script>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/fancyapps/fancybox@3.5.7/dist/jquery.fancybox.min.css" />
<script src="https://cdn.jsdelivr.net/gh/fancyapps/fancybox@3.5.7/dist/jquery.fancybox.min.js"></script>
{{ end }}

接下来就可以直接 hugo server 看看效果了,如果你后面不想在使用 Fancybox,只需要将第一步中的 true 改为 false 即可。其实如果常态化使用的话,就不需要判断了,可以跳过第一步,把第二步和第三步中的 {{if .Page.Site.Params.fancybox }}{{ end }} 去掉。

不过通过 Markdown hooks 的方式修改图片会有一个小问题,就是在图片的上面和下面会出现空白的 <p></p> 标签,如果你感兴趣的话可以看看这个具体讨论的 issue

最后吐槽下一直都觉得 Typecho 算比较折腾了,现在发现 Hugo 更加折腾…