# 标题栏磨砂(header frost)—— 注入链、开关、诊断字段 > 适用版本:`dsh-mpkg-wallpaper` 当前工作区(2026-09-16 第三轮定案:**层叠 + 描边**)。 > 相关代码:`lib/client.js` → `ensureHeaderFrost()` / `syncHeaderFrost()` / `buildCss()` 的 headerFrosted 块 / > `buildUiCss()` 的 `[data-mpw-hdr-translucent]` 与 `.mpw-hdrFrost` 规则; > 回归:`node tools/frost-rail-test.mjs`(假 DOM 断言)+ `node tools/header-rail-replica.mjs --both`(真机复刻 A/B)。 ## 0. 第三轮定案:磨砂"层存在但看不见"的真根因(2026-09-16) 上一轮修掉了 `normalizeSection` 的 `ReferenceError`(见 §1),真机 diag 随即显示 `headerFrost.injected=true / px=30 / bdf=blur(30px) saturate(1.4) / translucent=true`, **但用户仍然看不到磨砂**。本轮把链路推到"层在层叠中的位置",定案如下: **真根因:注入层用了 `z-index:-1`,而宿主顶栏不是层叠上下文 ⇒ 负层画在顶栏 `background-color` 之下,被那层半透明底色(`rgba(255,255,255,.38)` / 暗色 `rgba(18,22,30,.45)`, 以及主题色 wash)整片盖住,`backdrop-filter` 一点都透不出来。** 证据(全部可复算,非推断): | 手段 | 事实 | | --- | --- | | 合成实验 `tools/probe-out`(父底 `#1122ff` 不透明 + 子层 `#ff0000`) | `z-index:-1` 采到**父底蓝**(子层被完全盖住);`z-index:0` / `auto` 采到**子层红** | | 真机复刻 A/B `tools/header-rail-replica.mjs --both` | 改前 `frostEl.zIndex=-1` 且顶栏底 alpha=0.38;改后 `z-index=0`、`coversHeader=true`、宿主内容层 `z-index=1` | | 真机 headless 采集 `tools/header-rail-collect.mjs` | 顶栏 `position:relative`、`z-index:auto`、`isolation:auto`、`transform:none` ⇒ **确实不是层叠上下文** | 修法(三件,缺一不可): 1. `ensureHeaderFrost()` 的内联样式由 `z-index:-1` 改为 **`z-index:0`** ⇒ 层画在顶栏背景**之上**、内容**之下**(经典磨砂位置)。 2. `buildUiCss()` **无条件**输出三条层叠规则(不放在任何 `if (headerBg)` 分支里, 否则"另一档配置下规则消失"会让修复静默失效): ```css .mpw-hdrFrost { z-index: 0 !important; background: transparent !important; } .wSkVaW_header:has(> .mpw-hdrFrost) > :not(.mpw-hdrFrost) { position: relative; z-index: 1; } .mpw-hdrFrost:first-child ~ * { position: relative; z-index: 1; } ``` 第二条把宿主顶栏的**直接子节点**抬到 `z-index:1`:它们原本都是 `static/auto`, 抬升**只改绘制序、不改布局**,保证 `z-index:0` 的磨砂层永远不盖住标题/logo/按钮 (`?hdrblur=pseudo|element` 等对照路径也照样安全)。 3. 层的背景恒为 `transparent`:半透明底色仍由顶栏承担(`--mpw-hdr-frost-bg` 那条规则), 避免"底色叠两次"变成两层白纱。 **代价(已知且可接受)**:给注入层 `z-index:0` 会让顶栏成为**层叠上下文** (`position:relative` + 非 auto 的 z-index 子节点已经足够;`isolation`/`backdrop-filter` 才是 **backdrop root / containing block** 那种有害情形)。层叠上下文只影响"内部谁盖谁", **不产生 fixed 后代的 containing block**,所以"设置弹窗被困/浮层模糊失效"那两个历史 bug 不受影响 (`tools/css-matrix.mjs` 的断言仍然全绿)。 ## 0b. 回归:顶栏下描边被我们抹掉(同一轮用户实测) 用户原话:「你现在给顶部标题栏,它下面一部分,它的描边你给它去掉了」。归因(**两条规则**): | 位置(修复后行号会漂) | 规则 | 后果 | | --- | --- | --- | | `buildCss()` headerFrosted 块的 `.wSkVaW_header { background-color: …; }` | 原本带 `border-bottom: 1px solid transparent !important;` | 基础档(任何配置)都把宿主下描边抹成透明 | | 同函数 `if (headerBg && !headerBlur)` 分支("透出壁纸且不磨砂",**用户真机命中的就是这条**) | 原本也带同一条 | 同上,且优先级更高 | 两条**已全部删除**:本插件只改 `background-color`,描边一律交还宿主 (亮色 `1px solid rgba(19,45,83,.26)` / 暗色 `rgba(148,180,220,.32)`;悬浮态圆角外框的下边也随之恢复)。 防复发断言(`tools/frost-rail-test.mjs` PART 1b + PART 3): 扫**全部设置组合**的产物,禁止出现"选择器命中 `wSkVaW_header/_header_` + `!important` + `transparent`/alpha=0"的 border 声明;源码级再断言一次。 复刻实测(`tools/header-rail-replica.mjs --both`): ``` 顶栏 border-bottom 改前 1px solid rgba(0, 0, 0, 0) → 改后 1px solid rgba(19, 45, 83, 0.26) 顶栏 border-bottom alpha 改前 0 → 改后 0.26 ``` ## 1. 为什么以前"一直没有效果"(上一轮的真根因,保留记录) 真根因:**`syncHeaderFrost()` 每次调用都在第一行抛 `ReferenceError`,而异常被函数自己的 `catch {}` 吞掉。** - `syncHeaderFrost()` 是**模块作用域**函数(`lib/client.js:2658` 附近)。 - 它第一行调用 `normalizeSection(readSection())`,而 `normalizeSection` / `__asStr` 当时定义在 **`applyFromStorageInner()` 的函数体内**(旧行号 ~2696)⇒ 模块作用域里不存在该标识符。 - 该函数整体包在 `try { … } catch {}` 里(刻意吞异常以免影响样式),所以: - 磨砂层**从未注入**(真机 diag:`headerFrost.injected = false`); - `lastFrostReason` **从未写入**(真机 diag:`headerFrost.reason = ""`,因为赋值语句在抛错点之后); - `?hdrfrost=off` / `?hdrblur=pseudo|element` 等分支**永不执行** ⇒ 用户"参数没效果"。 复现(对照实验,已固化进回归测试的 `broken-scope` 场景): ``` # 修复前(HEAD 版本 + 打开 syncHeaderFrost 自身的 catch) syncHeaderFrost 进入次数 = 1 | 被函数自身 catch 吞掉的异常 = "normalizeSection is not defined" # 修复后(当前工作区,假 DOM) 【修复后】state = {"injected":true,"px":30,"reason":"…|半透明底已设|跟随整屏虚化 30px","translucent":true,…} ``` 修法:把 `__asStr` / `normalizeSection` **提升到模块作用域**(`lib/client.js` 中 `applyFromStorage` 之前), 并让 `syncHeaderFrost` 的 catch **把异常写进 `hdrFrostState.reason`**(不再静默)。 ## 2. 注入链("必然可见"方案) | 环节 | 做法 | 为什么 | | --- | --- | --- | | 磨砂层 | header 的第一个子节点 `