laoyang
|
05b4b56bf6
|
4.0.0 引用块首尾加引号,让引用文字与正文段落对齐 #32
用户诉求(原话):引用块有色块和左侧宽度,导致块内文字比正文段落更靠右,
缩进不一致。方案:色块保留,在引用首尾各加一个引号,用引号占住那段缩进。
改前实测(1440 视口,线上真实文章):
正文段落 p 文字起点 99
blockquote 框内沿 89,块内 p 文字起点 121
⇒ 引用文字比正文靠右 22px,且块内段落还叠了一层 32px 首行缩进
修法:
· border-left 6 + padding-left 26 = 32 = 正文 text-indent:2em(16px×2)
· 块内 > p 的 text-indent 归零,消除「块内缩 + 段首缩进」双层叠加
· 左引号 position:absolute 悬浮在 padding 区(inline 会被 block 级 p
挤成匿名块行,跑到段落上方)
· 右引号挂 > p:last-of-type,display:inline-block + line-height:0
+ height:0 + overflow:visible —— 行盒贡献 0,不撑高(否则块高 89→121)
· 引号放大到 60/56px,淡色 #c6d2dd 做装饰;暗色降到 #3d4b58
两个踩到的坑(都只有像素级测量能发现):
① CJK 全角字形左侧 side bearing ≈ 0.62em。30px 字号下伪元素盒在
x=12(完全正确),但引号墨迹在 30.5~40,正压在首字 32.5 上 ——
「盒对了」≠「字形画在那儿」。指定 Georgia 等拉丁衬线字体后
side bearing 降到 ≈0.03em,再用 left:2px/top:15px/font-size:60px。
② 窄屏(≤768px)kratos.css 把 .content p 降到 15px ⇒ 2em=30,
硬编码的 32 就多 2px。不能写 calc(2em - 6px)(em 基数是 blockquote
自己的 15px,不随视口变),只能在同一个断点覆盖;且这个 @media
必须放在 ::before 基础规则之后,否则同特异性被后出现的 left:2px 压掉。
版本号 3.2.64 → 4.0.0(用户要求跳大版本:引用块渲染方式变了,
第三方 CSS 若针对 blockquote 内部做微调会受影响)。
验证:
_geom32.js 48/0(3 篇 × 5 视口,对齐差全部 0.00px)
_pix400.py 76/0(像素差分:墨迹落在缩进空白内、不压字、不撑高)
_mkzip400.py 61/0
_mkzip400_falsify 20/0(18 组注入全部报红在预期判据)
_pix400_falsify 8/0
_readme400.py 36/0(readme 15 节,181195 字节)
php -l 97 文件 / 0 失败
包 kratos_yang-4.0.0.zip md5 bc23f478d5f5170524aec3921b10e6ff
已发 /theme-update/,update.json 指向 4.0.0,PUC 实测 getUpdate=4.0.0。
主题目录未覆盖(仍是 3.2.64),等用户在后台点升级。
|
2026-10-28 12:15:38 +08:00 |
|
laoyang
|
ac1575fbbb
|
fix(theme): 内容块宽度改为流式取值 + 1440px 封顶,消除档位跳变(#31)
现象:窗口从宽拖窄时,中间内容块宽度离散跳档(540/720/960/1280 四档),
档内两侧留白极宽 —— 1920 视口每边白 320px,占整个窗口约 1/3。
根因:bootstrap.min.css 的 .container 只有 4 个固定 max-width 档位,
档内宽度恒定不变,跨断点瞬间跳一格。不是"断点太少",而是宽度只有 4 个取值。
改法(assets/css/site.css +134 行):
1) .container 宽度改成连续函数
width: min(1440px, 100% - 2 * max(16px, 2.5vw))
min() 是连续取值,@media 是离散判断 —— 这是两者的本质区别。
上限 1440 由用户选定;边距 max(16px, 2.5vw) 做窄屏保底 + 宽屏按比例。
同时 max-width: none 显式压掉 Bootstrap 的 4 个档位(缺它宽屏仍被
1280 卡住,等于没改)。
2) padding 归零 + .row 负 margin 同步归零
Bootstrap 原本靠 container 的 15px padding 与 .row 的 -15px margin 相互
抵消。现在边距由 width 公式承担,padding 必须归零(否则双重扣减,
窄屏吃 30px);.row 的 -15px 也必须归零(否则内容外顶 15px、贴到容器边)。
列自身的 15px padding 保留,它是两列间隙的来源。
3) 导航容器单独对齐(三版才修对)
.k-nav 同时带 Bootstrap 的 .navbar,左右各有 16px padding,容器嵌在
已内缩的盒子里。直接用正文公式会得到正确宽度但差 16px 位置。
正确解是同公式 + margin:auto 在已内缩的盒子里居中。
两个失败版本记在注释里:① calc(100% + 32px) 因 100% 在绝对定位盒里
解析成视口宽 ⇒ 满宽 320@0;② 负 margin 把容器顶到父级 padding 之外
⇒ 左边缘变 0 而非 36。
验证(_tooling/yang_theme_test/,均为线上真实页面 + 拦截替换待发布 CSS):
- _diag_width3.js 改前定量:4 档平台 540×192 / 720×224 / 960×318 / 1280×609,
跳变 89.5/119.5/158.5px,1920 视口 521 个宽度留白 ≥60px
- _geom31.js 16/0:逐 1px 扫 320~1920 共 1601 档,W1 无固定档位(唯一平台
1440 封顶段)、W2 单步 ≤2px(实测 1px)、W3 单调、W4 封顶 1440 且对称、
W5 留白 ≤40px、W6 无横向溢出、W7 三容器一致、W8 正文占比 66.7%、
W9 正文缩进 15px;四条反证全部红在预期条目
- _shot31.js 33/0:7 档截图 + 表格/代码/图片不溢出、页脚同宽、目录块不越界、
暗色模式,另含 V4b 防空靶子守卫
- _align31.js 5/0:导航/正文/页脚容器左边缘逐像素一致,logo 与首段偏移
-31px 跨 7 档零漂移
- _mkzip364.py 43/0 + _mkzip364_falsify.py 11/0(10 条注入全部命中)
侧栏行为按用户要求保持现状(992px 以下隐藏、正文整行),该处宽度变化
是侧栏出现/消失导致,非台阶,不在本版范围。
Refs #31
|
2026-10-28 09:28:06 +08:00 |
|
laoyang
|
0c8cee9094
|
style: 标题编号字号改成与各级标题一致(3.2.63)#30
用户反馈 0.62em 那版太小、"很不协调,看着难受",要求字号和每一级标题一样。
改动:
- .yang-h-num 的 font-size 从 0.62em 改成 1em:
h2 编号 24px、h3 20px、h4 17px,逐级与标题同大。
弱化只靠颜色(#a8abb2)和字重(400),不再靠缩字号。
- margin-right 从 0.35em 收到 0.25em:em 是相对编号自身字号的,
字号从 14.88 变 24 后同一个 0.35em 会从 5.2px 涨到 8.4px,间距偏宽。
- display:inline-block + line-height:1 保留:实测同字号后已不撑高,
但留着防回归(以后改回小号不会复发 3px),且编号成原子盒不跨行断开。
- site.css 与 readme 的相关注释同步重写,删掉过期的「落在 12~15px 区间」。
验证(全部在线上真实文章页上量实际渲染值):
- 几何 71/0:h2 24/24、h3 20/20、h4 17/17,逐级与标题相等;
标题高度加/不加编号差 0.00px;编号与文字不重叠、不跨行。
- 三条反证全部红在预期条目:小字号+inline+inherit(3.00px)、
display:block(24.00px)、字号回 0.62em(G8)。
- 编号判据 44/0、真实数据 20/0、目录等价 7/0、反证 22/0。
- 打包自检 61/0,注入反证 8/0(含新增的字号/margin 两组)。
- PHP 语法 97 个文件 0 错。
包:kratos_yang-3.2.63.zip md5 ce757f325c0928f44d0e053d834c7da7
已发到 /theme-update/,update.json 已切 3.2.63,后台可见更新。
|
2026-10-28 08:59:31 +08:00 |
|
laoyang
|
76c69b31e8
|
正文标题自动编号,与目录编号共用同一份计算 #30
需求:目录里有编号、正文标题没有,读长文时要回头去目录找对应关系。
本版给 h1/h2/h3 加编号,样式为灰色小号(标题字号的 0.62 倍),
不抢标题视觉重心,与目录 .yang-toc-num 同风格。
编号规则(编号范围跟着后台 toc_levels 设置走,默认 1/2/3):
- 按「实际出现的最外层」归一,没有 h1 时 h2 直接是一级(1/2/3),
不会编成 2/2.1。天然满足用户"h1 没有就是 h2 一级"的要求。
- 作者已手写编号的标题跳过并占位(1./1、/1)/1.2/一、/(一)/第一章
等写法),不叠加成"3.1 1. xxx",但编号序列不错位。
实现要点:
- 抽出 yang_toc_pick / yang_toc_depths / yang_toc_number_map 三个纯函数,
目录与正文共用同一份编号计算,杜绝两边漂移(用户痛点正是"两边不一致")。
- 插入按 id 回填:条目清单只来自 scan() 那一份,id 是唯一键。
- 用 preg_match_all + PREG_OFFSET_CAPTURE 拿字节偏移、从后往前拼接插入。
早期写成 preg_replace_callback('#<h([1-6])([^>]*)>(.{0,120})#is'),
那个 .{0,120} 贪婪跨过块边界,导致 5 个标题只有第 1 个拿到编号且不报错。
- 幂等用 strncmp(substr($html,$end), $needle, strlen($needle)),不手数字节
(写成固定 26 而实际 25 会让幂等静默失效、编号插两层)。
CSS 修一个自己造的问题:编号把标题撑高 3px。
line-height:inherit 无效——同行高下小字号半行距更大,盒底反而更往下探
(h2 46→49)。改为 display:inline-block + line-height:1 成为原子行内盒,
实测 46→46、37→37。八组隔离试验数据见 _tooling/_diag362b.js。
验证(全部本地/线上实跑,非推断):
- 正向判据 43/0;反证 22/0(10 组注入均红在预期条目)
- 线上 4 篇真实文章 20/0(含"只有 h3"、"h1+h2"、"h2+h3"三种形态)
- 新旧两版目录 HTML 逐字节比对 7/0(4/4 篇相同,证明重构没改坏老行为)
- 几何判据 68/0,含两条反证:回到 inline+inherit ⇒ 高度差 3.00px;
编号 display:block 掉行 ⇒ G3 差 14.88px
- 打包自检 59/0 + 4 组注入反证全红
|
2026-10-28 08:27:53 +08:00 |
|
laoyang
|
264a6ec06a
|
3.2.61 修 h2/h3 层级倒挂:h2 提到 24/700,h4 降到 500 参与分层 #29
3.2.60 我自己造出的问题:只把 h3 提到 20px/600,h2 一直是 20px/500
⇒ 两级同字号、h3 还粗 100,三级标题比二级更抢眼,层级是倒的。
根因不是实现难,是判据漏了:3.2.60 写了 52 条断言全绿,但**没有任何
一条断言 h2 > h3**(只查了 h3 > 正文),倒挂在全绿里完全隐形。
改法(用户选 D 方案,并要求 h4 一起调)
h2 24px / 700 / 左 5px 蓝条 + 浅灰底(行高 41→46)
h3 20px / 600 / 左 3px 蓝条 + 底 1px 细线,无底色
h4 17px / 500 / 纯文字
p 16px / 350
两处细节的理由
· h4 600→500:600 与 h3 同重,只剩 3px 字号差,看着像"同一级被缩小"。
降到 500 让字重也参与分层;仍明显重于正文 350(差 150),不会糊回正文。
· h2 行高 41→46:24px 字配 41px 行高,灰底上下各只剩 8.5px、看着发扁。
写进注释的两条铁律
① 字号与字重必须同时严格递减:24>20>17>16、700>600>500>350
② 装饰强度也递减:蓝条+灰底 > 蓝条+细线 > 无 > 无
任一级调了要回头核对相邻两级,不能只盯自己那一级。
验证
· _geom361_route.js 56 / 0(双端面,新增 G1~G8 层级递减 + H 装饰 + I 行高)
G7/G8 是「严格」递减,不允许相等 —— 只写 >= 的话 h2=h3=20px 照样能过
· _falsify361.js 10 / 10
R1 = 把整份 CSS 退回 3.2.60 的倒挂状态 ⇒ 56→40,红 16 条,G1/G2 命中
(这一项通过才证明上一轮的盲区真的堵住了)
· _css360_selfcheck.js 28 / 0(改动后它主动报红提示 h4 期望过期,更新后全绿)
|
2026-10-28 07:38:09 +08:00 |
|
laoyang
|
cca7497553
|
3.2.60 正文插图不吃段落缩进 + h3/h4 提升层级区分度 #28 #29
#28 图片左缩进导致右侧溢出正文块
根因是 text-indent 可继承:段落写了 2em(32px),图片若在段落内
就被一起推走;而 max-width:100% 的 100% 是容器内容宽度、不是
缩进后剩余宽度,所以左缩进多少右边就溢出多少,两者永远相等。
🔴 只给 img 清零不够:灯箱把它包进 <a class="yang-lb-item">,
那个盒子是 inline-block,本身就是参与父级行内排版的主体,
起点照样被推。链接和图片两处都要清。
修法:图片自成一行、左右都不缩进、水平居中;灯箱链接一起块级化。
#29 h3 与正文区分度太低
改前 h3 只有 18px/500,正文 16px/350,只差 2px 字号 + 150 字重,
且无任何装饰。改后:
h2 20px/500/左5px蓝条+浅灰底
h3 20px/600/左3px蓝条+底1px细线
h4 17px/600/纯加粗
p 16px/350
两处让路:h3.ar-year(归档页年份,本身在 .content 里,会多出
竖线和第二条底线)、评论区的 h3(不在 .content 内,未受影响,已验)。
验证
· 判据 52/0(真实页面 + 拦截替换新 CSS,桌面 1440 / 手机 390 双端面)
· 反证 10/10 注入全被抓到,阴性对照未误报
· CSS 自检 25/0(含浏览器 replaceSync 逐块重插无丢弃)
|
2026-10-27 23:11:05 +08:00 |
|
laoyang
|
677de0f24e
|
3.2.29: 把「自定义 CSS」里的站点样式并入主题公共样式 assets/css/site.css(段落缩进/h2 蓝条/列表缩进与行距),配置项默认置空并一次性清库迁移;自定义 CSS 内联输出改挂 kratos-site 以保持在最末
|
2026-10-25 10:36:29 +08:00 |
|