
HY
折腾进行时
Hello, I'm HY.








暂未播放

前一篇写了首页贴纸卡片的魔改过程,这次折腾的是另一件事:博客日志页。
起因还是刷 rainzt.cn。他们首页有贴纸,里面还有个 /blog-changelog/ 的更新日志,每次改动都记一条,版本号、变更明细、时间线摆得整整齐齐。我当时就想,这习惯挺好——博客又不是写完就扔,以后改了什么自己也该有个账本。
说干就干,最后做出来的成品长这样:

一开始我没去扒源码,让 AI 帮我”描述一下这个页面长什么样”,照着那个概述做了个版本:一个卡片加几条列表。
结果被自己打脸了。和源站的出入大到没法看——人家是 hero 统计卡加时间线加大卡片,我做出来的是个毛坯。最讽刺的是我还写了个”详细记录”,把写博客文章这种事也塞进了变更明细。
痛定思痛,还是老老实实扒源码。
第一步是 curl 把页面和它自己的样式文件都拉下来:
1curl -sL https://rainzt.cn/blog-changelog/ -o changelog.html2# 从 HTML 里找到它引用的样式文件3grep -o 'blog-changelog[^"]*\.css' changelog.html4# 再把这个 CSS 也拉下来5curl -s https://rainzt.cn/_astro/blog-changelog.A9uhDpGh.css -o changelog.css然后对着 HTML 的结构一层层拆,它的页面骨架长这样:
1blog-changelog-page2├── hero(眉线 + 标题 + 描述 + 版本规则 + 2×2 统计卡)3├── nav(返回链接 + 按日倒序说明)4└── ol.list(时间线)5 └── li.entry × N6 ├── date(日期 + 第几次记录)7 ├── rail(圆点 + 轴线)8 └── article.card(版本徽章 + kind 短语 + h2 + 描述9 + details 折叠明细 + tags)关键细节在 CSS 里:时间线轴线是一条渐变的 1px 竖线,圆点是主题色带光环(box-shadow: 0 0 0 .22rem),折叠明细用原生 <details> 配展开动画,箭头旋转 180 度。这些光看概述是绝对看不出来的。
原来用的是 max-height 过渡,但这个写法有个先天问题:得给容器估一个固定高度,估小了正文就被裁掉。后来发现日志正文长到三五行的就显示不全了,改成了 grid-template-rows: 1fr ↔ 0fr——高度由内容自己决定,多长都能完整展开。详见 V1.3 的日志条目。
照着结构重做了一版。和首页贴纸一样,我给自己定的规矩是不碰主题源码,方便以后合并 CuteLeaf/Firefly 上游的更新。所以拆成三块:
| 文件 | 作用 |
|---|---|
src/pages/blog-changelog.astro | 页面入口,Astro 按文件名自动生成 /blog-changelog/ 路由 |
src/components/features/ChangelogTimeline.astro | 时间线组件,HTML + 全部 CSS 自包含 |
src/config/blogChangelogConfig.ts | 日志数据,以后每次更新只改这一个文件 |
这个方案最舒服的地方是记日志完全不用碰代码,往配置里加一个对象就行:
1{2 version: "V1.0",3 title: "首页贴纸卡片",4 date: "2026-09-06",5 summary: "首页来了套新皮肤",6 description: "给首页壁纸区加了一套可拖拽的贴纸装饰和个人卡片……",7 items: [8 { category: "首页", text: "新增壁纸装饰卡片……" },9 { category: "视觉", text: "贴纸布局按列对齐……" },10 ],11 tags: ["首页", "贴纸", "视觉", "移动端", "性能"],12}样式全部复用 Firefly 的主题变量(--line-divider、--content-meta、--card-bg、--primary),深浅色模式自动适配,一行硬编码颜色都不用写。
所有数据集中在 src/config/blogChangelogConfig.ts,加一条日志就是在数组最前面插一个对象:
1{2 version: "V1.1",3 title: "站内搜索", // kind 徽章上的短语4 date: "2026-09-20",5 summary: "搜索页换了新引擎", // 卡片大标题,要短6 description: "把站内搜索换成了 Pagefind……", // 标题下的一段说明7 items: [8 { category: "首页", text: "具体改了什么" },9 { category: "性能", text: "又改了什么" },10 ],11 tags: ["搜索", "性能"],12}字段逐个说一下:
| 字段 | 作用 | 注意点 |
|---|---|---|
version | 版本号,显示在卡片左上角 | 按 Major/Minor/Patch 规则自己定 |
title | kind 短语徽章 | 3-6 个字最合适,颜色按条目顺序自动循环 |
date | 日期 | YYYY-MM-DD,同时决定时间线排序(数组顺序就是页面顺序) |
summary | 卡片大标题 | 短句,一句话 |
description | 卡片描述 | 多写两句没问题,这里适合展开 |
items | 变更明细 | category 是分类徽章(首页/视觉/修复/性能/内容/维护…随便起,没配色的分类自动用灰色),text 是说明 |
tags | 底部标签 | 照抄明细里的分类就行 |
加完保存,页面、统计卡(更新日数、记录条数、时间跨度)全部自动更新,不用改任何代码。
明细会按奇数偶数自动分成左右两列(顺序 01 左、02 右、03 左……),手机端自动叠成单列。明细项本身可以点箭头折叠,默认展开。
页面上写的那套规则:Major 结构级升级、Minor 新功能、Patch 修复和内容维护。像这次加贴纸卡片这种纯新增功能,按 Minor 算应该是 V1.0——版本号不用太纠结,能看出大小就行。
写完这篇之后我一直在往里记账,现在页面已经走到 V1.5 了,七条记录、四十多条明细。回头看看这个”账本”还挺有用的:哪些改动是性能相关、哪些是修 bug,翻一遍就清楚,比在 commit 历史里翻好找多了。
源站的统计卡是写死的,我这里全部从配置实时算出来:
1const totalItems = entries.reduce((sum, e) => sum + e.items.length, 0);2// 时间跨度:最早一条到最新一条,格式 26.09—26.093const dateSpan = `${最早.date.slice(2, 7).replace("-", ".")}—${最新.date.slice(2, 7).replace("-", ".")}`;当前版本取数组第一条、更新日数取数组长度、“第 N 次记录”倒着数。以后加日志,统计数字自己会涨,不用维护。

这页做完,博客就算有了自己的”账本”。V1.0 已经把贴纸卡片那次的改动全记进去了,以后每折腾一次就记一条,看着版本号往上走,还挺有成就感的。
和贴纸一样,这次依然是三个新文件加两处内容文件的小改动,合并上游时零冲突。需要的人可以照这个思路给任何静态博客加日志页:路由靠文件约定,数据放配置,样式自包含。
页面地址:/blog-changelog/,导航栏「关于 → 博客日志」也能进。
如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!
部分内容可能已过时
分享你的想法,与大家交流讨论