Files
wordpress-kratos-yang/assets/css/archives.css
T
laoyang 492d8e11a6 3.2.48: 归档倒序/字号/底边对齐/共N篇 + 评论标题线等长 + 工具条分隔线统一 #18
工单 #18 八条诉求逐条落地:

1. 月份、日期、年份全部倒序(最近的在最上面)
   - PHP 侧 `krsort($years[$y]['months'])`(原来是 ksort)
   - JS 侧 `Object.keys(...).sort((a,b)=>b-a)` —— 对象键序对纯数字整数键
     会强制升序,服务端顺序传不过来,必须前端自己再排一次
   - 年份本来就是 krsort,日期本来就是倒序,本次只补月份

2. 年份字体再大一点
   - 原来 CSS 写的 22px **从来没有生效过**:`.yang-archives .ar-year` 是
     (0,2,0),被 `.k-main .details .article .content h3` 的 (0,4,1) 压死,
     线上实际是 18px
   - 改为带 `.k-main` 前缀(提到 (0,5,0))+ 26px + 700
   - `.ar-month-title` 同一个坑,一并修(写 14px/600,线上实际 16px/500)

3. 「共 N 篇」太高、比年份还高 → 下移与年份底边对齐
   - `.ar-head` 的 `align-items: center` → `flex-end`
   - `.ar-year` 的 margin 显式清零(kratos 的 `h1..h6 { margin: 0 0 30px 0 }`)
   - 窄屏媒体查询同步改,否则手机上又回到居中
   - 注意 `flex-end` 对的是 margin box,所以 margin 不清零等于没改

4. 每月后面的裸数字 → 「共 N 篇」
   - PHP:`sprintf(esc_html__('共 %s 篇'), number_format_i18n(...))`
   - JS:同一个文案键 `i18n.monthCount`,服务端输出到 `yangArchivesData`
   - 新增 `monthCount` 键,**没有复用** `totalFmt`(两处语义不同,
     以后要分别改文案时不至于互相牵连)

5. 上一年/下一年按钮看不清 → 与「写下你的评论」同款观感
   - 平时:`1px solid #cfe6fb` 浅蓝框 + 透明底 + `--yq-primary-dark` 蓝字
   - 悬停:主色实底 + 白字(`.ar-nav-year` / `.ar-nav-arrow` 也要跟白,
     否则图标还是蓝的在蓝底上看不见)
   - 禁用态保持灰(`is-disabled` + opacity .42),不能跟可用态一个样

6. 评论「评论者」下面的灰线太短 → 延长到与评论分隔线等长、右侧到头
   - 🔴 这里改过一次方案:一开始以为把 h3 `flex: 1 1 auto` 撑宽就行,
     实测发现 `.comments-head` 是 flex 行,右边还有「写下你的评论」按钮
     (flex: 0 0 auto),h3 撑满也只能长到按钮左边缘 —— 原理上到不了右端
     (实测 h3 110.5px / li 561.98px,差的 451px 就是按钮 + gap)
   - 最终方案:**线从 h3 搬到 `.comments-head` 容器上**,
     h3 显式 `border-bottom: none` 干掉 kratos 的 #f0f0f0,
     否则会出现一短一长两条线,比原来更难看
   - 容器那条规则**还必须带 `.k-main` 前缀**((0,5,0)),否则压不过
     kratos 的 `.comments .title`。发布判据当场抓到这一条:注释里写了
     「带 .k-main 前缀」,代码里漏了 —— 注释不能当证据

7. 工具条分隔细线不统一 → 5 个按钮 4 条线
   - 原来 B/I 之间没有线,其余有 ⇒ 现在统一
   - 写成「每条后面跟一条」会在末尾多出贴容器边缘的孤线,所以是 5 按钮 4 线

8. 清理无用 JS/CSS
   - 四轮查证结论:**没有可安全删除的**,代码一行未动
   - 排查过程已作为评论发到工单

测试:归档单测 113/0(反向 13 真红)、归档 e2e 112/0(反向 24 真红)、
评论几何 157/0(反向含新增 5 条,覆盖"线搬回标题""两处都画"两种错误形态)。
线上真实页面几何探针发布前 17 通过/16 失败(每条都对应上面某一条诉求),
发布后要求全绿。
2026-10-26 18:42:40 +08:00

481 lines
15 KiB
CSS
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*!
* 归档式文章列表([Archives])样式
* Yongquan Yang <yangyq.net>
*
* ── 设计原则 ────────────────────────────────────────────────
* 1. **它是导航,不是内容**:所以字号小一点、颜色退后一步,
* 让文章标题成为这一屏唯一的主角。
* 2. **色值一律带兜底**:`var(--ar-primary, #00a2ff)`。
* 主题**没有**定义全站 CSS 变量(主色是各处硬编码的),
* 照抄 var(--kratos-primary) 会静默失效、整块永远是默认灰。
* 所以本文件自己定义一组 `--ar-*` 局部变量,挂在 `.yang-archives`
* 作用域内,不污染全站;同时每个使用点都带兜底值。
* 3. **与评论区的变量命名区分**:评论用 `--yq-*`,这里用 `--ar-*`。
* 两套互不依赖,将来任一方改色都不会波及另一方。
* 4. **不引入图标字体以外的东西**:三项计数用的 `i-hot`/`i-comments`/`i-good`
* 是主题图标集里已有的三个(page-content.php 同款)。
*/
.yang-archives {
/* 主色 / 文字三级 / 线 —— 与 comments.css 同一套取值,视觉统一 */
--ar-primary: #00a2ff;
--ar-primary-soft: #eaf6ff;
/* 3.2.48:新增深主色 —— 导航按钮的默认字色要它。
* 取值与 comments.css 的 --yq-primary-dark 完全一致,两处按钮才同色。 */
--ar-primary-dark: #0089db;
--ar-text: #33383f;
--ar-text-2: #5b6470;
--ar-text-3: #6b7280;
--ar-line: #eaedf2;
--ar-line-soft: #f1f4f8;
--ar-radius: 4px;
margin: 24px 0 8px;
font-size: 14px;
line-height: 1.6;
color: var(--ar-text, #33383f);
}
/*--------------------------------------------------------------
1. 头部:年份 + 总数 + 上排导航
--------------------------------------------------------------*/
/* 头部一行:年份 + 共 x 篇 + 上排导航
*
* 🔴 3.2.48:`align-items` 从 center 改成 **flex-end(底边对齐)**。
*
* 用户原话:「后面的共x篇,的位置,有点不太好,太高了,比前面的2026
* 还要高,让它降下来和2026,也就是年份的底边对齐」。
*
* 为什么 center 会出这个问题:年份 26px、总数 12.5px,两者行盒高度
* 差 11px 以上,垂直居中后小字号的**顶部**会跑到年份顶部上面去 ——
* 视觉上「共 15 篇」比「2026」还高,读起来像两个不相干的元素。
* flex-end 让两者的底边贴同一条线,正是用户的描述。
*
* 为什么不用 baseline:baseline 对齐的是文字基线,12.5px 的字
* 基线之上还有一半行高,底边仍会差几个像素,不满足"底边对齐"。
*
* ⚠️ flex-end 对齐的是 **margin box**,所以下面 .ar-year 的
* margin 必须清零 —— kratos 的 `.article .content h3` 会给它
* margin-bottom: 16px,不清掉的话"底边"会整体上浮 16px。 */
.yang-archives .ar-head {
display: flex;
flex-wrap: wrap;
align-items: flex-end;
gap: 8px 12px;
padding-bottom: 12px;
border-bottom: 1px solid var(--ar-line, #eaedf2);
}
/* 🔴🔴 3.2.48 重要教训:这里的 font-size / font-weight 原来**从来没生效过**。
*
* 本文件写 22px/700,线上真实计算值是 **18px/500**(CDP
* CSS.getMatchedStylesForNode 抓到的赢家是
* `.k-main .details .article .content h3 { font-size: 18px }`,
* 特异性 (0,4,1))。本规则 `.yang-archives .ar-year` 只有 (0,2,0),
* 而且 kratos.min.css 在 archives.css **之前**入队也没用 ——
* 层叠先比特异性,后比顺序。同一个坑还有 .ar-month-title:
* 写 14px/600,实际 16px/500。
*
* 用户当时说的「年份字体再大一点」,前提是"现在就是 22px",
* 实际它一直是 18px。
*
* 修法不是继续加类名硬拼(.yang-archives .ar-year.ar-year 这种
* 特异性 hack 会随模板层级变化再次失效),而是:
* ① 选择器带上 .k-main 前缀,把特异性提到 (0,5,0),稳定压过 (0,4,1);
* ② 同时写 font-weight,因为 h3 的 500 也来自同一条规则。
* 判据不能只断言「CSS 文件里有 22px」——那种断言上面这段一直是通过的。
* 必须断言**线上真实渲染的 computed font-size**,见 _live_geom18.js。 */
.yang-archives .ar-year,
.k-main .details .content .yang-archives .ar-year {
/* margin 必须清零:kratos 的 `.article .content h3` 会给它
* margin-bottom: 16px。底边对齐(align-items: flex-end)对的是
* margin box,留着这 16px 会让年份整体上浮,"底边齐平"落空。
* 实测线上 computed margin 曾经就是 `24px 0px 16px`。 */
margin: 0;
/* 用户要求「再大一点」:18px(实际生效值)→ 26px。
* 26 而不是 24,是因为年份是这一屏的锚点,且它右侧还有个
* 12.5px 的总数要形成明显对比。 */
font-size: 26px;
font-weight: 700;
line-height: 1.2;
color: var(--ar-text, #33383f);
/* 等宽数字:切年时 2026 → 2025 两位都变,不等宽会左右跳一下 */
font-variant-numeric: tabular-nums;
}
.yang-archives .ar-total {
font-size: 12.5px;
color: var(--ar-text-3, #6b7280);
/* 底边对齐时,行盒底部自带一点留白(line-height 1.6 的 descent),
* 微调 1px 让它与年份的数字底边视觉齐平,而不是与原文字盒齐平。 */
line-height: 1.6;
padding-bottom: 1px;
}
/*--------------------------------------------------------------
2. 四角导航
--------------------------------------------------------------*/
/* 上排靠右、下排靠右 —— 两侧按钮分居两端 */
.yang-archives .ar-nav {
display: flex;
align-items: center;
justify-content: space-between;
gap: 10px;
margin-left: auto;
min-width: 240px;
}
.yang-archives .ar-nav-top {
/* 头部是 flex,导航自己靠右;窄屏会换行到标题下方 */
margin-left: auto;
}
.yang-archives .ar-foot {
margin-top: 16px;
padding-top: 14px;
border-top: 1px solid var(--ar-line, #eaedf2);
}
.yang-archives .ar-foot .ar-nav {
margin-left: 0;
min-width: 0;
}
/* 上一年 / 下一年按钮
*
* 3.2.48:整套换成「写下你的评论」(.comments-jump-form) 的观感。
* 用户原话:「上一年,下一年的按钮,看不清,样式和写下你的评论
* 保持一致吧,就是平时是浅蓝色的框,鼠标悬停后是浅蓝色背景,白色字」。
*
* 原来是灰边框 var(--ar-line,#eaedf2) + 灰字 #5b6470,在白底上
* 对比度只有 2.x:1,确实"看不清"。
*
* 具体取值与 comments.css 的 .comments-jump-form 逐项对齐:
* border #cfe6fb 浅蓝细框(原 #eaedf2)
* color var(--ar-primary-dark,#0089db) 深蓝字(原 #5b6470)
* hover background var(--ar-primary,#00a2ff) + color #fff
* (原来是 primary-soft #eaf6ff 浅蓝底 + 蓝字)
*
* ⚠️ 禁用态(is-disabled)不能跟着 hover 变蓝 —— 它压根不可点。
* 下面单独覆盖,且用 higher 特异性压住 hover 规则。 */
.yang-archives .ar-nav-btn {
display: inline-flex;
align-items: center;
gap: 6px;
padding: 6px 14px;
border: 1px solid #cfe6fb;
border-radius: var(--ar-radius, 4px);
background-color: transparent;
color: var(--ar-primary-dark, #0089db);
font-size: 13px;
line-height: 1.4;
text-decoration: none;
white-space: nowrap;
transition: border-color 0.16s ease, color 0.16s ease, background-color 0.16s ease;
}
.yang-archives a.ar-nav-btn:hover {
border-color: var(--ar-primary, #00a2ff);
background-color: var(--ar-primary, #00a2ff);
color: #fff;
text-decoration: none;
}
/* 悬停时里面两段小字(年份、箭头)也跟着变白,否则会是灰字压蓝底 */
.yang-archives a.ar-nav-btn:hover .ar-nav-year,
.yang-archives a.ar-nav-btn:hover .ar-nav-arrow {
color: #fff;
opacity: 1;
}
.yang-archives a.ar-nav-btn:focus-visible {
outline: 2px solid var(--ar-primary, #00a2ff);
outline-offset: 2px;
}
.yang-archives .ar-nav-arrow {
font-size: 11px;
line-height: 1;
opacity: 0.8;
}
.yang-archives .ar-nav-year {
font-size: 12px;
color: var(--ar-text-3, #6b7280);
font-variant-numeric: tabular-nums;
}
/* 3.2.48:hover 变白的规则已合并到上面 .ar-nav-btn:hover 那一组
* (原来只有 .ar-nav-year,箭头仍是灰色 opacity .8,蓝底上发灰)。
* 这里只保留禁用态。 */
/* 禁用态:到最早/最新一年。用 opacity + 去掉交互,
* 不用 display:none —— 按钮消失会让"上排只剩一个按钮"看着像坏了。
*
* ⚠️ 禁用态是 <span>,不是 <a>,所以上面 `a.ar-nav-btn:hover` 选不中它,
* 不需要额外用 !important 去压。这一点在改样式时容易忽略:
* 如果将来把禁用态也改成 <a>,就必须回来补一条覆盖。 */
.yang-archives .ar-nav-btn.is-disabled {
opacity: 0.42;
cursor: not-allowed;
background-color: transparent;
color: var(--ar-text-3, #6b7280);
}
/*--------------------------------------------------------------
3. 月份分组
--------------------------------------------------------------*/
.yang-archives .ar-month + .ar-month {
margin-top: 18px;
}
/* 月份标题
*
* 🔴 与 .ar-year 同一个坑:`.k-main .details .article .content h4`
* ((0,4,1))把本规则原写的 14px/600 全部压掉,线上实际是 16px/500。
* 所以这里补一条带 .k-main 前缀的高特异性选择器。 */
.yang-archives .ar-month-title,
.k-main .details .content .yang-archives .ar-month-title {
display: flex;
align-items: baseline;
gap: 8px;
margin: 14px 0 6px;
font-size: 14px;
font-weight: 600;
line-height: 1.5;
color: var(--ar-text-2, #5b6470);
}
/* 月份标题左侧一小段主色竖线,作为分组视觉锚点 */
.yang-archives .ar-month-title::before {
content: "";
flex: 0 0 auto;
width: 3px;
height: 14px;
border-radius: 2px;
background-color: var(--ar-primary, #00a2ff);
}
.yang-archives .ar-month-count {
padding: 0 6px;
border-radius: 999px;
background-color: var(--ar-line-soft, #f1f4f8);
color: var(--ar-text-3, #6b7280);
font-size: 11.5px;
font-weight: 400;
font-variant-numeric: tabular-nums;
}
/*--------------------------------------------------------------
4. 条目
--------------------------------------------------------------*/
.yang-archives .ar-list {
margin: 0;
padding: 0;
list-style: none;
}
.yang-archives .ar-item {
display: flex;
align-items: baseline;
gap: 10px;
padding: 6px 8px;
border-radius: var(--ar-radius, 4px);
/* 分隔用极浅的线,不抢视觉 */
border-bottom: 1px solid var(--ar-line-soft, #f1f4f8);
}
.yang-archives .ar-item:last-child {
border-bottom: 0;
}
.yang-archives .ar-item:hover {
background-color: var(--ar-primary-soft, #eaf6ff);
}
.yang-archives .ar-date {
flex: 0 0 auto;
min-width: 44px;
color: var(--ar-text-3, #6b7280);
font-size: 12.5px;
font-variant-numeric: tabular-nums;
}
.yang-archives .ar-title {
flex: 1 1 auto;
min-width: 0;
color: var(--ar-text, #33383f);
text-decoration: none;
/* 长标题单行截断:归档是"扫一眼找文章",换行会把行距撑乱 */
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.yang-archives .ar-title:hover {
color: var(--ar-primary, #00a2ff);
text-decoration: underline;
text-underline-offset: 2px;
}
.yang-archives .ar-item:hover .ar-title {
color: var(--ar-primary, #00a2ff);
}
/*--------------------------------------------------------------
5. 三项计数
--------------------------------------------------------------*/
.yang-archives .ar-stats {
flex: 0 0 auto;
display: inline-flex;
align-items: center;
gap: 10px;
margin-left: auto;
padding-left: 10px;
}
.yang-archives .ar-stat {
display: inline-flex;
align-items: center;
gap: 3px;
color: var(--ar-text-3, #6b7280);
font-size: 12px;
font-variant-numeric: tabular-nums;
white-space: nowrap;
}
.yang-archives .ar-stat .kicon {
font-size: 12px;
line-height: 1;
}
/* 零值弱化:0 浏览 / 0 评论 / 0 赞占了相当多,一律同等强调会让
* 计数列看起来全是"0 0 0",反而看不出哪篇有热度。
* 属性由 PHP 在渲染时按真实值打(见 yang_archives_render_item())。 */
.yang-archives .ar-stat[data-zero="1"] {
opacity: 0.45;
}
/*--------------------------------------------------------------
6. 空态
--------------------------------------------------------------*/
.yang-archives .ar-empty {
margin: 20px 0 4px;
padding: 18px 16px;
border: 1px dashed #dfe5ec;
border-radius: var(--ar-radius, 4px);
color: var(--ar-text-3, #6b7280);
font-size: 13.5px;
text-align: center;
}
/*--------------------------------------------------------------
7. 切年时的过渡
--------------------------------------------------------------*/
/* 只做淡入,不做高度动画:
* 高度动画需要先量 scrollHeight 再改 height,在长列表(一年 12 个月)
* 上会强制同步布局,切年时有肉眼可见的卡顿。
* 淡入用 CSS animation 而不是 JS 定时器,是为了让它自己结束、
* 不留 pending 的 timeout(否则快速连点切年,几个 timeout 会交错)。 */
.yang-archives .ar-body.is-switching {
animation: ar-fade 0.18s ease;
}
@keyframes ar-fade {
from {
opacity: 0;
transform: translateY(-2px);
}
to {
opacity: 1;
transform: none;
}
}
/* 尊重系统的"减少动效"设置 */
@media (prefers-reduced-motion: reduce) {
.yang-archives .ar-body.is-switching {
animation: none;
}
}
/*--------------------------------------------------------------
8. 窄屏
--------------------------------------------------------------*/
@media (max-width: 767.98px) {
.yang-archives {
font-size: 13.5px;
}
.yang-archives .ar-head {
/* 窄屏下导航换到标题下方并且铺满,两个按钮各占一半。
*
* 🔴 3.2.48:这里原来写 align-items: baseline。改成 flex-end ——
* 用户要求的是「共 x 篇与年份**底边**对齐」,而 baseline 对的
* 是文字基线,小字号元素基线之上还有半行行高,底边仍会差几像素。
* 窄屏如果还用 baseline,宽屏修好了、手机上又错回去,
* 这种"只在大屏对"的 bug 最容易在验收时漏掉。
* (不需要保留 baseline:导航按钮在同一行时靠 flex 自己撑,
* 换行后是独立一行,对齐方式对它没有影响。) */
align-items: flex-end;
}
.yang-archives .ar-nav {
width: 100%;
min-width: 0;
margin-left: 0;
}
.yang-archives .ar-nav-btn {
flex: 1 1 0;
justify-content: center;
padding: 7px 8px;
}
/* 窄屏隐藏计数图标,只留数字 —— 图标加数字在 320px 宽度下
* 会把标题挤到只剩两三个字 */
.yang-archives .ar-stat .kicon {
display: none;
}
.yang-archives .ar-stats {
gap: 8px;
padding-left: 6px;
}
.yang-archives .ar-date {
min-width: 40px;
font-size: 12px;
}
}
@media (max-width: 400px) {
.yang-archives .ar-title {
/* 极窄屏允许两行,否则标题只剩几个字完全看不出是哪篇 */
white-space: normal;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
}
.yang-archives .ar-item {
/* 计数换到标题下一行,避免和标题抢宽度 */
flex-wrap: wrap;
}
.yang-archives .ar-stats {
width: 100%;
margin-left: 0;
padding-left: 50px;
}
}