阅读模式:专注长文阅读

桌面端隐藏侧栏、图像,浮动 ✕ 退出 — Quartz 内置 ReaderMode + 定制 CSS

交互流程

普通模式 左侧栏 visible 正文 右侧栏 visible 📖 阅读模式按钮 点击 阅读模式 opacity: 0 专注阅读 ↑ opacity: 0 迭代历史 v1 — grid-template-columns 0 1fr 0 → 占位消失 ❌ v2 — opacity 隐藏 hover 无法退出 ❌ v3 — opacity + 浮动 ✕ ✅ 当前方案 — 保留占位 + 可靠退出 平板断点 Bug: v1 使用 $desktop (≥1200px) 断点 → 平板 (800-1200px) 按钮可见但 CSS 不匹配 → 点了没用。修复:在 max-width:1200px 隐藏按钮。

实现原理

阅读模式基于 Quartz 内置 ReaderMode.tsx 组件,但交互逻辑经历了三次迭代才稳定:

样式层(custom.scss)

:root[reader-mode="on"] {
  @media all and ($desktop) {
    .sidebar.left,
    .sidebar.right {
      opacity: 0;           // 保留占位,不改变网格
      pointer-events: none; // 禁用交互
      transition: opacity 0.25s ease;
    }
  }
  .center img, .center video, .center iframe, .center .mermaid {
    display: none;          // 隐藏媒体,纯文字阅读
  }
}

// 浮动退出按钮
.readermode-exit {
  position: fixed; top: 1rem; right: 1rem;
  z-index: 200;
  // 悬停高亮...
}

// 平板/手机隐藏(仅桌面 ≥1200px 支持)
@media all and (max-width: 1200px) {
  .readermode-exit, .readermode { display: none; }
}

脚本层(readermode.inline.ts)

// 切换 
// 进入时创建浮动 ✕ 按钮,退出时移除
// SPA 导航时保持状态

设计决策

决策选择原因
隐藏方式opacity: 0保网格占位,避免内容跳动。grid collapse 会导致居中列突然变宽
退出机制固定浮动 ✕ 按钮侧栏不可见后 hover 无法触发,必须有独立退出路径
适用范围仅桌面 ≥1200px平板/手机上侧栏不同布局,hide 后 layout 破坏。直接隐藏按钮
媒体隐藏display: none阅读模式应该只显示文字,图片视频干扰专注
SPA 导航监听 nav 事件切换页面后保持阅读模式状态,不会意外退出
为什么不用 grid collapse?grid-template-columns: 0 1fr 0 看起来更「干净」,但会导致内容区突然撑满全宽,文字行宽失控,阅读体验反而更差。opacity: 0 保留了布局稳定性。

相关文件

文件作用
quartz/components/ReaderMode.tsxQuartz 内置,负责挂载 inline 脚本
quartz/components/scripts/readermode.inline.tsQuartz 内置(定制了浮动退出按钮逻辑)
quartz/styles/custom.scss★ 核心定制 — opacity 隐藏、浮动按钮、断点控制
quartz.layout.ts注册 ReaderMode 到侧边栏工具栏