From 89c7c067aa6958f6561e2f4f3da2edd713faeaca Mon Sep 17 00:00:00 2001 From: Atdunbg Date: Mon, 29 Jun 2026 12:33:00 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BF=AE=E5=A4=8D=E5=AE=BD=E5=B1=8F?= =?UTF-8?q?=E4=B8=8B=E6=AD=A3=E6=96=87+TOC=E6=95=B4=E4=BD=93=E5=81=8F?= =?UTF-8?q?=E5=8F=B3=E3=80=81=E9=A1=B6=E6=A0=8F=E4=B8=8ETOC=E9=94=99?= =?UTF-8?q?=E4=BD=8D=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 TOC_BREAKPOINT 常量替代硬编码 1536,通过 define:vars 注入客户端脚本 - MainGridLayout 平移正文/TOC 容器让整体视觉居中,并用 margin 计算修复 Navbar 与 TOC 右边缘的 1rem 错位 - data-has-toc 同时判断 siteConfig.toc.enable 与 headings.length,避免 toc 关闭时仍触发平移 - 新增 adaptive-width-for-fuwari.md 教程文档 --- src/config.ts | 2 +- src/constants/constants.ts | 4 + .../posts/adaptive-width-for-fuwari.md | 232 ++++++++++++++++++ src/layouts/Layout.astro | 5 +- src/layouts/MainGridLayout.astro | 12 +- 5 files changed, 248 insertions(+), 7 deletions(-) create mode 100644 src/content/posts/adaptive-width-for-fuwari.md diff --git a/src/config.ts b/src/config.ts index eb74436..7248d2b 100644 --- a/src/config.ts +++ b/src/config.ts @@ -29,7 +29,7 @@ export const siteConfig: SiteConfig = { }, }, toc: { - enable: true, // Display the table of contents on the right side of the post + enable: false, // Display the table of contents on the right side of the post depth: 3, // Maximum heading depth to show in the table, from 1 to 3 }, favicon: [ diff --git a/src/constants/constants.ts b/src/constants/constants.ts index 896150d..ebf278c 100644 --- a/src/constants/constants.ts +++ b/src/constants/constants.ts @@ -15,3 +15,7 @@ export const MAIN_PANEL_OVERLAPS_BANNER_HEIGHT = 3.5; // Page width: rem export const PAGE_WIDTH = 75; + +// TOC 显示的最低视口宽度(px),需与 Tailwind 的 2xl 断点保持一致 +// 同时 CSS 中 @media (min-width: 1536px) 也要同步修改 +export const TOC_BREAKPOINT = 1536; diff --git a/src/content/posts/adaptive-width-for-fuwari.md b/src/content/posts/adaptive-width-for-fuwari.md new file mode 100644 index 0000000..cd9dd90 --- /dev/null +++ b/src/content/posts/adaptive-width-for-fuwari.md @@ -0,0 +1,232 @@ +--- +title: Fuwari 宽屏下正文 自动连带TOC一块居中方案 +published: 2026-06-29 +description: '让正文与右侧 TOC 作为一个整体在视口中真正居中,并修复顶栏与 TOC 的对齐' +image: '' +tags: [fuwari, css, 布局] +category: '教程' +draft: false +lang: '' +--- + + +## 修复 Fuwari 宽屏下「正文 + TOC」整体偏右、视觉不居中的问题。 + +## 问题原因 + +原版 Fuwari 在宽屏(≥1536px,即 Tailwind 的 `2xl` 断点)下的布局结构是: + +- 正文容器 `
` 通过 `mx-auto` 在视口中**居中**(占 75rem) +- TOC 容器同样 `mx-auto` 居中,TOC 本体通过 `absolute -right-[var(--toc-width)]` 悬浮在**容器右边缘再向右 `toc-width`** 的位置,也就是落在视口右侧的空白区域 + +结果是:**正文一直钉在视口正中央不动,TOC 额外塞在右边**,两者作为一个整体重心**偏右**,并不是真正的视觉居中。 + +本方案的做法是:当页面有 TOC 且视口足够宽时,把正文容器和 TOC 容器**同时向左平移 `toc-width / 2`**,让「正文 + TOC」作为一个整体在视口中真正居中;没有 TOC 的页面保持原样,并在切换页面 / 窗口尺寸变化时带 500ms 缓动过渡。同时修复顶栏(Navbar)与 TOC 右边缘的 1rem 错位。 + +## 涉及的核心变量 + +`--page-width` 定义在 `src/constants/constants.ts` +```ts title="src/constants/constants.ts" +// Page width: rem +export const PAGE_WIDTH = 75; +``` + +`--toc-width` 定义在 `src/styles/variables.styl`,会根据 `--page-width` 自动计算 +```styl title="src/styles/variables.styl" +--toc-width: calc((100vw - var(--page-width)) / 2 - 1rem) +``` + +调整 `PAGE_WIDTH` 即可改变正文宽度,`--toc-width` 会自动跟随,无需手动维护。 + +## 修改步骤 + +整个方案由「定义断点常量 + 服务端标记 + 客户端切换 class + CSS 媒体查询」四部分协作完成,对应四处文件改动。 + +### 1. 定义 TOC 显示断点常量 + +原版代码里 `1536` 这个数字在 JS 和 CSS 中各写死一次,不便维护。先在 `src/constants/constants.ts` 末尾新增一个常量,让 JS 部分可配置。 + +```diff title="src/constants/constants.ts" lang="ts" + // Page width: rem + export const PAGE_WIDTH = 75; ++ ++// TOC 显示的最低视口宽度(px),需与 Tailwind 的 2xl 断点保持一致 ++// 同时 CSS 中 @media (min-width: 1536px) 也要同步修改 ++export const TOC_BREAKPOINT = 1536; +``` + +> 注意:CSS 的 `@media (min-width: ...)` 不支持 `var()`,所以 `@media` 里的 `1536px` 仍然是字面量,改这个常量时需要同步改下面第 4 步里的 `@media`。注释里已写明。 + +### 2. 给正文 / TOC 容器加 ID,并标记是否有 TOC + +打开 `src/layouts/MainGridLayout.astro`,做三处改动: + +- 给正文外层容器加 `id="content-center-wrap"` +- 给 `
` 加 `data-has-toc` 属性(有标题树时输出空字符串,否则不输出) +- 给 TOC 外层容器加 `id="toc-center-wrap"` + +```diff title="src/layouts/MainGridLayout.astro" lang="astro" + +
+ +-
++
+
+@@ + + +-
++
0 ? "" : undefined}> +@@ + + +