Prhub

#6871 [doc] fix: stop sidebar from scrolling in sync with main content

原始 PR 作者 javidmz 合并时间 2026-06-29 16:56 文件变更 1 提交数 1 评论 1 代码增减 +12 / -0

执行摘要

修复 Sphinx 文档侧边栏与主内容同步滚动问题

PR 描述指出:当前文档布局中,在主内容区域滚动会导致侧边栏菜单同步上下滚动。修改后,侧边栏菜单仅在用户鼠标悬停在侧边栏上时才滚动,提升了文档浏览体验。

该 PR 为轻量级前端修复,值得关注的是其利用 Sphinx 内置对象修改行为的方式,可作文档定制参考。实现简单、风险低,建议合入。

讨论亮点

Review 评论(来自 gemini-code-assist[bot]):指出 this.winPosition = this.win.scrollTop() 是冗余且不安全的,因为将 winScroll 设为 false 后,更新循环不会执行,winPosition 未被使用;且 this.win 可能未初始化导致报错。建议简化函数仅设置 winScroll = false

决策:该评论未被采纳(PR 已合并),可能因为原始实现保留了位置记录以备后续扩展,或者开发人员认为该风险实际可忽略。

实现拆解

  1. 确定 hook 点:利用 Sphinx 内置的 SphinxRtdTheme.Navigation 对象,该对象负责主题的导航与滚动同步逻辑。
  2. 覆写 onScroll 回调:在 DOMContentLoaded 事件中添加新监听器,获取 window.SphinxRtdTheme.Navigation 实例,并将其 onScroll 方法替换为一个空操作(仅设置 winScroll = false 并记录滚动位置),使默认的滚动同步失效。
  3. 保留原有逻辑:原有用于修复导航点击的 MutationObserver 代码保持不变,确保导航链接功能正常。
文件 模块 状态 重要度
docs/_static/js/resizable-sidebar.js 文档 modified 5.12

关键符号

nav.onScroll

关键源码片段

docs/_static/js/resizable-sidebar.js core-logic

唯一变更文件,通过覆写 Sphinx RTD 主题的 `Navigation.onScroll` 方法禁用主内容滚动对侧边栏的影响。

// file: docs/_static/js/resizable-sidebar.js ( 新增片段 )// the sidebar will be scrolled when the cursor is hovered over it
document.addEventListener('DOMContentLoaded', function() {
    // 获取 Sphinx RTD 主题的 Navigation 实例
    const nav = window.SphinxRtdTheme && window.SphinxRtdTheme.Navigation;    // 如果主题未加载,直接返回,不进行任何操作
    if (!nav) return;    // 覆写 onScroll 方法,使其仅标记滚动状态而不触发侧边栏位置更新
    // 关键:将 winScroll 设为 false 可阻止 onFrame 循环中的侧边栏同步逻辑
    nav.onScroll = function() {
        this.winScroll = false;
        this.winPosition = this.win.scrollTop(); // 记录滚动位置(保留以备可能的外部使用)
    };
});

评论区精华

winPosition 赋值的冗余性与安全性 正确性

gemini-code-assist[bot] 指出 `this.winPosition = this.win.scrollTop()` 是冗余的(因为 `winScroll=false` 后 `winPosition` 不会被使用),且 `this.win` 可能未初始化导致报错,建议仅保留 `this.winScroll = false`。

结论:PR 未采纳建议,保留原始实现。可能由于 `winPosition` 用于日志或调试,且 `this.win` 在 `Navigation` 实例正常时不会为 undefined。风险较低。 · 未解决(已合入)

风险与影响

低风险。变更仅修改文档前端 JS,不涉及核心训练/推理逻辑。潜在风险:

  1. 若 Sphinx RTD 主题未来版本更改 Navigation 内部 API,此 hack 可能失效。
  2. this.win 引用可能在页面加载顺序异常时未定义(评论已指出),但 window.SphinxRtdTheme.Navigation 存在可确保 this 上下文正确。

影响范围:仅影响通过 Sphinx 构建的文档页面(readthedocs 风格)。所有查看在线文档的开发者都将体验到侧边栏不再随主内容滚动,提升阅读舒适度。
影响程度:小,纯 UI 优化,无功能变化。

文档 UI 修复

关联 Issue

未识别关联 Issue

当前没有检测到明确关联的 Issue 链接,后续同步到相关引用后会出现在这里。

完整报告

参与讨论