Quiet Outline 插件深度优化分享:更简明的多行标题与主题集成
优雅的大纲导航体验,让文档结构一目了然
认识 Obsidian 的 Quiet Outline 插件
在 Obsidian 这款强大的知识管理工具中,Quiet outline 插件扮演着文档导航中枢的角色。它能自动解析当前文档的标题层级结构,在侧边栏生成清晰的可视化大纲。无论是编辑长文档还是快速定位内容,这个插件都提供了无可替代的导航效率。
然而,原生样式存在几个痛点:
- 多行标题内部行距过大,与标题间距混淆
- 层级结构视觉区分度不足
- 交互反馈不够优雅
- 与主题配色缺乏协调
基于 Blue Topaz 主题的优雅起点
优秀的 Blue Topaz 主题为 Quiet Outline 提供了坚实的美学基础:
- 圆角设计融入现代 UI 风格
- 按钮与输入框视觉统一
- 进度条动态色彩适配
- 节点悬停微交互效果 (更清楚将切换到哪个标题)
这些优化让大纲区域不再突兀,成为工作空间和谐的功能组件。但多行标题区分度问题仍未解决,层级视觉提示也有提升空间。
Note为了启用 Blue Topaz 主题对 Quiet Outline 插件的优化,你需要使用 obsidian-style-settings 插件。
启用 style settings 插件后,会自动开启优化(可在 style settings 插件的设置中关闭)。
Blue Topaz 主题中的优化还涉及一些影响体验的 bug:
- 缩小时产生多个滑动条;
- 侧边父节点展开的引导线消失;
- 插件设置中配置的侧边父节点展开的引导线颜色消失。
我的深度优化方案
在 Blue Topaz 的基础上,我进行了多项突破性改进,重点解决原生插件的核心痛点。
🌟 精准的多行标题处理
- 智能行距压缩技术:通过精密计算字体尺寸与行高比例,将标题内部行距压缩 40%,同时保持标题间距不变
- 视觉补偿机制:采用微妙的上下边距补偿,消除压缩带来的布局断裂感
- 效果对比:
- 优化前:多行标题内部行距与标题间距相同,难以区分内容边界
- 优化后:多行标题内部紧凑连贯;两个标题间距清晰可辨
- 优化前:多行标题内部行距与标题间距相同,难以区分内容边界
🎨 动态色彩继承系统
- 层级色彩映射:自动继承主题设置的 H1-H6 标题颜色
- 智能回退机制:超过六级的标题优雅回退到强调色
- 四重状态指示:
- 悬停状态:半透明强调色背景 (来自 Blue Topaz)
- 选中状态:文字高亮 (来自 Blue Topaz),但去除白色背景增强造成的视觉干扰。
- 定位状态:与 Obsidian 主题定义的文档标题色彩同步
- 顶部导航栏:进度条与主题色彩同步
🌈 层级深度可视化
- 引导线透明度渐变:随层级加深,引导线透明度从 100% 逐级递减至 20%
- 视觉深度暗示:通过透明度变化形成自然视觉纵深感
- 滚动条优化:消除 BT 主题多余滚动条的 bug
- 边界优化:修复了父节点引导线消失的问题
🧩 布局精细调整
- 功能栏边距重置:重新平衡底部空间利用率与美观。左右边距压缩至 5px,空间更紧凑。
- 容器内边距优化:底部空间利用率提升,减少空白浪费
- 输入框统一高度:搜索框与按钮保持 32px 一致高度
- 图标居中校准:所有功能图标完美垂直居中
效果对比与用户体验提升
功能维度 | 原插件 | Blue Topaz 主题 | 本样式优化后 |
---|---|---|---|
顶部导航栏 | 支持自定义颜色 | 仅白色 | 默认为主题颜色,也支持自定义颜色 |
层级视觉引导 | 支持颜色区分,但手动配置麻烦 | 无,缺乏深度感 | 透明度渐变,层次分明;同时支持颜色区分 |
多行标题区分度 | 行距相同,难以区分边界 | 行距相同,难以区分边界 | 内部紧凑,间距清晰 |
当前标题指示 | 统一高亮,缺乏层级信息 | 高亮在非纯白背景下造成过曝 | 动态继承文档各级标题颜色 |
交互反馈 | 生硬的高亮切换 | 平滑的状态过渡 | 平滑的状态过渡 |
空间利用率 | 底部无优化,割裂不美观 | 底部存在过多无效空白 | 边距优化,空间充分利用 |
图标布局与圆角 | 按钮布局错乱,方正图标边缘过于锐利 | 按钮布局调整过时导致错乱,但有美观圆角 | 按钮针对最新版调整正中,有美观圆角。 |
使用指南
- 创建 CSS 文件:在 Obsidian 库目录的
.obsidian/snippets/
中新建 CSS 文件(任意名称,如文件夹不存在手动创建即可) - 应用优化代码:复制本文提供的完整 CSS 样式
- 启用代码片段:在 Obsidian 设置 > 外观 > CSS 代码片段中启用
- 重启生效:重新启动 Obsidian 即可体验优化效果
提示:
- 关闭 Quiet Outline 插件的 “Ellipsis” 功能以获得最佳多行标题显示效果
- 关闭 Quiet Outline 插件的 “Set Primary Clolor” 功能以自适应主题颜色
结语
这些精心设计的优化方案,使 Quiet Outline 从功能性插件蜕变为视觉与体验俱佳的导航工具。多行标题的清晰呈现让复杂文档结构一目了然,动态色彩继承使大纲与编辑区形成视觉统一,而细腻的交互反馈则让导航过程变得愉悦流畅。
站在 Blue Topaz 主题的肩膀上,我们解决了原生插件长期存在的痛点,特别是多行标题的可读性这一核心问题。每一次导航都成为视觉享受,这正是知识管理工具应有的优雅体验。
优化无止境,欢迎在评论区分享您的使用体验和改进建议!
CSS 样式分享
/*
* 目标:选择 n-tree-node-content__text 类内部的 p 标签
* 效果:减小段落内部多行文本之间的行距,而不影响段落与段落之间的间距
* 注明:电脑上测试字体大小是13px,而当 p 的line-height变为 1.6em时,将与原格式一致。
* 补偿计算:
13px * 1.6 = 原始行高像素值;
(13px * 1.6 -13px)/2 = 原始单侧空白;
13px * line-height = 新行高的像素值;
(13px * line-height - 13px)/2 = 新单侧空白;
原始单侧空白 - 新单侧空白 = 损失的单侧空白 = margin-top = margin-bottom;
*/
.quiet-outline .n-tree-node-content__text p {
line-height: 1.2em; /* 调整原始段落行距 */
margin-top: 2.6px; /* 微调段落上方的间距使与改line-height前一致 */
margin-bottom: 2.6px; /* 微调段落上方的间距使与改line-height前一致 */
}
/* 移除点击高亮(Blue Topaz主题已经有了) */
.n-tree.n-tree--block-line .n-tree-node:not(.n-tree-node--disabled).n-tree-node--selectable:not(:hover) {
background-color: transparent !important;
}
/* 移除误触发的多余滚动条 */
body .workspace-leaf-content[data-type=quiet-outline] .quiet-outline {
margin-bottom: 0px ; /* 应该通过padding调整而非margin */
padding-bottom: 10px; /* make use of wasted spaces */
/* below are from Blue Topaz theme -> .quiet-outline-optimize */
padding-top: 10px;
border-radius: var(--radius-l);
}
body .workspace-leaf-content[data-type=quiet-outline] .quiet-outline .function-bar > :first-child {
margin-left: 5px;
}
body .workspace-leaf-content[data-type=quiet-outline] .quiet-outline .function-bar {
margin-right: 5px;
}
body .workspace-leaf-content[data-type=quiet-outline] .quiet-outline .level-2 .n-tree-node-indent,
body .workspace-leaf-content[data-type=quiet-outline] .quiet-outline .level-3 .n-tree-node-indent:first-child,
body .workspace-leaf-content[data-type=quiet-outline] .quiet-outline .level-4 .n-tree-node-indent:first-child,
body .workspace-leaf-content[data-type=quiet-outline] .quiet-outline .level-5 .n-tree-node-indent:first-child,
body .workspace-leaf-content[data-type=quiet-outline] .quiet-outline .level-6 .n-tree-node-indent:first-child {
border-right: 1px solid auto;
opacity: 1;
}
body .workspace-leaf-content[data-type=quiet-outline] .quiet-outline .level-3 .n-tree-node-indent,
body .workspace-leaf-content[data-type=quiet-outline] .quiet-outline .level-4 .n-tree-node-indent:nth-child(2),
body .workspace-leaf-content[data-type=quiet-outline] .quiet-outline .level-5 .n-tree-node-indent:nth-child(2),
body .workspace-leaf-content[data-type=quiet-outline] .quiet-outline .level-6 .n-tree-node-indent:nth-child(2) {
border-right: 1px solid auto;
opacity: 0.8;
}
body .workspace-leaf-content[data-type=quiet-outline] .quiet-outline .level-4 .n-tree-node-indent,
body .workspace-leaf-content[data-type=quiet-outline] .quiet-outline .level-5 .n-tree-node-indent:nth-child(3),
body .workspace-leaf-content[data-type=quiet-outline] .quiet-outline .level-6 .n-tree-node-indent:nth-child(3) {
border-right: 1px solid auto;
opacity: 0.6;
}
body .workspace-leaf-content[data-type=quiet-outline] .quiet-outline .level-5 .n-tree-node-indent,
body .workspace-leaf-content[data-type=quiet-outline] .quiet-outline .level-6 .n-tree-node-indent:nth-child(4) {
border-right: 1px solid auto;
opacity: 0.4;
}
body .workspace-leaf-content[data-type=quiet-outline] .quiet-outline .level-6 .n-tree-node-indent {
border-right: 1px solid auto;
opacity: 0.2;
}
/*
body .workspace-leaf-content[data-type=quiet-outline] .quiet-outline .n-tree-node--selectable.located p {
color: var(--interactive-accent);
}
*/
body .workspace-leaf-content[data-type=quiet-outline] .quiet-outline .n-tree-node--selectable.level-1.located p {
color: var(--h1-color);
}
body .workspace-leaf-content[data-type=quiet-outline] .quiet-outline .n-tree-node--selectable.level-2.located p {
color: var(--h2-color);
}
body .workspace-leaf-content[data-type=quiet-outline] .quiet-outline .n-tree-node--selectable.level-3.located p {
color: var(--h3-color);
}
body .workspace-leaf-content[data-type=quiet-outline] .quiet-outline .n-tree-node--selectable.level-4.located p {
color: var(--h4-color);
}
body .workspace-leaf-content[data-type=quiet-outline] .quiet-outline .n-tree-node--selectable.level-5.located p {
color: var(--h5-color);
}
body .workspace-leaf-content[data-type=quiet-outline] .quiet-outline .n-tree-node--selectable.level-6.located p {
color: var(--h6-color);
}
/* for headings over h6*/
body .workspace-leaf-content[data-type=quiet-outline] .quiet-outline .n-tree-node--selectable.located p {
color: var(--interactive-accent);
}
/* Below are from Blue Topaz Theme, deleted .quiet-outline-optimize */
/* ================================== */
/* ============== quiet-outline ============= */
/* ================================== */
/**quiet outline**/
body .workspace-leaf-content[data-type=quiet-outline] .view-content {
padding: unset;
}
body .workspace-leaf-content[data-type=quiet-outline] .n-slider .n-slider-rail {
background-color: var(--background-secondary-alt);
box-shadow: 0 3px 5px var(--background-modifier-box-shadow);
}
/*
body .workspace-leaf-content[data-type=quiet-outline] .n-slider .n-slider-rail .n-slider-rail__fill {
background-color: var(--background-modifier-border);
}
*/
body .workspace-leaf-content[data-type=quiet-outline] .n-slider .n-slider-dots .n-slider-dot {
background-color: var(--background-primary);
border: 2px solid var(--background-modifier-border);
}
body .workspace-leaf-content[data-type=quiet-outline] .n-slider .n-slider-dots .n-slider-dot.n-slider-dot--active {
border: 2px solid var(--interactive-accent);
}
body .workspace-leaf-content[data-type=quiet-outline] .n-button {
width: 32px;
height: 32px;
background-color: var(--background-secondary-alt);
border: 0px;
border-radius: var(--radius-l);
}
body .workspace-leaf-content[data-type=quiet-outline] .n-button .n-button__icon svg {
display: flex;
align-items: center;
justify-content: center;
}
body .workspace-leaf-content[data-type=quiet-outline] .n-button .n-button__border,
body .workspace-leaf-content[data-type=quiet-outline] .n-button .n-button__state-border {
display: none;
}
body .workspace-leaf-content[data-type=quiet-outline] .quiet-outline .n-tree-node-content__text p {
color:var(--text-normal);
}
/*
body.quiet-outline-optimize .workspace-leaf-content[data-type=quiet-outline] .quiet-outline {
padding-top: 10px;
padding-bottom: 28px;
margin-bottom: 5px;
border-radius: var(--radius-l);
}
*/
/*
body .workspace-leaf-content[data-type=quiet-outline] .quiet-outline .level-2 .n-tree-node-indent,
body .workspace-leaf-content[data-type=quiet-outline] .quiet-outline .level-3 .n-tree-node-indent:first-child,
body .workspace-leaf-content[data-type=quiet-outline] .quiet-outline .level-4 .n-tree-node-indent:first-child,
body .workspace-leaf-content[data-type=quiet-outline] .quiet-outline .level-5 .n-tree-node-indent:first-child,
body .workspace-leaf-content[data-type=quiet-outline] .quiet-outline .level-6 .n-tree-node-indent:first-child {
border-right: 1px solid auto;
opacity: 0.6;
}
body.quiet-outline-optimize .workspace-leaf-content[data-type=quiet-outline] .quiet-outline .level-3 .n-tree-node-indent,
body.quiet-outline-optimize .workspace-leaf-content[data-type=quiet-outline] .quiet-outline .level-4 .n-tree-node-indent:nth-child(2),
body.quiet-outline-optimize .workspace-leaf-content[data-type=quiet-outline] .quiet-outline .level-5 .n-tree-node-indent:nth-child(2),
body.quiet-outline-optimize .workspace-leaf-content[data-type=quiet-outline] .quiet-outline .level-6 .n-tree-node-indent:nth-child(2) {
border-right: 1px solid rgb(var(--accent-2-rgb),0.5) ;
}
body.quiet-outline-optimize .workspace-leaf-content[data-type=quiet-outline] .quiet-outline .level-4 .n-tree-node-indent,
body.quiet-outline-optimize .workspace-leaf-content[data-type=quiet-outline] .quiet-outline .level-5 .n-tree-node-indent:nth-child(3),
body.quiet-outline-optimize .workspace-leaf-content[data-type=quiet-outline] .quiet-outline .level-6 .n-tree-node-indent:nth-child(3) {
border-right: 1px solid rgb(var(--accent-3-rgb),0.5) ;
}
body.quiet-outline-optimize .workspace-leaf-content[data-type=quiet-outline] .quiet-outline .level-5 .n-tree-node-indent,
body.quiet-outline-optimize .workspace-leaf-content[data-type=quiet-outline] .quiet-outline .level-6 .n-tree-node-indent:nth-child(4) {
border-right: 1px solid rgb(var(--accent-4-rgb),0.5) ;
}
body.quiet-outline-optimize .workspace-leaf-content[data-type=quiet-outline] .quiet-outline .level-6 .n-tree-node-indent {
border-right: 1px solid rgb(var(--accent-5-rgb),0.5) ;
}
*/
body .workspace-leaf-content[data-type=quiet-outline] .n-tree.n-tree--block-line .n-tree-node:not(.n-tree-node--disabled):hover {
background-color: hsla(var(--interactive-accent-hsl),0.2)
}
body .workspace-leaf-content[data-type=quiet-outline] .n-tree.n-tree--block-line .n-tree-node:not(.n-tree-node--disabled):hover p {
color: var(--text-accent-hover);
}
/*
body .workspace-leaf-content[data-type=quiet-outline] .quiet-outline .n-tree-node--selectable.located p {
color: var(--text-accent-hover);
}
*/
body .workspace-leaf-content[data-type=quiet-outline] .quiet-outline .n-tree-node--selected p {
color: var(--text-accent-hover);
font-weight: 600;
background-color: hsla(var(--interactive-accent-hsl),0.2)
}
body .workspace-leaf-content[data-type=quiet-outline] .n-input {
height: 32px;
background-color: var(--background-primary);
border-radius: var(--radius-l);
}
body .workspace-leaf-content[data-type=quiet-outline] .n-input .n-input__border {
border: 0;
}
body .workspace-leaf-content[data-type=quiet-outline] .n-input:not(.n-input--disabled):hover .n-input__state-border,
body .workspace-leaf-content[data-type=quiet-outline] .n-input:not(.n-input--disabled).n-input--focus .n-input__state-border {
border: 0;
box-shadow: unset;
}
body .workspace-leaf-content[data-type=quiet-outline] .n-input .n-input__placeholder {
display: none;
}
body .workspace-leaf-content[data-type=quiet-outline] .n-input .n-input__input input {
caret-color: var(--interactive-accent);
}
body .workspace-leaf-content[data-type=quiet-outline] .n-input .n-input__input input::placeholder {
color: var(--text-faint);
}
/* #end quiet outline */
讨论
若阁下有独到的见解或新颖的想法,诚邀您在文章下方留言,与大家共同探讨。
反馈交流
其他渠道
版权声明
版权声明:所有 PKMer 文章如果需要转载,请附上原文出处链接。