主题定制与功能扩展

Quartz 的配色、字体、UI 组件和性能优化,全在这一篇。


配色方案

选择历程

浅色主题换了好几轮:默认 → Catppuccin Latte → Nord Light → Vitesse Light → Snazzy Light,最后才定下来。暗色主题一直用 One Dark,没换过。

配置方式

quartz.config.tstheme.colors 中定义 9 个颜色变量:

theme: {
  colors: {
    lightMode: {
      light: "#FFFBF0",      // 背景色
      lightgray: "#E8E4DA",   // 边框/分割线
      gray: "#B0AC9F",        // 次要文字
      darkgray: "#505050",    // 正文
      dark: "#2B2B2B",        // 标题
      secondary: "#4876D6",   // 链接/强调色
      tertiary: "#FF6363",    // 悬停色
      highlight: "rgba(72, 118, 214, 0.08)",
      textHighlight: "#FFF3B0",
    },
    darkMode: {
      // One Dark 配色 ...
    },
  },
},

代码高亮主题

Plugin.SyntaxHighlighting({
  theme: {
    light: "one-light",
    dark: "one-dark-pro",
  },
})

字体

使用 LXGW WenKai(霞鹜文楷)作为中文字体,通过 CDN 加载:

theme: {
  fontOrigin: "custom",
  cdnCaching: false,
  typography: {
    header: "LXGW WenKai",
    body: "LXGW WenKai",
    code: "JetBrains Mono",
  },
},

Head.tsx 中添加字体 CSS 链接,使用 media="print" onload="this.media='all'" 技巧实现非阻塞加载。


UI 功能定制

已实现的功能

功能实现方式文件
Giscus 评论内置支持,配置 repoId/categoryIdquartz.config.ts
顶部导航栏自定义 Navbar 组件自定义组件
Logo + 标题修改 PageTitle.tsx 添加图片quartz/components/PageTitle.tsx
个人标语添加 Tagline 组件自定义组件
时间线页面自定义 TimelineContent + timelinePage emitterquartz/components/pages/TimelineContent.tsx
Explorer 文件夹图标SVG 图标替换默认箭头quartz/components/Explorer.tsx
返回顶部按钮纯 CSS/JS 组件自定义组件
图片懒加载rehype 插件添加 loading="lazy"quartz/plugins/transformers/ofm.ts
Lightbox 图片放大社区插件 Clickable Images Zoomquartz/plugins/transformers/clickableImages.ts
阅读模式Quartz 内置 ReaderMode 组件布局配置
统一 Tab 标题固定为站点名称quartz/components/Head.tsx

布局配置

quartz.layout.ts 中配置三栏布局:

// 左侧:Logo、标语、Explorer、搜索
// 中间:面包屑 + 文章内容 + 评论
// 右侧:目录(TOC)、暗色模式、阅读模式

性能优化

PageSpeed 优化项

基于 Google PageSpeed Insights 的多轮优化:

优化项做法效果
字体非阻塞加载media="print"onload="this.media='all'"消除渲染阻塞
KaTeX CSS 异步<link> 改为 JS 动态插入消除渲染阻塞
图片压缩大图压缩到合理尺寸减少加载体积
GIF 缩小缩小尺寸减少体积
Giscus 懒加载IntersectionObserver 滚动到可见才加载减少首屏请求
TOC 性能缓存 DOM 查询结果减少重排
contentIndex 分片拆分为 48KB 元数据 + 3.7MB 搜索索引(按需加载)首屏减少 3.7MB
CDN 字体回退jsdelivr → zzko → elemecdn 三级回退防止 CDN 被墙
CSS 变量提取7 个常用值提取为变量维护性提升

移动端适配

  • overflow-x: hidden 仅限移动端(桌面会破坏 position: sticky
  • 移除双重 padding(#quartz-body.center 都有 padding 导致偏移)
  • 触摸目标 44×44px 最小尺寸
  • 响应式字体和间距

这是系列文章的第三篇: