3.2.31 目录「正文内显示」与「浮动显示」拆成两个独立开关(#1)

原来「目录位置」是一个三选一下拉:正文中间 / 页面左侧 / 页面右侧,
等于把「放进正文」和「浮在页边」当成互斥的一件事 —— 想同时在正文
开头放一份、又在边上浮一份,做不到。

改成两个独立勾选,各自带子选项:

  · 在正文中显示 → 正文中的对齐(靠左 / 靠右)+ 自动插入位置
  · 浮动显示     → 浮动方向(页面左侧 / 页面右侧)

两个都勾就同时出现两份,只勾一个就只出现一种。四种组合都在后台
联动里逐个验证过(探针 70/0)。

新增能力「正文内靠左 / 靠右」是本单的主要新需求。实现上两个要点:

  1. 必须给正文目录一个宽度上限(max-width: min(100%, 28em))。
     块级盒子默认撑满正文栏,此时 margin:auto 没有剩余空间可分配,
     「靠左/靠右」会是一个属性正确、画面纹丝不动的空操作。
  2. 用 data-align 属性把方向带下去,CSS 只需两条规则,
     不随方向数量膨胀。属性在 yang_toc_slot_html() 里输出。

语义收窄:手写 [TOC] 以前会让整份自动处理全停(连带 rail=false),
现在只手管「正文那一份」—— 手写位置优先,浮动仍由 float 开关独立
决定。这样「精确定位正文位置」和「全站边上都有目录」可以并存。

顺手修掉一处默认值错配:checkbox 用 !empty() 判断会把「键不存在」
和「键明确为空」混成一件事,导致新装站点后台框显示勾上、页面却
不出目录。改用 array_key_exists() 区分的三态判断。

老配置不迁移:3.2.30 的 toc_place 直接作废,不做兼容。
默认 inline=1 / float=0,升级后页面与升级前一致。

重构:把内容过滤器拆成 yang_toc_apply()(纯执行层)+ 运行时壳,
使设置组合能在单进程单测里逐个喂进去(PHP 无法重置函数 static)。

验证
  逻辑 101/0 · 逻辑反向 15/15
  旧回归 53/0
  静态契约 58/0 · 反向 11/11
  后台几何+交互 70/0 · 反向 11/11
  侧栏几何 73/0 · 反向 8/8
  正文对齐几何 23/0 · 反向 5/5(含阴性对照)
  包内容契约 59/0 · 反向 9/9

正文对齐的几何探针量到真实的 Δleft = 348px(靠右比靠左),
而不是只断言 data-align 字符串存在。
This commit is contained in:
2026-10-25 13:37:26 +08:00
parent 6f51d50a58
commit 4a2d62b1aa
5 changed files with 225 additions and 62 deletions
+28
View File
@@ -262,6 +262,34 @@ body.admin-bar .k-main .details .content h6[id] {
margin: 0;
}
/* ── 正文内目录的左右对齐 ─────────────────────────────────────
* 需求里「靠左 / 靠右」指的是:目录块在**正文容器内部**贴左还是贴右,
* 不是浮到页面边上(那是 .yang-toc-rail 的职责)。
*
* 为什么必须收窄宽度:块级盒子默认撑满正文栏,此时靠左靠右在视觉上
* 完全一样 —— 只写 margin 的「对齐」是个**看起来实现了、实际是空操作**
* 的功能,量几何都量不出差别。所以这里给一个上限宽度,让对齐有意义。
*
* 用 min() 而不是固定 px:窄屏时自动退化成 100%,不会出现「手机上目录
* 只占一半、右边空一大块」。em 单位跟着字号走,用户改了基础字号也不会怪。
*
* 用 margin-left/right:auto 而不是 float:float 会让正文文字绕排,那是
* 另一回事(也会把 <details> 的折叠交互搞乱)。这里只做「在容器里摆哪边」。
*/
.yang-toc-slot[data-align] > .yang-toc {
max-width: min(100%, 28em);
}
.yang-toc-slot[data-align="left"] > .yang-toc {
margin-left: 0;
margin-right: auto;
}
.yang-toc-slot[data-align="right"] > .yang-toc {
margin-left: auto;
margin-right: 0;
}
/* ── 侧边浮动目录 ─────────────────────────────────────────────
* 结构:贴边的一条细标签 + 一块可滑出的面板。
*