Files
wordpress-kratos-yang/assets/css/comments.css
T

1552 lines
49 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.
/*!
* 评论区样式
* Yongquan Yang <yangyq.net>
*
* ── 3.2.20:为什么又改了一次 ────────────────────────────────
* 3.2.18 重写解决的是**结构**问题(float 撑破、嵌套没缩进、
* 头像基线不齐)。3.2.19 解决的是**数据**问题(评论一条不显示)。
* 这一版解决的是**观感**问题 —— 用无头浏览器把计算样式量出来
* 之后,量到的三条都是硬指标不达标,不是"见仁见智":
*
* · 时间戳 #a4abb5 → 对白底对比度 **2.32**(WCAG AA 正文要 ≥4.5)
* · 「回复」按钮 #8a9099 → 对比度 **3.22**(可点元素同样要 ≥4.5)
* · 顶层评论分隔线 #f5f6f8 → 对白底几乎零差,等于**没有分隔**
*
* 也就是说"不好看"里有一半其实是"看不清"。只调审美不改这三条,
* 换个分辨率又会打回原形。所以这一版先把可读性拉到达标,
* 再谈层次与细节。
*
* ── 设计取向:跟整站对齐,不做另一套语言 ─────────────────────
* 量过整站的实际 token:body 16px / 行高 1.8 / 正文 #212529、
* 底色 #f5f5f5、圆角以 3px 为主、主色 #00a2ff、卡片靠 1px 淡阴影
* 而不是大圆角大投影。评论区是这张白卡里的**内嵌区**,
* 所以这里不引入流行的"大圆角 + 重投影 + 彩色卡片",
* 而是把预算花在:分隔清晰、层级明确、元信息可读、交互有反馈。
*
* 参考的设计原则(GitHub Discussions / Discourse / 主流中文博客):
* 1. 元信息(时间、操作)比正文弱但**必须可读**,不能淡到消失;
* 2. 层级靠"缩进 + 引导线 + 头像尺寸"三重冗余表达,
* 任何一重失效(窄屏、深嵌套)另外两重还在;
* 3. 分隔线只用在"同层"之间,跨层交给缩进 —— 两套信号不要打架;
* 4. 可点元素必须有 hover / focus 的可见变化,不能只变鼠标指针。
*
* ── 三条不能动的约束(改样式前务必知道)───────────────────────
* 1. `.yang-comment` **必须是 grid**,且 `grid-template-columns` 为
* `auto minmax(0,1fr)`、子容器 `grid-column: 1 / -1`。
* 原因:`<ol class="yang-children">` 是 `<li>` 的**直接子元素**,
* 换成 flex 它会成为第三个 flex 项被排到右侧(详见第 3 节注释)。
* 2. 子容器 `ol.yang-children` 的 **左偏移必须 ≈0、宽度必须 ≈父宽**。
* `_diag318_children_geo.js` 的判据 A/B 卡的就是这两条,
* 所以缩进只能加在 `padding-left` 上,**不能加 margin-left**。
* 3. 头像宽度按断点递减:>768 是 42、≤768 是 36、≤400 是 32。
* `_comments_geometry.js` 按这三个值断言,改尺寸要同步改探针。
*/
/*--------------------------------------------------------------
0. 局部设计变量
--------------------------------------------------------------*/
/* 变量全部挂在 `.comments` 作用域内,不污染全站。
*
* 使用约定:**信息性颜色一律带兜底值**(`var(--x, #hex)`),
* 因为评论表单会被 JS 搬进某条评论的 `.yang-children` 里 ——
* 虽然它仍在 `.comments` 内部、继承链没断,但只要将来有人把
* 表单挪到容器外,没有兜底的 var() 就会退化成 initial 的黑色。
* 纯装饰性的取值(圆角、缓动曲线)允许不带兜底:真取不到也
* 只是少了点润色,不会把文字变成看不见的颜色。
*
* 下面注释里的「对比度」是相对白底 #fff 按 WCAG 2.x 算的实测值。 */
.comments {
--yq-primary: #00a2ff;
--yq-primary-dark: #0089db;
--yq-primary-soft: #eaf6ff;
/* 文字三级:正文 / 次要 / 弱
* --yq-text 10.9 —— 正文
* --yq-text-2 6.0 —— 作者名、操作按钮
* --yq-text-3 4.8 —— 时间、辅助说明(AA 下限 4.5,留了余量) */
--yq-text: #33383f;
--yq-text-2: #5b6470;
--yq-text-3: #6b7280;
/* 线:把"分隔"和"装饰"分开,不要用一个 #f0f0f0 打天下 */
--yq-line: #eaedf2; /* 结构性分隔,看得见 */
--yq-line-soft: #f1f4f8; /* 同层细分隔 */
/* 嵌套引导线:直接用主色(「发布评论」按钮的背景色)。
* 3.2.22 之前用浅蓝 #cfe6fb,用户反馈"这蓝色有点奇怪,应该用主题颜色"——
* 浅蓝和主色按钮不是一个蓝,两蓝并存反而显乱,索性同色。
* 引用 --yq-primary 而不是再写一个色值:以后改主色,线自动跟。 */
--yq-guide: var(--yq-primary, #00a2ff);
--yq-bg-soft: #f7f9fb;
--yq-bg-input: #fcfcfd;
--yq-radius: 4px;
--yq-radius-lg: 6px;
/* 子回复的缩进量(见第 5 节的推导)。
* 公式:头像宽 + 列间距
* 桌面 42+13 = 55 / ≤768 36+10 = 46 / ≤400 32+10 = 42。
*
* ⚠️ 3.2.22 起**不再减引导线宽**。上一版引导线是容器的 border-left,
* 而 padding-left 从边框内侧算起,所以那个 2px 必须扣掉;
* 现在引导线改成绝对定位的伪元素、完全不占布局,扣掉反而会让
* 子回复整体左移 2px。缩进从此就是纯粹的「父正文左边缘距父 li 多远」。
*
* 存在变量里是因为它必须和头像宽度、列间距**同时**在断点里改,
* 分散写三处迟早漏一处(上一版就是这么漏掉 img 宽度的)。 */
--yq-indent: 55px;
--yq-indent-deep: 30px;
/* 引导线的宽度。单独抽出来是给两处用:伪元素的 width,
* 以及"线要贴在正文左边缘的左侧"这个位移量(见第 5 节)。
* 改成 2px 以外还要同时看 --yq-indent 的定义,别只改一处。 */
--yq-guide-w: 2px;
/* 引导线与子回复块(头像)之间的空隙(3.2.26)。
* 3.2.22 线的右边缘贴着子头像左边缘 —— 用户反馈"紧挨着不好看",
* 现在线让出 8px。线的 left = indent − 线宽 − 这个空隙。 */
--yq-guide-gap: 8px;
/* 统一动效曲线:进出都用同一条,避免"有的滑有的弹" */
--yq-ease: cubic-bezier(0.4, 0, 0.2, 1);
}
/*--------------------------------------------------------------
1. 区块与标题
--------------------------------------------------------------*/
.k-main .details .comments {
margin-top: 20px;
padding: 22px 24px 24px;
border-radius: var(--yq-radius-lg, 6px);
background-color: #fff;
/* 比原来的 0 1px 3px 稍微收一点:整站卡片(.widget)用的是
0 1px 2px,评论区跟着走,深浅一致才不会显得"飘" */
box-shadow: 0 1px 2px rgba(31, 35, 40, 0.08);
}
.k-main .details .post-2 .comments {
box-shadow: none;
}
.comments-head {
display: flex;
align-items: baseline;
justify-content: space-between;
gap: 12px;
padding-bottom: 15px;
}
/* 标题:不加任何装饰。
* 曾经在左侧加过一条主色竖条 —— 用户明确要求去掉:标题本身字重足够,
* 竖条只是多余的视觉噪音,而且它逼着标题让出 12px 左内边距,
* 让「评论」两个字和下方评论正文的左边缘对不齐。 */
.comments-head .title {
margin: 0;
color: #1f2328;
font-weight: 600;
font-size: 19px;
line-height: 1.4;
letter-spacing: -0.005em;
}
/* 「写下你的评论」:原来用 3px 圆角 + #f4f8ff 底,白底上几乎看不出是按钮。
* 改成描边式,hover 时反色 —— 可点性更明确,又不抢标题的注意力。 */
.comments-jump-form {
flex: 0 0 auto;
padding: 6px 14px;
border: 1px solid #cfe6fb;
border-radius: var(--yq-radius, 4px);
background-color: transparent;
color: var(--yq-primary-dark, #0089db);
font-size: 13px;
line-height: 1.4;
text-decoration: none;
white-space: nowrap;
transition: background-color 0.16s var(--yq-ease), border-color 0.16s var(--yq-ease),
color 0.16s var(--yq-ease);
}
.comments-jump-form:hover {
border-color: var(--yq-primary, #00a2ff);
background-color: var(--yq-primary, #00a2ff);
color: #fff;
text-decoration: none;
}
.comments-jump-form:focus-visible {
outline: 2px solid var(--yq-primary, #00a2ff);
outline-offset: 2px;
}
.comments-closed,
.comments-empty {
margin: 20px 0 4px;
padding: 18px 16px;
border: 1px dashed #dfe5ec;
border-radius: var(--yq-radius, 4px);
background-color: transparent;
color: var(--yq-text-3, #6b7280);
font-size: 13.5px;
line-height: 1.7;
text-align: center;
}
/*--------------------------------------------------------------
2. 评论列表
--------------------------------------------------------------*/
.yang-comment-list,
.yang-children {
margin: 0;
padding: 0;
list-style: none;
}
.yang-comment-list {
margin-top: 2px;
}
/* 顶层评论之间用**看得见**的分隔线。
* 原来是 #f5f6f8 —— 对白底几乎零差(正文区宽度 780px 的一条线,
* 差值小于 4 级灰阶,人眼在普通屏幕上抓不到),
* 于是四条评论糊成一坨。现在提到 #eaedf2,是"能看见但不抢戏"的程度。
* 跨层之间不加线,交给缩进和引导线表达 —— 两套信号不要打架。 */
.yang-comment-list > .yang-comment {
border-bottom: 1px solid var(--yq-line, #eaedf2);
}
.yang-comment-list > .yang-comment:last-child {
border-bottom: 0;
}
/*--------------------------------------------------------------
3. 单条评论
--------------------------------------------------------------*/
/* 单条评论的布局:头像列 + 主体列
*
* ⚠️ 这里**必须是 grid,不能是 flex**。
* 原因:wp_list_comments 输出的是
* <li class="yang-comment">
* <div class="yang-comment-avatar">…</div>
* <div class="yang-comment-main">…</div>
* <ol class="yang-children">…子评论…</ol> ← 也是 li 的直接子元素
* </li>
* 若 li 用 display:flex,那个 <ol> 就成了**第三个 flex 项**,
* 被排到主体右边的同一行里 —— 表现为"子评论跑到父评论右侧"、
* 父评论正文被挤成一条、页面出现横向溢出。这是真实渲染量出来的,
* 光看代码几乎想不到(flex 项的位置不体现在 li 自己的属性上)。
*
* grid 用两列:第 1 列 auto(由头像定宽),第 2 列 minmax(0,1fr)
* (minmax 的下界 0 是关键,否则长英文/长 URL 会把列撑宽)。
* 子评论用 grid-column: 1 / -1 独占下一整行。 */
.yang-comment {
display: grid;
grid-template-columns: auto minmax(0, 1fr);
column-gap: 13px;
align-items: start;
padding: 18px 0;
list-style: none;
/* 从通知邮件/后台点进来时会带 #comment-123 锚点,
这里不做布局级高亮(会挤动内容),只给正文区一个色块,
详见第 5 节末尾的 :target 规则。 */
}
/* 子评论容器独占整行,排在头像与主体下方 */
.yang-comment > .yang-children {
grid-column: 1 / -1;
}
/* 头像列:固定宽度,不参与伸缩 —— 否则长评论把它挤扁。
* (grid 里 flex 属性无效,留着只是无害的历史残留,已删除。) */
.yang-comment-avatar {
width: 42px;
line-height: 0;
}
/* 头像:去掉 1px 实线边框,改用 box-shadow 做一圈极淡描边。
* 理由有两个:① 实线边框在 42px 圆上是"切边"观感,阴影更柔;
* ② box-shadow 不占布局,直径仍然是精确的 42px ——
* 几何探针按 42/36/32 断言,改 border 不会让断言漂移。 */
.yang-comment-avatar img,
.yang-comment-avatar-img {
display: block;
width: 42px;
height: 42px;
border: 0;
border-radius: 50%;
object-fit: cover;
background-color: #f2f4f7;
box-shadow: 0 0 0 1px rgba(31, 35, 40, 0.07), 0 1px 2px rgba(31, 35, 40, 0.06);
}
/* 没有头像时的首字占位 */
.yang-comment-avatar-ph {
display: flex;
align-items: center;
justify-content: center;
width: 42px;
height: 42px;
border-radius: 50%;
background-color: #eef2f7;
box-shadow: 0 0 0 1px rgba(31, 35, 40, 0.05);
color: #66727f;
font-size: 17px;
font-weight: 600;
line-height: 1;
text-transform: uppercase;
user-select: none;
}
/* 主体列 */
.yang-comment-main {
min-width: 0; /* 关键:让内部的 text-overflow / 换行能生效 */
}
/* ── 3.2.26 布局重排:姓名信息与头像垂直居中,内容移到头像下方 ──
* 旧布局是"左头像、右(头行+正文)"两列并排,两个问题:
* ① 锚点黄底(打在正文区,带 8px 外扩光晕)向上顶到头行的
* 「作者」蓝标,两块颜色叠在一起;
* ② 正文顶着头行,离姓名/时间太近。
* 用户方案:姓名/时间**垂直居中于头像**(头行与头像同一行、
* align-self: center),正文**整行移到头像那一行的下面**,
* 顶部再留 10px —— 内容与作者信息自然拉开,黄底光晕也够不着头行。
*
* 实现:walker 生成的 .yang-comment-main 包着头行/正文/操作区,
* 模板不动,用 display: contents 把这个盒子从布局里"拿掉",
* 让三个孩子直接成为 li 的 grid 项:
* 第 1 行 头像 | 头行(居中)
* 第 2 行 正文(跨两列,全宽)
* 第 3 行 操作区(跨两列)
* 第 4 行 子评论(跨两列,原有规则)
* ⚠️ display: contents 后 .yang-comment-main 自身的 min-width 失效,
* 由头行接棒;正文成为跨列 grid 项后,长 URL 的 min-content 可能
* 把第 1 列(auto,头像列)撑宽 —— 用 overflow-wrap: anywhere 压掉
* 它的 min-content 贡献(探针断言头像列恒为 42px 兜底)。 */
.yang-comment-main {
display: contents;
}
.yang-comment {
grid-template-areas:
"avatar head"
"body body";
}
.yang-comment-avatar {
grid-area: avatar;
}
.yang-comment-head {
grid-area: head;
min-width: 0;
/* 姓名信息显示在头像的正中间:第 1 行的高度由头像(42px)撑起,
头行在行内垂直居中 */
align-self: center;
margin-bottom: 0; /* 原来的 5px 交给正文的 margin-top */
}
.yang-comment-content {
grid-area: body;
margin-top: 10px;
/* 压掉跨列项的 min-content 贡献,防止长 URL 撑宽头像列
(break-word 不参与 min-content 计算,anywhere 才参与) */
overflow-wrap: anywhere;
}
.yang-comment-actions {
/* 操作区也整行放下(跟随正文全宽),隐式第 3 行 */
grid-column: 1 / -1;
}
.yang-comment-head {
display: flex;
align-items: baseline;
flex-wrap: wrap;
gap: 6px;
/* 3.2.26:原 5px。正文下移后间距由 .yang-comment-content 的
margin-top 统一控制,这里清零,别两处叠加 */
margin-bottom: 0;
}
.yang-comment-author {
color: #1f2328;
font-weight: 600;
font-style: normal;
font-size: 14.5px;
line-height: 1.5;
/* 超长昵称截断,别把时间挤到下一行去 */
max-width: 100%;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.yang-comment-author a {
color: inherit;
text-decoration: none;
transition: color 0.16s var(--yq-ease);
}
.yang-comment-author a:hover {
color: var(--yq-primary-dark, #0089db);
}
/* 时间:**这是本版最实质的一处修复**。
* 原来是 #a4abb5,对白底只有 2.32 —— 2.32 是什么概念:
* WCAG 把 3.0 定为"大字最低可读",2.32 连这个都不到,
* 相当于把时间写成了水印。现在用 #6b7280(对比度 4.83),
* 仍然明显弱于正文 #33383f(对比度 10.9),但它读得清。 */
.yang-comment-time {
flex: 0 0 auto;
color: var(--yq-text-3, #6b7280);
font-size: 12.5px;
line-height: 1.5;
/* 等宽数字:多条评论的时间上下对齐,不会因为 1 和 8 的宽度差抖动 */
font-variant-numeric: tabular-nums;
}
/* 作者名与时间之间的小间隔点。
* 用 ::before 而不是真加一个字符:它会跟着 time 一起换行,
* 不会孤零零留在行首。 */
.yang-comment-time::before {
content: "·";
margin-right: 6px;
color: #c9ced6;
}
/* 徽标:作者 / 待审核。3px 圆角改成 pill —— 徽标本身足够短,
* pill 不会显得幼稚,反而和头像的圆形呼应。 */
.yang-comment-badge {
flex: 0 0 auto;
padding: 1px 8px;
border-radius: 999px;
background-color: var(--yq-primary-soft, #eaf6ff);
color: var(--yq-primary-dark, #0089db);
font-size: 11.5px;
font-weight: 500;
line-height: 1.6;
letter-spacing: 0.01em;
}
.yang-comment-badge.is-pending {
background-color: #fff5e0;
color: #96601a;
}
/* 待审核的整条评论淡化,一眼区分。
* 0.72 太狠 —— 配上本来就淡的时间,整条几乎消失。收到 0.85。 */
.yang-comment.is-pending .yang-comment-content {
opacity: 0.85;
}
/* 评论正文 */
.yang-comment-content {
color: var(--yq-text, #33383f);
font-size: 14.5px;
/* 1.8 是中文长文段的舒适值;原来 1.78 也可以,
但配合 14.5px 的字号,1.8 让行距守恒在 26px 左右,更像印刷品 */
line-height: 1.8;
word-wrap: break-word;
overflow-wrap: break-word;
}
.yang-comment-content > p:first-child {
margin-top: 0;
}
.yang-comment-content > p:last-child {
margin-bottom: 0;
}
.yang-comment-content p {
margin: 0 0 10px;
}
/* @某人 的提及高亮(由 comment_add_at 过滤器插入的 <span>) */
.yang-comment-content > span:first-child {
color: var(--yq-primary-dark, #0089db);
font-weight: 500;
}
/* 评论里的图片:限制最大宽度,别撑破容器 */
.yang-comment-content img {
max-width: 100%;
height: auto;
}
/* 引用块 */
.yang-comment-content blockquote {
margin: 10px 0;
padding: 8px 14px;
border-left: 3px solid #cfe4f8;
border-radius: 0 var(--yq-radius, 4px) var(--yq-radius, 4px) 0;
background-color: var(--yq-bg-soft, #f7f9fb);
color: var(--yq-text-2, #5b6470);
font-size: 13.5px;
line-height: 1.75;
}
.yang-comment-content blockquote > p:last-child {
margin-bottom: 0;
}
.yang-comment-content code {
padding: 1px 5px;
border-radius: 3px;
background-color: #f2f4f7;
color: #c7254e;
font-size: 13px;
}
.yang-comment-content pre {
overflow-x: auto;
margin: 10px 0;
padding: 11px 14px;
border-radius: var(--yq-radius, 4px);
background-color: #f6f7f9;
font-size: 13px;
line-height: 1.65;
}
.yang-comment-content pre code {
padding: 0;
background: none;
color: inherit;
}
/* 表情图片与正文基线对齐 */
.yang-comment-content img.wp-smiley {
display: inline-block;
margin: 0 1px;
width: auto;
max-height: 1.4em;
vertical-align: text-bottom;
}
/*--------------------------------------------------------------
4. 操作按钮
--------------------------------------------------------------*/
.yang-comment-actions {
display: flex;
align-items: center;
gap: 6px;
/* 正文下留一点呼吸;按钮自带内边距,这里就得收一点 */
margin-top: 5px;
margin-left: -9px; /* 抵消按钮的 padding-left,让图标与正文左边缘对齐 */
}
/* 「回复」「编辑」:**第二处硬指标修复**。
* 原来是 #8a9099(对比度 3.22)且没有任何边距,
* 在正文下面像一行灰字,不像按钮。
* 现在:颜色提到 #5b6470(6.0),加内边距形成可点区域,
* hover 时出现浅蓝底 —— 三重信号告诉人"这是能点的"。 */
.yang-comment-reply,
.yang-comment-edit {
padding: 3px 9px;
border: 0;
border-radius: var(--yq-radius, 4px);
background: none;
color: var(--yq-text-2, #5b6470);
font-size: 13px;
font-weight: 500;
line-height: 1.6;
text-decoration: none;
cursor: pointer;
transition: color 0.16s var(--yq-ease), background-color 0.16s var(--yq-ease);
}
.yang-comment-reply:hover,
.yang-comment-edit:hover {
background-color: var(--yq-primary-soft, #eaf6ff);
color: var(--yq-primary-dark, #0089db);
text-decoration: none;
}
.yang-comment-reply:focus-visible,
.yang-comment-edit:focus-visible {
outline: 2px solid var(--yq-primary, #00a2ff);
outline-offset: 1px;
}
.yang-comment-reply .kicon {
margin-right: 4px;
font-size: 12px;
/* 图标跟文字同色,不要一个深一个浅 */
color: inherit;
}
/* 已进入"回复这条"状态时,按钮藏起来(由 JS 加 class) */
.yang-comment-reply.is-hidden {
visibility: hidden;
}
/*--------------------------------------------------------------
5. 嵌套回复
--------------------------------------------------------------*/
/* 层级用三重冗余表达,任何一重失效另外两重仍在:
* ① 缩进(padding-left)
* ② 引导线(::before 绝对定位的竖线)
* ③ 头像尺寸(42 → 34)
*
* ── 缩进值是怎么算出来的(别随手改)────────────────────────────
* 目标:**子回复那一块的左边缘,正好落在父评论正文的左边缘上**。
*
* 父评论一行是 `[头像 42][列间距 13][正文…]`,所以父正文左边缘
* 距父 li 左边缘 42 + 13 = 55px。`ol.yang-children` 是父 li 的
* 直接子元素、从父 li 左边缘起算,所以
*
* padding-left = 头像宽 + 列间距 = 42 + 13 = 55px
*
* 就精确对齐了,不是"接近"。768 / 400 两个断点头像与列间距都变小,
* 这个值必须跟着换(46 / 42),否则窄屏上子回复会突出去。
*
* ── 引导线为什么改成伪元素(3.2.22)──────────────────────────
* 原来它写在容器的 border-left 上,于是只能贴在**父 li 的左边缘** ——
* 也就是父头像那一列。但子回复整块已经右移到父正文的位置了,
* 线却还留在最左边,中间空出 55px,看起来像"线和内容脱节了"。
*
* 用户明确要求:**线也要跟着右移,和上面评论的正文对齐**。
* border 做不到(它只能贴在盒子的外沿),所以改用绝对定位的伪元素,
* 位置由 --yq-indent 决定 —— 断点里改缩进,线会自动跟着走,不会脱节。
*
* 线的定位取 `left: calc(indent - 线宽)`,让线的**右边缘**与正文左边缘
* 重合,于是线完全落在头像左侧、不压头像(头像有一圈 1px 描边,压上去会脏)。
* 视觉上就是"一条竖线紧贴正文左边缘",这也正是用户要的对齐。
*
* ⚠️ 3.2.26 起不再"紧贴":用户反馈线与子回复头像挨得太近,
* 定位改为 `left: calc(indent - 线宽 - var(--yq-guide-gap))`,
* 线的右边缘与子块(头像)左边缘之间留 8px 空隙。
* (3.2.26 同批布局重排后正文整行下移到头像下方,"线对齐正文"
* 这个前提也不复存在 —— 线现在是"挂在子块左侧、让出空隙"的装饰。)
*
* ⚠️ 缩进仍然只能用 padding-left,**不能用 margin-left**:
* `_diag318_children_geo.js` 判据 A 要求 `ol.yang-children` 的
* 左偏移(相对父 li)≤4px、判据 B 要求宽度 ≥ 父宽 90%。
* margin-left 会同时破坏这两条,padding-left 不会。
* (伪元素是绝对定位、不参与布局,所以加它不影响这两条判据。)
*
* ⚠️ 3.2.26:缩进量收进**本容器的单一变量** --yq-my-indent ——
* padding 与引导线的 left 都从它取值。此前线写死 `var(--yq-indent)`,
* 深层容器换成 deep 缩进后线还按基础缩进定位,会压进子正文 12px;
* 单一变量后改哪层缩进,线自动跟。 */
.yang-children {
--yq-my-indent: var(--yq-indent, 55px);
position: relative;
margin-top: 4px;
padding-left: var(--yq-my-indent);
}
/* 竖线本体。不占布局,所以不会像 border 那样把内容再推 2px。
* top/bottom 撑满整块,等价于原来 border-left 的长度。
* pointer-events: none —— 它压在 padding 区域上,别让它拦住点击。
* 3.2.26:左端从 `indent − 线宽` 改成 `indent − 线宽 − 空隙` ——
* 原来线的右边缘与子头像左边缘重合(紧挨着),用户要求留出空间。 */
.yang-children::before {
content: "";
position: absolute;
top: 0;
bottom: 0;
left: calc(var(--yq-my-indent, 55px) - var(--yq-guide-w, 2px) - var(--yq-guide-gap, 8px));
width: var(--yq-guide-w, 2px);
/* 3.2.27:颜色按嵌套层区分 —— 由各评论 li 注入的 --yq-guide-c 决定
(PHP 端 yang_comment_guide_color():第1层保持浅蓝、第2层深蓝、
第3层点赞按钮色 #fb5235、更深扩展色板循环)。
未注入时回落到主题浅蓝,老缓存/插件渲染的评论不受影响。 */
background-color: var(--yq-guide-c, var(--yq-guide, var(--yq-primary, #00a2ff)));
pointer-events: none;
}
.yang-children > .yang-comment {
padding: 12px 0;
}
/* 同一层回复之间:比顶层更细的分隔,且只在"多于一条"时才需要。
* 用 :not(:last-child) 而不是给最后一条清零 —— 后者会因为
* 嵌套结构不同而漏掉某些情况。 */
.yang-children > .yang-comment:not(:last-child) {
border-bottom: 1px solid var(--yq-line-soft, #f1f4f8);
}
/* 深层的头像小一号,靠尺寸建立层级感(第二重冗余) */
.yang-children .yang-children .yang-comment-avatar,
.yang-children .yang-children .yang-comment-avatar-ph {
width: 34px;
}
.yang-children .yang-children .yang-comment-avatar img,
.yang-children .yang-children .yang-comment-avatar-img {
width: 34px;
height: 34px;
}
.yang-children .yang-children .yang-comment-avatar-ph {
height: 34px;
font-size: 14px;
}
/* 第三层起改用更小的缩进(--yq-indent-deep),并去掉引导线。
*
* 为什么必须减小:padding-left 是**逐层累加**的。第一层 55px 对齐好看,
* 但到第三层就是 55×3 = 165px —— 390px 屏上正文只剩 100 多像素,
* 长文会被切成竖条。所以从第三层起换成 30px,三层累计 55+55+30 = 140px,
* 仍然呈现递进,但不再失控。
*
* 引导线也去掉:三条竖线平行叠在一起会变成"表格"观感,反而更难读。
* 3.2.22 起线是伪元素,所以这里要 **content: none** 把它整个关掉,
* 而不是像以前那样改 border-left-color —— 伪元素没有"透明色"的需求,
* 直接不生成更干净(也不会残留一个不可见的绝对定位盒)。
*
* ⚠️ 这里**必须显式设 padding-left**,不能只关掉线 ——
* 否则它会继承上一层的 55px,与"减小"的意图正好相反。
*
* ⚠️ 选择器必须是**两个** .yang-children(3.2.26 修):
* 第 1 个 ol 装第 2 层回复、第 2 个 ol 装第 3 层回复 ——
* "第三层起换小缩进"要命中的是第 2 个 ol。原来写成三个类,
* 实际命中第 3 个 ol(装第 4 层),深层缩进整整晚了一层才生效;
* 旧探针只判"≥6px"所以多年没暴露,3.2.26 改精确判据后现形。
*
* 注:去掉 border 后,这里的 30px 变成"纯粹的偏移量"。
* 上一版因为 border 占 2px,实际偏移是 32px;差这 2px 对第三层
* 的观感没有影响,且方向是略微更宽松,不去追平。 */
.yang-children .yang-children {
--yq-my-indent: var(--yq-indent-deep, 30px);
padding-left: var(--yq-my-indent);
}
/* 3.2.27:第三层起的引导线**不再关闭**。
* 原来 content:none 的理由是"三条同色竖线叠成表格观感";现在线按层
* 变色(浅蓝→深蓝→橙红→…),颜色本身就是层级信号,同色重复的
* 前提不复存在,这条规则跟着过期 —— 保留它第三层就没有线可变色了。 */
/* 新提交的评论:淡入 + 短暂底色,让用户看到自己刚发的那条 */
@keyframes yang-comment-in {
from {
opacity: 0;
transform: translateY(-4px);
}
to {
opacity: 1;
transform: none;
}
}
/* 刚提交的那条:淡入 + 短暂底色。
* 底色用主题浅蓝 —— 它表达的是"这条刚发出去"的即时反馈,
* 和主色系统一致,也和下面锚点高亮(暖黄)**区分开**:
* 一个是"刚发生",一个是"你要找的就是这条",不该长得一样。 */
.yang-comment.is-new {
animation: yang-comment-in 0.28s var(--yq-ease);
border-radius: var(--yq-radius-lg, 6px);
background-color: var(--yq-primary-soft, #eaf6ff);
}
/* 从通知/后台带 #comment-123 跳过来时,高亮那一条。
*
* ── 这就是「有些回复下面有黄色背景、有些没有」的原因 ──────────
* 底色是暖黄 #fffbe8。它只在**链接里带了该条评论的锚点**时出现
* (:target 伪类),所以:
* · 从评论通知邮件点进来 → URL 末尾有 #comment-1234 → 那一条是黄的;
* · 自己正常打开文章 → 没有任何锚点 → 一条都不黄。
* 于是同一个页面上"有的黄有的不黄",看起来像随机。
*
* ── 3.2.21 曾改成浅蓝,3.2.22 按用户要求改回黄色 ───────────────
* 3.2.21 的考虑是"全站只有待审核用暖色,这里再用黄会混淆"。
* 但用户明确指出:**这就是为了突出显示锚点,还是用黄色**。
* 这个判断是对的 —— 锚点高亮是一次性的、需要"跳出来"的提示,
* 浅蓝和引导线、按钮描边同色系,反而被当成背景噪音忽略掉;
* 暖黄在一个全蓝的页面里立刻能看见。
*
* 与 is-new 的分工因此变得清楚:
* · :target → 暖黄(一次性,指路)
* · is-new → 浅蓝(即时反馈,我刚发的)
* 两者不再撞色,同页出现也能分辨。 */
.yang-comment:target .yang-comment-content {
border-radius: var(--yq-radius, 4px);
background-color: #fffbe8;
box-shadow: 0 0 0 8px #fffbe8;
}
/*--------------------------------------------------------------
6. 加载更多
--------------------------------------------------------------*/
.comments-more {
padding: 18px 0 2px;
text-align: center;
}
.comments-more[hidden] {
display: none;
}
.comments-more-btn {
padding: 9px 28px;
border: 1px solid #dbe3ec;
border-radius: 999px;
background-color: #fff;
color: var(--yq-text-2, #5b6470);
font-size: 13.5px;
font-weight: 500;
cursor: pointer;
transition: border-color 0.16s var(--yq-ease), color 0.16s var(--yq-ease),
background-color 0.16s var(--yq-ease);
}
.comments-more-btn:hover:not(:disabled) {
border-color: var(--yq-primary, #00a2ff);
background-color: var(--yq-primary-soft, #eaf6ff);
color: var(--yq-primary-dark, #0089db);
}
.comments-more-btn:focus-visible {
outline: 2px solid var(--yq-primary, #00a2ff);
outline-offset: 2px;
}
.comments-more-btn:disabled {
opacity: 0.55;
cursor: default;
}
/*--------------------------------------------------------------
7. 评论表单
--------------------------------------------------------------*/
.comment-respond {
margin-top: 24px;
padding-top: 22px;
border-top: 1px solid var(--yq-line, #eaedf2);
}
/* 表单被"搬"进某条评论时,去掉那条顶部分隔线,视觉上更连贯 */
.yang-children > #respond {
margin-top: 10px;
padding-top: 14px;
border-top: 1px dashed #e3e9f1;
}
.comment-reply-title {
display: flex;
align-items: center;
flex-wrap: wrap;
gap: 10px;
margin: 0 0 15px;
color: #1f2328;
font-weight: 600;
font-size: 16px;
line-height: 1.5;
}
.comment-cancel-reply {
padding: 3px 11px;
border: 1px solid #e2e7ee;
border-radius: 999px;
background-color: #f7f8fa;
color: var(--yq-text-2, #5b6470);
font-weight: 400;
font-size: 12.5px;
cursor: pointer;
transition: border-color 0.16s var(--yq-ease), background-color 0.16s var(--yq-ease),
color 0.16s var(--yq-ease);
}
.comment-cancel-reply[hidden] {
display: none;
}
.comment-cancel-reply:hover {
border-color: #f0b4b4;
background-color: #fff5f5;
color: #d9534f;
}
/* 「正在回复 @某人」提示条 */
.comment-reply-hint {
margin: 0 0 13px;
padding: 8px 13px;
border-left: 3px solid var(--yq-primary, #00a2ff);
border-radius: 0 var(--yq-radius, 4px) var(--yq-radius, 4px) 0;
background-color: #f2f9ff;
color: #3f6b90;
font-size: 13px;
line-height: 1.65;
}
.comment-reply-hint[hidden] {
display: none;
}
/* 昵称/邮箱/网址:三列,窄屏自动堆叠 */
.comment-info {
display: flex;
flex-wrap: wrap;
gap: 10px;
margin-bottom: 12px;
}
.comment-field {
position: relative;
flex: 1 1 180px;
min-width: 0;
}
.comment-field-icon {
position: absolute;
left: 11px;
top: 50%;
transform: translateY(-50%);
color: #a8b0bb;
font-size: 14px;
line-height: 1;
pointer-events: none;
}
/* 输入框:3px → 4px 圆角,内边距加 1px。
* 单看差距很小,但三个输入框并排时,"够不够松"决定整体是否廉价。 */
.comment-input {
display: block;
width: 100%;
padding: 10px 13px;
border: 1px solid #dfe4ec;
border-radius: var(--yq-radius, 4px);
background-color: var(--yq-bg-input, #fcfcfd);
color: #2b3038;
font-family: inherit;
font-size: 14px;
line-height: 1.5;
transition: border-color 0.16s var(--yq-ease), background-color 0.16s var(--yq-ease),
box-shadow 0.16s var(--yq-ease);
-webkit-appearance: none;
}
.comment-field .comment-input {
padding-left: 34px;
}
/* 占位符:原来复用了 #a4abb5(对比度 2.32)。
* 占位符承载的是「这里该填什么」这层信息,不是纯装饰,
* 所以跟时间戳一起提到 --yq-text-3。
* 注意仍要比已输入的文字(#2b3038)弱一档,否则分不清"填了没有"。 */
.comment-input::placeholder {
color: var(--yq-text-3, #6b7280);
opacity: 1; /* Firefox 默认会再压一层透明度,雪上加霜 */
}
.comment-input:hover:not(:focus):not(:disabled) {
border-color: #cdd6e2;
}
.comment-input:focus {
outline: none;
border-color: var(--yq-primary, #00a2ff);
background-color: #fff;
/* 3px 的柔和外环,比原来的 0.1 稍微实一点,
在高亮背景(护眼黄等)下也能看清焦点在哪 */
box-shadow: 0 0 0 3px rgba(0, 162, 255, 0.14);
}
.comment-input:disabled,
.comment-input[readonly] {
background-color: #f6f7f9;
color: var(--yq-text-3, #6b7280);
}
/* textarea 容器。
*
* 🔴 三态(静态 / hover / focus)都必须带
* `.k-main .details .comments .comment-respond` 前缀 —— 不是为了好看,
* 是为了**特异性**。kratos.css 里有
* .k-main .details .comments .comment-respond .comment-textarea
* { border: 1px solid #eee; border-radius: 3px; background: 灰 }
* 特异性 0,6,0。我们下面不带前缀的三条只有 0,1,0 / 0,2,0,
* **一条都赢不了** —— 也就是说 3.2.20 重做以来,正文框的
* 边框色(#dfe4ec)、圆角(4px)、浅底(#fcfcfd)、hover 变深、
* focus 变主色,**全部从未真正上线**,用户看到的一直是
* kratos.css 的 #eee / 3px / 灰底,focus 时只有那圈外环是我们的。
* 3.2.23 用户指出"输入框选中时周边颜色不对",才把这个老问题翻出来。
*
* 修法:同选择器(0,6,0)+ 三态伪类(各再 +0,1,0),且本表
* 依赖 kratos 后加载 —— 每条都稳定压过基础主题。 */
.k-main .details .comments .comment-respond .comment-textarea,
.comment-textarea {
position: relative;
border: 1px solid #dfe4ec;
border-radius: var(--yq-radius, 4px);
background-color: var(--yq-bg-input, #fcfcfd);
transition: border-color 0.16s var(--yq-ease), box-shadow 0.16s var(--yq-ease),
background-color 0.16s var(--yq-ease);
}
.k-main .details .comments .comment-respond .comment-textarea:hover:not(:focus-within),
.comment-textarea:hover:not(:focus-within) {
border-color: #cdd6e2;
}
/* focus:边框与外环都是主色(「发布评论」按钮的背景色)——
* 3.2.23 用户要求:"输入框被选中的时候,周边的颜色,也变成这个颜色"。 */
.k-main .details .comments .comment-respond .comment-textarea:focus-within,
.comment-textarea:focus-within {
border-color: var(--yq-primary, #00a2ff);
background-color: #fff;
box-shadow: 0 0 0 3px rgba(0, 162, 255, 0.14);
}
.comment-textarea .comment-input {
min-height: 136px;
padding: 12px 14px;
border: 0;
border-radius: 0;
background: none;
resize: vertical;
box-shadow: none;
}
.comment-textarea .comment-input:focus {
box-shadow: none;
background: none;
}
/* 3.2.25 所见即所得编辑区:顶替原 textarea 的可视位置。
* 边框 / 底色 / 聚焦态都挂在 .comment-textarea 容器上(focus-within),
* 编辑区本体只管排版 —— 整框仍是"一个编辑器"的观感。 */
.k-main .details .comments .comment-respond .comment-textarea .comment-editor,
.comment-textarea .comment-editor {
min-height: 136px;
max-height: 420px;
overflow-y: auto;
padding: 12px 14px;
border: 0;
background: none;
color: #2b3038;
font-family: inherit;
font-size: 14px;
line-height: 1.5;
word-break: break-word;
outline: none;
cursor: text;
-webkit-appearance: none;
}
.comment-editor:focus {
outline: none;
}
/* 占位符:编辑区为空时显示(:empty 由 input 监听保真空) */
.comment-editor:empty::before {
content: attr(data-placeholder);
color: var(--yq-text-3, #6b7280);
pointer-events: none;
}
/* 编辑区里的表情图:跟正文字号走,基线对齐 */
.comment-editor .yang-editor-emoji {
height: 1.25em;
vertical-align: -0.25em;
margin: 0 1px;
}
/* 工具条:加粗 / 斜体 / 字体颜色 / 表情。
*
* 位于输入框上方,与 textarea 同在 .comment-textarea 这个带边框的
* 容器里 —— 工具条铺满容器顶部,输入框一聚焦整框(含工具条)
* 一起亮主色描边,视觉上是"一个编辑器",而不是两条孤立的横条。
* 面板(色板 / 表情)从按钮**下方**弹出:按钮在容器顶部,
* 向上弹会飘到表单外面盖住上文,向下弹只盖住自己的输入区。 */
.comment-toolbar {
display: flex;
align-items: center;
gap: 2px;
padding: 5px 9px;
border-bottom: 1px solid #edf0f4;
border-radius: var(--yq-radius, 4px) var(--yq-radius, 4px) 0 0;
background-color: #fafbfc;
}
/* 面板的定位父级:每个带面板的按钮各包一层 */
.comment-tool-group {
position: relative;
display: flex;
align-items: center;
}
/* 按钮组之间的细分隔线 */
.comment-toolbar-sep {
align-self: center;
width: 1px;
height: 16px;
margin: 0 5px;
background-color: #e2e7ee;
}
.comment-tool-btn {
display: inline-flex;
align-items: center;
justify-content: center;
min-width: 30px;
height: 30px;
padding: 0 7px;
border: 0;
border-radius: var(--yq-radius, 4px);
background: none;
color: var(--yq-text-2, #4b5563);
font-size: 14px;
line-height: 1;
cursor: pointer;
transition: color 0.16s var(--yq-ease), background-color 0.16s var(--yq-ease);
}
.comment-tool-btn:hover {
background-color: var(--yq-primary-soft, #eaf6ff);
color: var(--yq-primary-dark, #0089db);
}
.comment-tool-btn:focus-visible {
outline: 2px solid var(--yq-primary, #00a2ff);
outline-offset: 1px;
}
/* 字形:B 用粗体、I 用衬线斜体,一眼能认出对应排版效果 */
.comment-tool-glyph {
display: inline-block;
font-family: inherit;
font-size: 14.5px;
line-height: 1;
}
.comment-tool-glyph-bold {
font-weight: 700;
}
.comment-tool-glyph-italic {
font-family: Georgia, "Times New Roman", serif;
font-style: italic;
font-weight: 600;
}
/* 颜色按钮:字母 A 底下压一条渐变色条,点开是色板 */
.comment-tool-glyph-color {
position: relative;
font-weight: 600;
}
.comment-tool-glyph-color::after {
content: "";
position: absolute;
left: 1px;
right: 1px;
bottom: -3px;
height: 3px;
border-radius: 2px;
background: linear-gradient(90deg, #e74c3c 0%, #f1c40f 30%, #2ecc71 55%, #00a2ff 80%, #9b59b6 100%);
}
/* 色板:8 个圆点,从按钮下方弹出 */
.comment-color-panel {
position: absolute;
top: calc(100% + 6px);
left: 0;
z-index: 21;
display: flex;
flex-wrap: wrap;
gap: 6px;
width: 164px;
padding: 10px;
border: 1px solid #e2e7ee;
border-radius: var(--yq-radius-lg, 6px);
background-color: #fff;
box-shadow: 0 6px 20px rgba(31, 35, 40, 0.12);
}
.comment-color-panel[hidden] {
display: none;
}
.comment-color-swatch {
width: 20px;
height: 20px;
padding: 0;
border: 1px solid rgba(0, 0, 0, 0.08);
border-radius: 50%;
cursor: pointer;
transition: transform 0.12s var(--yq-ease), box-shadow 0.12s var(--yq-ease);
}
.comment-color-swatch:hover {
transform: scale(1.18);
box-shadow: 0 0 0 2px #fff, 0 0 0 3.5px var(--yq-primary, #00a2ff);
}
.comment-color-swatch:focus-visible {
outline: 2px solid var(--yq-primary, #00a2ff);
outline-offset: 1px;
}
/* 底栏:表情移进工具条后只剩状态提示 + 提交按钮 */
.comment-bar {
display: flex;
align-items: center;
justify-content: flex-end;
gap: 10px;
padding: 8px 11px;
border-top: 1px solid #edf0f4;
border-radius: 0 0 var(--yq-radius, 4px) var(--yq-radius, 4px);
background-color: #fafbfc;
}
.comment-bar-right {
display: flex;
align-items: center;
gap: 8px;
}
/* 表情按钮:并入工具条后尺寸与其它工具按钮一致(原 4px 8px 小药丸) */
.comment-smile-btn {
min-width: 30px;
height: 30px;
padding: 0 7px;
font-size: 16px;
}
.comment-smile-btn:hover {
background-color: var(--yq-primary-soft, #eaf6ff);
color: var(--yq-primary-dark, #0089db);
}
/* 表情面板:按钮在容器顶部,改为**向下**弹出(原 bottom 定位作废) */
.comment-smile-panel {
position: absolute;
top: calc(100% + 6px);
left: 0;
z-index: 20;
display: flex;
flex-wrap: wrap;
width: 264px;
padding: 9px;
border: 1px solid #e2e7ee;
border-radius: var(--yq-radius-lg, 6px);
background-color: #fff;
box-shadow: 0 6px 20px rgba(31, 35, 40, 0.12);
}
.comment-smile-panel[hidden] {
display: none;
}
.comment-smile-panel a {
float: none;
display: block;
margin: 2px;
padding: 3px;
width: 28px;
height: 28px;
border: 1px solid transparent;
border-radius: var(--yq-radius, 4px);
background-color: #f7f8fa;
transition: background-color 0.12s var(--yq-ease), border-color 0.12s var(--yq-ease);
}
.comment-smile-panel a:hover {
border-color: #b9dcff;
background-color: #eaf4ff;
}
.comment-smile-panel img {
display: block;
width: 20px;
height: 20px;
}
/* 状态提示 */
.comment-status {
color: var(--yq-text-3, #6b7280);
font-size: 12.5px;
line-height: 1.6;
transition: color 0.16s var(--yq-ease);
}
.comment-status.is-ok {
color: #2f8a3e;
}
.comment-status.is-err {
color: #cf3b36;
}
/* 提交按钮 */
.comment-submit {
padding: 9px 24px;
border: 0;
border-radius: var(--yq-radius, 4px);
background-color: var(--yq-primary, #00a2ff);
box-shadow: 0 1px 2px rgba(0, 162, 255, 0.24);
color: #fff;
font-size: 14px;
font-weight: 500;
line-height: 1.5;
cursor: pointer;
white-space: nowrap;
transition: background-color 0.16s var(--yq-ease), box-shadow 0.16s var(--yq-ease),
opacity 0.16s var(--yq-ease), transform 0.16s var(--yq-ease);
}
.comment-submit:hover:not(:disabled) {
background-color: var(--yq-primary-dark, #0089db);
box-shadow: 0 3px 10px rgba(0, 162, 255, 0.3);
transform: translateY(-1px);
}
.comment-submit:active:not(:disabled) {
transform: none;
box-shadow: 0 1px 2px rgba(0, 162, 255, 0.24);
}
.comment-submit:focus-visible {
outline: 2px solid var(--yq-primary, #00a2ff);
outline-offset: 2px;
}
.comment-submit:disabled,
.comment-submit.is-loading {
opacity: 0.6;
box-shadow: none;
transform: none;
cursor: default;
}
/* honeypot:移出视口而不是 display:none(display:none 的字段部分爬虫不填) */
.comment-hp {
position: absolute;
left: -9999px;
width: 1px;
height: 1px;
overflow: hidden;
}
/* 只需登录才能评论的提示 */
.comments-login-required {
margin: 0;
padding: 20px;
border: 1px dashed #dfe5ec;
border-radius: var(--yq-radius, 4px);
background-color: transparent;
color: var(--yq-text-3, #6b7280);
font-size: 13.5px;
line-height: 1.7;
text-align: center;
}
.comments-login-required a {
color: var(--yq-primary-dark, #0089db);
text-decoration: none;
}
.comments-login-required a:hover {
text-decoration: underline;
}
/*--------------------------------------------------------------
8. 无障碍:屏幕阅读器专用文本
--------------------------------------------------------------*/
.k-main .details .comments .sr-only {
position: absolute;
overflow: hidden;
clip: rect(0, 0, 0, 0);
width: 1px;
height: 1px;
padding: 0;
border: 0;
margin: -1px;
white-space: nowrap;
}
/*--------------------------------------------------------------
9. 响应式
--------------------------------------------------------------*/
@media screen and (max-width: 768px) {
.k-main .details .comments {
padding: 17px 15px 19px;
}
/* 缩进量必须和下面的头像宽度、列间距同步改:
* 头像 36 + 列间距 10 = 46(3.2.22 起不再扣引导线宽,理由见变量定义处);
* 深层要更省空间,取 26。写在这里(.comments 上)是因为变量
* 定义在 .comments 作用域,媒体查询里重新赋值就能让所有后代取到新值 ——
* 引导线的位置是 `calc(indent - 线宽)`,所以它自动跟着走,不用另写一遍。 */
.comments {
--yq-indent: 46px;
--yq-indent-deep: 26px;
}
.comments-head {
flex-wrap: wrap;
gap: 8px;
padding-bottom: 13px;
}
.comments-head .title {
font-size: 17px;
}
.yang-comment {
/* 只收窄列间距;写 gap 会同时给 grid 的 row-gap 赋值,
导致"主体"与"子评论"之间多出一道空隙 */
column-gap: 10px;
padding: 14px 0;
}
/* ⚠️ 这一组必须同时写容器、img 和占位符的 width。
* 只写 height 是个隐蔽陷阱:`.yang-comment-avatar` 容器收到 36px,
* 但基础规则里 img 的 width 仍是 42px —— img 会**溢出容器右侧** 6px,
* 压在正文上,看起来只是"头像有点歪"。
* 更麻烦的是几何探针量的是容器宽度(`.yang-comment-avatar` 的
* getBoundingClientRect),容器确实是 36 —— 于是断言全绿,
* 溢出完全测不到。这个坑是 `_style_ab.js` 逐元素比对时抓出来的。 */
.yang-comment-avatar,
.yang-comment-avatar img,
.yang-comment-avatar-img,
.yang-comment-avatar-ph {
width: 36px;
}
.yang-comment-avatar img,
.yang-comment-avatar-img,
.yang-comment-avatar-ph {
height: 36px;
}
.yang-comment-author {
font-size: 14px;
}
.yang-comment-content {
font-size: 14px;
line-height: 1.78;
}
/* 窄屏的缩进值改在 `.comments` 的变量里统一设(见本节开头),
这里不再单独写 .yang-children 的 padding-left —— 上一版就是在
两个地方分别写死,改一处忘一处,深层的 9px/0 把方向写反了。 */
.comment-info {
flex-direction: column;
gap: 8px;
}
.comment-field {
flex: 1 1 auto;
}
.comment-bar {
flex-wrap: wrap;
gap: 8px;
}
.comment-bar-right {
flex: 1 1 100%;
justify-content: space-between;
}
.comment-status {
flex: 1 1 auto;
min-width: 0;
}
.comment-submit {
padding: 9px 20px;
}
.comment-smile-panel {
width: 240px;
}
}
@media screen and (max-width: 400px) {
/* 同样要同步缩进:头像 32 + 列间距 10 = 42;深层取 22。 */
.comments {
--yq-indent: 42px;
--yq-indent-deep: 22px;
}
/* 400px 断点:同样必须把 img 的 width 一起覆盖(理由见 768 断点那条) */
.yang-comment-avatar,
.yang-comment-avatar img,
.yang-comment-avatar-img,
.yang-comment-avatar-ph {
width: 32px;
}
.yang-comment-avatar img,
.yang-comment-avatar-img,
.yang-comment-avatar-ph {
height: 32px;
}
/* ⚠️ 必须一并覆盖深层头像。
上面的基础规则里有 `.yang-children .yang-children .yang-comment-avatar
{ width: 34px }`,它选择器特异性 (0,3,0) 高于这里的 `.yang-comment-avatar`
(0,1,0) —— 媒体查询**不增加**特异性。所以只写这一条的话,窄屏下
深层头像仍是 34px,反而比顶层的 32px 更大,层级关系是反的。 */
.yang-children .yang-children .yang-comment-avatar,
.yang-children .yang-children .yang-comment-avatar img,
.yang-children .yang-children .yang-comment-avatar-img,
.yang-children .yang-children .yang-comment-avatar-ph {
width: 26px;
}
.yang-children .yang-children .yang-comment-avatar img,
.yang-children .yang-children .yang-comment-avatar-img,
.yang-children .yang-children .yang-comment-avatar-ph {
height: 26px;
font-size: 12px;
}
.comment-smile-panel {
width: 216px;
}
}
/* 尊重"减少动效"偏好:动画全部关掉,但保留视觉状态(颜色、阴影) */
@media (prefers-reduced-motion: reduce) {
.yang-comment,
.yang-comment *,
.comment-submit,
.comments-jump-form,
.comments-more-btn,
.comment-input,
.comment-textarea {
animation: none !important;
transition: none !important;
}
.comment-submit:hover:not(:disabled) {
transform: none;
}
}
/*--------------------------------------------------------------
10. 打印:评论不需要按钮
--------------------------------------------------------------*/
@media print {
.comments-jump-form,
.yang-comment-actions,
.comments-more,
.comment-respond {
display: none !important;
}
.k-main .details .comments {
box-shadow: none;
}
.yang-comment-content {
color: #000;
}
}