/*! * 文章目录(TOC)样式 * Yongquan Yang * * ── 设计原则 ──────────────────────────────────────────────── * 1. **不抢正文的视觉**:目录是辅助导航,不是内容。所以用浅灰背景、 * 细边框、小字号,让它在页面上"退后一步"。 * 2. **用主题主色**:强调色统一为 #00a2ff,与主题其他强调元素一致。 * 注意主题**没有**定义 CSS 变量(主色是各处硬编码的),所以这里 * 直接写字面值,不要臆造 var(--kratos-primary) 之类的变量 —— 那会 * 静默失效,目录永远是默认灰色,且看不出是哪里错了。 * 3. **移动端友好**:窄屏下缩进减小、字号略小,但不折叠成下拉 —— * 目录本来就是给长文用的,手机上更需要它。 */ .yang-toc { margin: 24px 0; border: 1px solid #ebeef5; border-left: 3px solid #00a2ff; border-radius: 3px; background-color: #fafbfc; font-size: 14px; line-height: 1.6; } /*
的默认三角标记去掉,用自己的图标 */ .yang-toc > summary { list-style: none; cursor: pointer; user-select: none; } .yang-toc > summary::-webkit-details-marker { display: none; } .yang-toc > summary::marker { content: ""; } .yang-toc-head { display: flex; align-items: center; padding: 11px 16px; color: #303133; font-weight: 600; font-size: 15px; transition: color 0.15s ease; } .yang-toc-head:hover { color: #00a2ff; } /* 折叠箭头:用 CSS 画的三角,不依赖图标字体或 SVG 文件 */ .yang-toc > summary .yang-toc-title::before { content: ""; display: inline-block; width: 0; height: 0; margin-right: 8px; border-top: 5px solid transparent; border-bottom: 5px solid transparent; border-left: 6px solid currentColor; vertical-align: middle; transition: transform 0.18s ease; } /* 展开时箭头朝下(旋转 90°) */ .yang-toc[open] > summary .yang-toc-title::before { transform: rotate(90deg); } /* 不可折叠时(toggle=0)不显示箭头 */ .yang-toc:not(details) .yang-toc-head .yang-toc-title::before { display: none; } .yang-toc-title { flex: 0 0 auto; } /* 条目数徽标 */ .yang-toc-count { flex: 0 0 auto; margin-left: 8px; padding: 1px 7px; border-radius: 9px; background-color: #eef1f6; color: #909399; font-weight: 400; font-size: 12px; line-height: 1.5; } .yang-toc-body { padding: 0 16px 12px; } .yang-toc-list { margin: 0; padding-left: 0; list-style: none; } /* 二级以上的列表缩进,并加一条引导线 */ .yang-toc-list .yang-toc-list { margin-left: 9px; padding-left: 14px; border-left: 1px dashed #e2e6ee; } .yang-toc-item { margin: 0; padding: 0; list-style: none; } .yang-toc-link { display: flex; align-items: baseline; padding: 4px 6px; border-radius: 3px; color: #4a4f57; text-decoration: none; transition: color 0.15s ease, background-color 0.15s ease; } .yang-toc-link:hover, .yang-toc-link:focus { background-color: #eef4ff; color: #00a2ff; text-decoration: none; } /* 序号 */ .yang-toc-num { flex: 0 0 auto; min-width: 1.9em; margin-right: 5px; color: #a8abb2; font-variant-numeric: tabular-nums; font-size: 13px; } .yang-toc-text { flex: 1 1 auto; overflow: hidden; text-overflow: ellipsis; } /* 层级视觉差异:越深越淡、字号越小 */ .yang-toc-lv3 > .yang-toc-link { color: #6b7280; font-size: 13.5px; } .yang-toc-lv4 > .yang-toc-link, .yang-toc-lv5 > .yang-toc-link, .yang-toc-lv6 > .yang-toc-link { color: #8b9099; font-size: 13px; } /* 当前阅读位置的条目高亮(JS 加 .is-active) */ .yang-toc-link.is-active { background-color: #eef4ff; color: #00a2ff; font-weight: 600; } /* ── 标题锚点:点击跳转后被固定导航栏挡住的问题 ──────────────── * 主题的 .k-nav 是 fixed-top,滚动后固定约 67px 高。 * 纯 CSS 方案是给目标元素加 scroll-margin-top —— 浏览器原生支持, * 且不依赖 JS(用 #anchor 直接访问、前进后退、外部链接进来都生效)。 * * 为什么不用 JS 算偏移:JS 方案只在"点了目录"的情况下有效, * 从外部带 #hash 进来、或按浏览器后退回到锚点时都不会触发。 * scroll-margin-top 是声明式的,所有情况自动生效。 * * 67px 是导航栏高度;再加 16px 呼吸空间。管理工具栏(admin bar) * 存在时再往上加,否则锚点会被工具栏盖住。 */ .yang-toc-target, .k-main .details .content h1[id], .k-main .details .content h2[id], .k-main .details .content h3[id], .k-main .details .content h4[id], .k-main .details .content h5[id], .k-main .details .content h6[id] { scroll-margin-top: 84px; } body.admin-bar .k-main .details .content h1[id], body.admin-bar .k-main .details .content h2[id], body.admin-bar .k-main .details .content h3[id], body.admin-bar .k-main .details .content h4[id], body.admin-bar .k-main .details .content h5[id], body.admin-bar .k-main .details .content h6[id] { scroll-margin-top: 116px; } /* 滚动到锚点时轻微闪一下,让用户确认"跳到这里了" */ @keyframes yang-toc-flash { 0%, 100% { background-color: transparent; } 30% { background-color: #fffbe6; } } .yang-toc-flash { animation: yang-toc-flash 1.1s ease; } /* ── 窄屏 ── */ @media screen and (max-width: 768px) { .yang-toc { margin: 18px 0; font-size: 13.5px; } .yang-toc-head { padding: 10px 13px; font-size: 14px; } .yang-toc-body { padding: 0 10px 10px; } .yang-toc-list .yang-toc-list { margin-left: 4px; padding-left: 10px; } .yang-toc-link { padding: 5px 5px; } .yang-toc-lv3 > .yang-toc-link { font-size: 13px; } } /* ── 打印:目录展开、去背景、不折行 ────────────────────────── */ @media print { .yang-toc { border: 1px solid #ccc; background: none; page-break-inside: avoid; } .yang-toc-count { display: none; } .yang-toc-link { color: #000; } } /* ── 暗色主题适配 ────────────────────────────────────────── * 主题没有内置暗色模式,但用户可能在「自定义 CSS」里加 * prefers-color-scheme。这里跟随同一个媒体查询,避免目录 * 在暗色下变成一块刺眼的白板。 */ @media (prefers-color-scheme: dark) { html.yang-dark .yang-toc { border-color: #303640; border-left-color: #00a2ff; background-color: #1d2026; } html.yang-dark .yang-toc-head { color: #d5d9e0; } html.yang-dark .yang-toc-count { background-color: #2a2f38; color: #8b929d; } html.yang-dark .yang-toc-link { color: #b6bcc6; } html.yang-dark .yang-toc-link:hover, html.yang-dark .yang-toc-link.is-active { background-color: #252b34; color: #00a2ff; } html.yang-dark .yang-toc-list .yang-toc-list { border-left-color: #333944; } html.yang-dark .yang-toc-num { color: #767d88; } }