博客优化美化记录前言
这一篇接着之前的建站记录往下写跳转链接
,主要整理这一阶段我对博客前端和交互做的连续优化。
这一次不再是“把博客搭起来”,而是开始一块一块把首页、分页、侧栏、搜索页、分类页、About 页、页脚、看板娘和首页欢迎语继续往自己想象的风格上收。
这篇里的内容基本按 git 历史和当前工作区还没提交的改动来整理。
和之前一样,我尽量把关键代码、资源路径和文件位置都写出来
这一阶段的提交线
优化完能从 git 里直接看到的提交一共有 19 个,主要集中在下面这些时间点:
| |
后面还有一批没有提交进 git 的新改动,主要集中在 核心是首页终端欢迎语、移动端主题切换按钮和 About 页继续调整。
首页底部遮挡、样式链路和返回顶部按钮
一开始最明显的问题,不是布局多花哨,而是首页底部看起来有遮挡感,另外很多自定义样式写进去后不一定真的生效。
接管站点自己的 SCSS 主入口
这一块最重要的不是视觉,而是先保证 custom.scss 真能编译进最终样式里。
我在根目录增加了自己的样式入口 assets/scss/style.scss,直接沿用主题原本的导入顺序,最后再手动引入自定义样式。
文件:assets/scss/style.scss
| |
这样做的好处是后面所有写在 assets/scss/custom.scss 里的覆盖样式,都会走 Hugo 这条正式编译链,不会被主题默认入口绕开。
根模板里增加新的返回顶部按钮
后面我把旧的返回顶部按钮方案彻底换掉了,不再使用一个单独图片按钮,而是改成带进度环的结构
文件:layouts/_default/baseof.html
| |
这里还顺手把旧方案注释保留在模板里了,方便以后回头看:
| |
对应资源也保留了两份:
| |
这一步的重点不是“加了个按钮”,而是把返回顶部逻辑收成唯一入口,避免旧脚本、旧结构和文章里的示例代码互相冲突。
页脚结构回退后重新做成毛玻璃卡片
页脚这块改过很多次,最后还是回到“信息结构不要太花,但视觉要更稳”的方向。
页脚模板保留原信息结构
我最后没有坚持用完全重构后的新结构,而是把页脚信息收回到比较稳定的这套:
文件:layouts/partials/footer/footer.html
| |
这样做的原因很简单,信息密度合适,而且不会像我中途那版大卡片一样显得太满。
用 SCSS 把它收成玻璃浮层
模板保留原信息结构后,视觉主要交给 assets/scss/partials/footer.scss 来做。
最后留下来的样式大概是这样:
文件:assets/scss/partials/footer.scss
| |
这里关键不是加很多效果,而是:
- 亮色下像半透明蓝灰玻璃
- 暗色下真正变成深灰蓝玻璃
- 不让页脚在切主题时“几乎不变”
首页布局改版和欢迎区升级
原先样式
首页最开始的欢迎区其实还是静态拼字
在真正做终端欢迎语之前,首页标题区还只是简单的 span 拼字动画。
历史文件:git show 9935a4c:layouts/index.html
| |
配套样式也放在 assets/scss/custom.scss 里:
| |
这时候首页已经和默认主题不太一样了,参考的是koala 的美化博客,但是总感觉少了点什么…
修改:终端打字动画
这一部分是最近在工作区里继续改的,也是我这次最想要的效果之一。
把随机文案收进配置文件
为了不把文案写死在模板里,我先在 hugo.yaml 里加了一个可配置列表:
文件:hugo.yaml
| |
这样以后欢迎区要换句子,就不需要再进模板改 JS 数组。
首页模板从静态文案换成终端结构
文件:layouts/index.html
| |
JS 控制欢迎阶段、提示符阶段和循环打字
同一个模板里还写了控制逻辑:
文件:layouts/index.html
| |
这里最重要的是 syncLineOffset(),因为我希望长句出现时,消息轨道整体左推,而不是把固定提示符一起挤掉。
对应 SCSS:欢迎层、提示符、消息轨道和光标
文件:assets/scss/custom.scss
| |
这样首页欢迎区最后实现的是:
- 先打出欢迎语
- 欢迎层做模糊擦除
- 再切到固定
$nan0in27: - 后面随机短句循环打字
- 句子太长时只推动消息轨道,不挤掉 prompt
- 光标跟着消息末尾移动
这一步做完之后,首页的辨识度终于比之前那版简单的欢迎字条高很多。
首页模板切到自己的文章区结构
首页文章区也在这一阶段从默认列表逐渐收成更明确的主内容区域:
文件:layouts/index.html
| |
这一步后,首页已经不是纯粹的主题原样了,后面很多分页和欢迎区调整,都是围绕这套首页模板继续做。
封面回退和无图文章收口
这一块其实特别实用,因为文章列表一旦有几篇没图或者封面路径失效,整个观感就会很乱。
紧凑卡片补上 has-image / has-no-image
为了防止无图文章还在右边留下一块空图片区,我又改了紧凑卡片模板:
文件:layouts/partials/article-list/compact.html
| |
这样分类页、归档页和紧凑列表里的无图文章就不会再显得像“右边本来应该还有一张图”。
搜索页修数据源,分类页右栏改单独挂件
搜索页先修 data-json
搜索页一开始的问题不是样式,而是表单绑定和数据源本身。
最早搜索页模板大概是这样:
历史文件:git show 6ca7fd0:themes/hugo-theme-stack/layouts/page/search.html
| |
后面为了避免脚本和左栏搜索框互相串掉,给搜索页主表单单独加了类名:
文件:themes/hugo-theme-stack/layouts/page/search.html
| |
搜索脚本只绑定目标表单
对应的逻辑在
文件:themes/hugo-theme-stack/assets/ts/search.tsx(我的博客底下有留存模板用于减少修改)
| |
这里核心就是让 this.form.dataset.json 真正指向搜索 JSON,而不是被别的表单抢走。
分类页右栏换成“当前分类 / 分类 / 相关标签”
默认右栏对分类页不够有针对性,所以我后来单独补了一个挂件:
文件:layouts/partials/widget/category_context.html
| |
这一版还做了两件事:
- “相关标签”只统计当前分页里的文章
- 标签用 map 去重,避免同一个 tag 重复输出
对应样式也在:
文件:assets/scss/custom.scss
| |
分页反复重构,最后统一到首页和分类页
这一部分是这一轮里改动最密集的区域。
最开始的分页还是双下拉结构
最初分页模板大概是这个逻辑:
文件:layouts/partials/pagination.html
| |
能用,但交互感不够统一,而且首页和分类页看起来也不像同一站。
重做成可输入页码的跳转面板
后面我在 c814ca1 这一步把它重做成 details + form 结构:
历史文件:git show c814ca1:layouts/partials/pagination.html
| |
对应的前端跳转逻辑也直接写进模板里了:
| |
分页样式继续收敛
后面我又一直在 assets/scss/custom.scss 里打磨分页层级,尤其是:
- 当前页高亮
- 暗色下非当前页不要发白
- 首页和分类页完全统一
- 展开页码和跳转面板分离
相关样式基本都集中在这些位置:
| |
这部分实际上是反复试,最后才收成统一观感。
非首页左栏统一、移动端主题切换和 GIF 懒加载
左栏加移动端顶部主题切换按钮
桌面端保留左栏主题切换后,移动端我单独做了一个按钮放在顶部。
模板里直接新增一个按钮节点:
文件:themes/hugo-theme-stack/layouts/partials/sidebar/left.html
| |
同时把桌面端原本的大按钮继续保留在菜单区:
| |
对应移动端 SCSS
这一块对应样式集中在 assets/scss/custom.scss 的移动端 media query:
| |
这样移动端不会去硬复用桌面端那根长条轨道,而是直接用一个更紧凑的顶部按钮。
左栏 GIF 改成懒加载插入
我没有直接在模板里塞图片,而是用 data 属性占位,再由脚本按需插入:
文件:themes/hugo-theme-stack/layouts/partials/sidebar/left.html
| |
资源路径:
| |
对应脚本在:
文件:themes/hugo-theme-stack/assets/ts/main.ts
| |
主题切换和菜单初始化提前到 DOMContentLoaded
为了不再等整页资源全加载完,主题切换和菜单逻辑被提前初始化:
文件:themes/hugo-theme-stack/assets/ts/main.ts
| |
这一步后,移动端折叠菜单和主题按钮在页面资源没完全加载完之前就能响应。
About 页重做、文章头图关闭和时间线短代码
About 页内容改成独立卡片区
这一步里,我不想让 About 页继续像普通文章一样,所以直接重写了内容结构:
文件:content/page/about/index.zh-cn.md
| |
这里最关键的是 image: false,因为我不想让 About 页继续带普通文章的头图。
文章头图模板里显式排除 About、归档和友链页
对应逻辑在:
文件:themes/hugo-theme-stack/layouts/partials/article/components/header.html
| |
这一步后,content/page/about/index.zh-cn.md、归档页和友链页就不会再误显示文章头图。
时间线短代码改成竖线节点结构
About 页里我还顺手把 timeline 短代码重写了一版:
历史文件:git show c9cec9d:layouts/shortcodes/timeline.html
| |
配套样式直接写在短代码内部,避免漏引用:
| |
这里还用到了 .Page.Scratch 避免样式重复注入:
| |
粒子背景、字体和看板娘入口继续收口
这一块虽然不是这次的唯一重点,但它们和首页观感关系很大。
粒子背景依然走 Hugo 资源加载
文件:layouts/partials/footer/custom.html
| |
资源路径:
| |
本地字体继续用 Hugo 资源输出
文件:layouts/partials/footer/custom.html
| |
资源路径:
| |
看板娘加载逻辑合并为一个入口
这一块主要是修“首次点击不直接显示”和“关闭后入口不恢复”的问题。
文件:layouts/partials/footer/custom.html
| |
相关资源路径:
| |
这一步主要是把第三方按钮藏起来,只保留我自己站点里的入口。
代码块折叠效果升级(双向展开/收起)
上一阶段建站记录里做的代码块折叠只能展开、不能收起,而且展开后横向滚动条会消失。这一轮把它整体重写了一版。
核心改动:
- 展开/收起双向都有按钮
- 折叠态用
max-height: 400px+overflow: hidden裁剪 - 展开态恢复
overflow: visible,pre层单独保持overflow-x: auto,修复横向滚动条 - 遮罩从底部渐变淡出,深色/浅色各一套
- 按钮改成 32×32px 纯圆形,只有 SVG 箭头,无文字
文件:layouts/partials/footer/custom.html
| |
效果:超过 400px 的代码块初始折叠,底部有渐变遮罩和向下箭头按钮;点击展开后遮罩消失,代码块下方出现向上箭头按钮;点击收起时若视口已滚过代码块顶部会先平滑滚回再收起。
手机端悬浮目录按钮
桌面端有左侧固定目录栏,但手机端没有,看长文时要滚回顶部才能看目录。这一次在手机端右下角加了一个悬浮按钮,点击从右侧滑出目录面板。
实现思路:
- HTML 结构直接写在根模板
baseof.html里,由 JS 判断条件后决定是否显示 - 样式写在
custom.scss,通过@media (min-width: 1025px) { display: none !important; }确保只在手机端生效 - JS 克隆桌面端
.widget--toc内的#TableOfContents,强制展开所有层级,注入手机面板;用MutationObserver同步桌面 TOC 的active-class到手机面板
HTML 结构
文件:layouts/_default/baseof.html
| |
SCSS 样式
文件:assets/scss/custom.scss
| |
JS 逻辑
文件:layouts/partials/footer/custom.html
| |
效果:手机端(≤1024px)文章页右下角出现紫色圆形悬浮按钮,点击从右侧滑入毛玻璃目录面板,完整展示所有标题层级,当前阅读位置同步高亮,点击遮罩/关闭按钮/ESC 关闭面板。
这一轮里改到的关键文件
后面如果我要继续沿着这篇记录往下写,最常回头看的应该还是这些文件:
| |
小结
这一次和最开始建站最大的区别,是我不再满足于“博客能跑起来”,而是开始把每一个细节收成更适合自己的东西。
有些地方看起来只是一个小改动,比如:
- 默认封面回退
- 搜索页表单绑定
- 分类页相关标签去重
- 移动端主题按钮位置
- 欢迎语里光标跟随消息轨道
但真正动手改的时候,往往会同时牵动模板、SCSS、JS、配置文件和资源路径。
也正因为这样,这一轮优化虽然细碎,但整体上比最开始建站时更像一次真正的“站点个性化”。
后面大概还会继续写下去,尤其是首页欢迎区、分页细节和独立页面统一这几块,应该还会继续打磨。
