303 lines
7.1 KiB
CSS
303 lines
7.1 KiB
CSS
/*!
|
||||
|
|
* 文章目录(TOC)样式
|
|||
|
|
* Yongquan Yang <yangyq.net>
|
|||
|
|
*
|
|||
|
|
* ── 设计原则 ────────────────────────────────────────────────
|
|||
|
|
* 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;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/* <details> 的默认三角标记去掉,用自己的图标 */
|
|||
|
|
.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;
|
|||
|
|
}
|
|||
|
|
}
|