如何在 Ghost 博客中添加类似 Word 的左侧固定目录(纯干货)

Share
如何在 Ghost 博客中添加类似 Word 的左侧固定目录(纯干货)
Photo by Thought Catalog / Unsplash

当我们在 Ghost 博客中撰写长文时,一个类似 Word 导航窗格的目录能极大提升读者的阅读体验。本文将分享如何通过 Code Injection(代码注入) 快速实现一个完全静止、不随点击乱跳、长标题自动换行的优雅左侧悬浮目录。

实现效果

  • 完全固定: 目录稳居文章左侧,只有正文跟随鼠标滚动。
  • 绝对静止: 修复了常见插件点击目录项时,目录自身会产生二次跳动的痛点。
  • 清晰完整: 长标题自动换行显示,绝不裁剪文字。
  • 移动端友好: 在手机或平板等小屏幕上自动隐藏,防止遮挡正文。

部署步骤

无需修改任何主题源文件,只需登录 Ghost 后台,进入 Settings -> Code Injection(代码注入),将以下两段代码全选覆盖粘贴即可。

1. 注入到 【Site Header】

Site Header 框中复制并完全粘贴以下代码(包含 Tocbot 官方样式与自定义微调 CSS):

HTML

<!-- 1. 引入 Tocbot 的基础样式 -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/tocbot/4.21.0/tocbot.css">

<!-- 2. 微调 CSS:保留流畅,修复跳动,文字全显 -->
<style>
/* 核心布局,确保定位准确 */
.gh-canvas, .article-canvas, .gh-content {
    position: relative;
}

/* 左侧目录悬浮窗格 */
.custom-toc {
    position: fixed;
    top: 100px;         /* 距离屏幕顶部的高度 */
    left: 40px;         /* 距离浏览器左侧的距离 */
    width: 260px;       /* 目录宽度 */
    max-height: 85vh;   /* 最大高度为屏幕的 85%,防止溢出 */
    
    /* 核心控制:禁止整个目录区在点击时产生的内部跳动 */
    overflow-y: hidden; 
    
    z-index: 10;
    font-size: 1.4rem;
    padding: 10px;
}

/* 在手机/平板上隐藏目录,防止遮挡正文 */
@media (max-width: 1200px) {
    .custom-toc {
        display: none;
    }
}

/* 基础列表样式清理 */
.toc-list {
    list-style: none !important;
    padding-left: 0 !important;
    margin: 0 !important;
}

/* 子标题(H3)缩进 */
.toc-list .toc-list {
    padding-left: 15px !important;
}

/* 标题文字完全显示 */
.toc-link {
    display: block;
    padding: 6px 0;
    color: #555 !important;
    text-decoration: none !important;
    transition: color 0.2s ease;
    
    /* 允许长标题正常换行显示,决不裁剪 */
    white-space: normal !important; 
    word-wrap: break-word; 
}

/* 鼠标悬停效果 */
.toc-link:hover {
    color: #111 !important;
}

/* 当前阅读位置的高亮样式 */
.is-active-link {
    font-weight: 600 !important;
    color: #FF1A75 !important; /* 激活时的高亮颜色 */
}
</style>

2. 注入到 【Site Footer】

Site Footer 框中复制并完全粘贴以下代码(引入 JS 脚本并进行核心参数配置):

HTML

<!-- 1. 引入 Tocbot 脚本 -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/tocbot/4.21.0/tocbot.min.js"></script>

<!-- 2. 初始化脚本:禁用目录内部滚动,彻底解决跳动 -->
<script>
document.addEventListener("DOMContentLoaded", function() {
    // 动态在页面中创建目录容器
    const tocContainer = document.createElement('aside');
    tocContainer.className = 'custom-toc js-toc';
    
    // 自动兼容多个常用 Ghost 主题的正文 class 容器
    const contentArea = document.querySelector('.gh-content') || document.querySelector('.article-body') || document.querySelector('.post-content');
    
    if (contentArea) {
        // 将目录动态挂载到页面中
        contentArea.appendChild(tocContainer);
        
        // 初始化 Tocbot 插件
        tocbot.init({
            tocSelector: '.js-toc',
            contentSelector: '.gh-content, .article-body, .post-content',
            headingSelector: 'h2, h3',        /* 默认抓取二级和三级标题 */
            hasInnerContainers: true,
            scrollSmooth: true,               /* 点击跳转时保持平滑滚动 */
            headingsOffset: 100,              /* 跳转后的顶部留白距离 */
            
            /* 【核心调优】设置为 false,Tocbot 将不再尝试同步滚动目录区域,
               配合 CSS 彻底解决了点击目录时、目录栏本身乱跳的体验问题。 */
            disableTocScrollSync: true 
        });
    }
});
</script>

避坑提示与个性化微调

  1. 重叠问题: 如果你的 Ghost 主题正文比较宽,导致左侧目录与正文文字重叠,可以尝试修改 Site Header 中的 left: 40px;(往左调小或往右调大),或者将 width: 260px; 调小。
  2. 高亮颜色: 如果你想换掉那个粉红色的高亮,可以直接在样式中搜索 .is-active-link,把 color: #FF1A75; 改成符合你网站主色调的十六进制颜色(例如蓝色 #2196F3)。

Read more

【避坑指南】从 TinyDB 文件损坏,聊聊文件截断与磁盘刷盘的底层原理

【避坑指南】从 TinyDB 文件损坏,聊聊文件截断与磁盘刷盘的底层原理

在 Python 轻量级开发中,TinyDB 因其“零部署、文件即数据库、支持对象化查询”的特性,成为了存储配置信息、多租户元数据的神器。 但在高频写入或异常崩溃的场景下,你是否遇到过这样的诡异现象:导出的 JSON 文件末尾莫名其妙多出了几个 NULNUL(\x00)空字节,导致整个数据库报 JSON 无法解析的错误? 本文将带你还原这个经典的“文件空洞”Bug,并分享如何通过自定义存储类 MyJSONStorage 彻底解决它。 一、 现象还原:消失的尾巴与诡异的 NUL 在默认情况下,TinyDB 的 JSONStorage 是这样写入文件的: 1. seek(0) 指针回到文件开头。 2. write(json_data) 写入序列化后的 JSON 字符串。 3. truncate(

By 樊泽豪
搭建K3s集群

搭建K3s集群

K8s环境部署 简介 搭建 K3s + Rancher + Longhorn + MetalLB环境 K3s K3s是一款轻量级Kubernetes发行版,其核心优势在于: * 极致轻量:单个二进制文件不到100MB,仅需512MB内存即可运行,启动和资源消耗远低于标准集群。 * 功能齐全:通过CNCF认证,100%兼容标准Kubernetes API,并内置了常用组件,开箱即用。 * 灵活的数据存储:可以使用外部数据库(mariadb)替代etcd,降低初始资源。 Rancher Rancher是一个开源容器管理平台,核心能力包括: * 统一纳管:可集中管理任意K8s集群(包括K3s/RKE2、云厂商托管集群及已有集群)。 * 降低门槛:提供直观图形界面及开箱即用的CI/CD、监控、服务网格等工具链。 * 安全合规:支持AD/LDAP对接及精细化RBAC,实现跨集群统一安全策略。 Longhorn Longhorn 是一款专为 Kubernetes 设计的轻量级、可靠且易用的分布式块存储系统,它通过容器和微服务将现有存储资源转化为持久卷,

By 樊泽豪
Docker常用操作

Docker常用操作

安装 Windows安装Docker到F盘(非系统盘) Start-Process -FilePath 'Docker_Desktop_Installer.exe' -Wait -ArgumentList "install --installation-dir=F:\DockerDesktop" 改变容器、镜像文件位置 以管理员权限启动Docker Desktop,Settings-Resources-Disk iamge location 配置dockerhub国内源 阿里云:容器镜像服务 (aliyun.com) 其他源 more /etc/docker/daemon.json 输入以下文件: { "registry-mirrors": [ "https://kk8u6omk.mirror.aliyuncs.com", "https:

By 樊泽豪
Git Worktree 完全指南:告别分支切换焦虑

Git Worktree 完全指南:告别分支切换焦虑

在多个分支间频繁切换,每次都要重新加载环境、重启服务?git worktree 让你同时拥有多个工作目录,互不干扰,效率翻倍。 为什么需要 Worktree? 日常开发中,我们经常面临这样的场景: * 正在 feature 分支开发新功能,突然要紧急修复 hotfix 分支的 Bug * 想同时对比两个分支的代码差异,或者并行跑两个版本的服务 * 每次切换分支,IDE 都要重新索引,编译缓存失效,等待时间漫长 常规的 git checkout 或 git switch 虽然能切换分支,但同一时间只能在一个分支上工作。如果你切走再切回来,之前的环境(如依赖安装、编译产物)可能已经丢失或需要重建。 git worktree 的解决方案:在同一个 Git 仓库中,创建多个独立的工作目录,每个目录对应不同的分支,它们共享同一个 .git 对象库(

By 樊泽豪