From 9d9f87a013c7567123e519e5938bb1ffd69a9543 Mon Sep 17 00:00:00 2001 From: dsh Date: Tue, 15 Sep 2026 09:03:24 +0800 Subject: [PATCH] =?UTF-8?q?=E7=A7=BB=E5=8A=A8=E7=AB=AF=E7=BE=8E=E5=8C=96?= =?UTF-8?q?=EF=BC=9A=E6=82=AC=E6=B5=AE=E7=A3=A8=E7=A0=82=E5=AF=BC=E8=88=AA?= =?UTF-8?q?=E8=8F=9C=E5=8D=95=20+=20=E4=BF=9D=E5=AE=88=E6=A1=A3=E5=AD=97?= =?UTF-8?q?=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 菜单(site-header.astro) - 全屏遮罩居中大链接 -> 仿 Firefly float-panel 的悬浮磨砂卡片: fixed top-[76px] 左右各留 12px,rounded-2xl,浅阴影,max-h 兜底防横屏溢出 - 菜单项 30px -> 18px,行高 44px,圆角 hover 底色;外链右侧加 ↗ - 当前页在构建期用 Astro.url.pathname 判定,高亮为主色文字 + 淡主色底 + 正文标题那道红色短竖线(滑入/当前项显示) - 入场动画改为「面板落下 + 逐项上浮」,节奏从 420ms 收到 300ms - 遮罩从纯色全屏改为 background/45% + 极轻模糊,点它关闭 - JS 未改:data-open / ESC / body 滚动锁 / astro:before-swap 复位 / aria 全部沿用 - 补 :focus-visible 自定义焦点环(替掉浏览器默认那圈)、prefers-reduced-motion、 prefers-reduced-transparency、@supports 回退 磨砂 - global.css 新增 --glass-bg / --glass-border / --glass-blur / --glass-saturate, 由 --card 派生所以亮暗自动跟随 - 移动端页眉仍保持关闭常驻磨砂(原来就是有意为之),只有点开的菜单面板用 字号(只动 <768px,保守档) - 正文/引用/列表 16.5px/1.85 -> 15.5px/1.78,行高密度约省 10% - 文章 h1 30 -> 27px;正文 h2 30 -> 25;h3 24 -> 21;h4 20 -> 18 - 列表区标题 24 -> 21px - 桌面端用 md: 前缀原样恢复 验证(headless Chrome 131,390x844 + 1280/800/700) - 390px:正文 15.5/27.59、h1 27、菜单项 18;面板 445px 高、底边 511 < 844 - 1280/800px:正文 16.5/30.525、h1 48px,与改动前一致 - 亮/暗两套截图正常,无横向溢出 --- README.md | 30 +++++ src/components/ArticleContent.astro | 16 +-- src/components/article-list.tsx | 4 +- src/components/site-header.astro | 193 ++++++++++++++++++++++------ src/styles/global.css | 10 ++ 5 files changed, 205 insertions(+), 48 deletions(-) diff --git a/README.md b/README.md index 169056e..12899a2 100644 --- a/README.md +++ b/README.md @@ -176,6 +176,36 @@ epigraph: 题记 # 可选 代码风格:Astro/TS/TSX 一律 2 空格缩进。组件命名 `PascalCase` 与 `kebab-case` 混用,跟着所在目录的既有风格走即可。项目没有配 formatter,改动尽量贴合周围代码。 +### 移动端字号 + +移动端(<768px)的字号比桌面端小一档,用 Tailwind 的移动优先写法表达 —— 基础值是手机用的,`md:` 前缀是桌面恢复值: + +```html + +prose-p:text-[15.5px] md:prose-p:text-[16.5px] +prose-p:leading-[1.78] md:prose-p:leading-[1.85] +``` + +改动集中在 `ArticleContent.astro`(正文、标题、引用、列表)和 `article-list.tsx`(列表区标题)。**不要动 `html` 的根字号**,那会连带缩放所有 rem 间距,容易连锁出问题。 + +### 磨砂玻璃 + +`global.css` 里有四个 token: + +| token | 默认 | 用途 | +|---|---|---| +| `--glass-bg` | `color-mix(in oklch, var(--card) 72%, transparent)` | 面板底色,由 `--card` 派生,亮/暗自动跟随 | +| `--glass-border` | `color-mix(in oklch, var(--border) 75%, transparent)` | 面板描边 | +| `--glass-blur` | `14px` | 模糊半径 | +| `--glass-saturate` | `1.5` | 饱和度补偿,纯模糊会发灰 | + +用法:`background-color: var(--glass-bg); backdrop-filter: blur(var(--glass-blur)) saturate(var(--glass-saturate));` + +**只给「浮在内容上方、面积不大」的元素用**(移动端菜单面板、页眉、搜索面板)。不要给文章卡片大面积用,一屏十几个元素同时 `backdrop-filter` 会明显掉帧。另外记得带上 `-webkit-` 前缀,并在 `@supports not (backdrop-filter: blur(1px))` 里回退成不透明的 `var(--card)`。 + +> 移动端页眉目前**故意关掉**了常驻磨砂(`site-header.astro` 的 `@media (max-width: 767px)` 那段):固定元素持续模糊会让移动端合成开销变大。要开的话建议用「滚动后才开」的方式,别让它一直生效。 + + ## 书架数据 书架页的数据来自这三个文件,由 `src/components/bookshelf-content.astro` 在**构建时 import**(所以文件必须存在,删掉会导致构建失败): diff --git a/src/components/ArticleContent.astro b/src/components/ArticleContent.astro index df24da7..f227508 100644 --- a/src/components/ArticleContent.astro +++ b/src/components/ArticleContent.astro @@ -35,7 +35,7 @@ const primaryTagHref = primaryTag ? `/?tag=${encodeURIComponent(primaryTag)}#hom

@@ -119,17 +119,17 @@ const primaryTagHref = primaryTag ? `/?tag=${encodeURIComponent(primaryTag)}#hom
{activeCategory === "all" && !activeTag ? ( -

+

{headerMeta.heading}

) : ( -

+

{headerMeta.eyebrow} / {headerMeta.heading} diff --git a/src/components/site-header.astro b/src/components/site-header.astro index 39be483..d9342e5 100644 --- a/src/components/site-header.astro +++ b/src/components/site-header.astro @@ -15,6 +15,12 @@ const navItems: { name: string; href: string; external?: boolean }[] = [ { name: "关于", href: "/about/" }, { name: "开往", href: "https://www.travellings.cn/go.html", external: true }, ] + +// 静态站:当前页在构建时就知道,直接拿来高亮菜单项。 +// 切页后页眉会随新页面一起被换掉,所以这个标记始终对应当前页。 +const currentPath = Astro.url.pathname +const isCurrent = (href: string) => + href === "/#home-main" ? currentPath === "/" : currentPath.startsWith(href) ---