博客PRD v1.0.4

背景

v1.0.3 实现了左侧常驻悬浮目录和章节高亮,但存在三个问题:文章样式与布局耦合在单文件中难以维护、常驻侧栏压缩正文空间、跨页面卡片位置漂移。

v1.0.4 围绕交互体验升级代码组件化两条主线推进。


需求

1. 图片全宽渲染

正文图片从固定 960px 上限改为默认撑满内容区,.wide-image(1080px)和 .small-image(560px)作为显式约束类保留。

![图片全宽对比]


2. 大纲目录重构:侧栏 → 悬浮缩略 UI

2.1 设计理念

原侧边栏常驻占用正文空间。新方案参考浏览器设置面板:默认收起为缩略按钮,点击后展开浮层覆盖,正文独占全宽,用户三步完成操作(点按钮 → 选章节 → 阅读)。

2.2 交互

缩略按钮 → 单击展开浮层(左侧滑入 + 半透明遮罩)→ 单击遮罩/按钮/章节链接/Esc 收起

2.3 桌面端

缩略按钮嵌入顶部导航栏,紧贴主题切换按钮右侧,横排显示 ”☰ 大纲 ●“(圆点为位置指示器)。点击后 TOC 面板从左侧滑入,宽 320px,当前章节高亮。

imageimage

2.4 移动端

按钮变为左下角圆形 FAB(直径 3.2rem),点击后同样从左侧滑入面板(宽 85vw)。深浅色模式下均有足够对比度。

imageimage

2.5 与原方案对比

v1.0.3v1.0.4
TOC 默认态侧边栏常驻,占用 grid 列缩略按钮嵌入导航栏
正文宽度与 TOC 共享空间正文独占全宽
关闭方式遮罩 / 按钮 / 链接 / Esc
移动端静态在正文上方FAB + 左侧滑入
位置感知面板高亮 + 按钮圆点指示

3. 代码架构组件化

Layout.astro(260行)和 [...slug].astro(330行)中的内联样式与逻辑拆分为独立组件和样式文件。

  • Layout 拆解:NavBar、Footer、ThemeScript 各自独立;全局 CSS 变量抽取为 theme.css;文章排版样式抽取为 prose.css
  • remark 插件模块化:350 行单体拆为 7 个单职责模块(wiki-link / image-size / soft-break / urls 等)
  • 新增组件TocThumbnail.astro(缩略按钮)、FloatingToc.astro(重写为 overlay 模式)

重构后 Layout.astro 从 260 行缩减至 35 行。

image
重构后


4. 布局一致性与 Bug 修复

4.1 跨页面卡片漂移

两个根因:短页面无滚动条导致 ~17px 水平偏移(修复:html { scrollbar-gutter: stable });各页面 h1 margin 不一致(修复:统一到 Layout 全局声明)。

4.2 导航栏深浅色适配

v1.0.3 浅色主题下导航栏变量遗漏,始终显示深蓝黑色。v1.0.4 浅色主题改为浅灰白底 + 深色文字,与深色主题形成完整对应。

imageimage
移动端

imageimage
Web端

4.3 导航栏 sticky

导航栏改为 position: sticky,滚动时始终冻结在页面顶部,同步设置 scroll-padding-top 确保锚点跳转不被遮挡。

4.4 主题切换修复

v1.0.3 重构时事件绑定脚本误放在 <head> 中,DOM 未渲染导致切换失效。修复为防闪烁脚本保留在 <head>,事件绑定回归 <body> 末尾。


设计决策

#决策
1缩略按钮嵌入导航栏(非独立悬浮),ThemeToggle 右侧
2面板从左侧滑入(与按钮同侧)
3移动端左侧滑入(非底部抽屉)
4点击章节自动收起,三步操作最优
5位置指示器当前版本实现(面板高亮 + 按钮圆点)
6导航栏 sticky 冻结 + 浅色主题适配

版本一览


Written By Six_moon