dsh-plugin-rightbar-divider:修复 DSH 右侧边栏分割线拖拽

前言

DSH 的右侧边栏默认有拖拽手柄。在浏览器对整个界面进行缩放后,该手柄会失效:它仍然渲染在 DOM 中,但位置基于视口宽度而非布局像素,导致在 zoom: 1.2 时它停在分割线内侧约 320px 处,无法再拖拽。

这个问题在需要缩放界面的场景下会显著影响操作体验。下面介绍一个修复方案。

是什么

dsh-plugin-rightbar-divider 是一个 DSH 插件,用于修复右侧边栏分割线拖拽在缩放后失效的问题。它由 1700563146 维护,通过以下方式恢复功能并改善交互:

  • 使用 offsetLeft 测量面板的左侧边缘(布局像素),不受缩放和滑动变换影响,通过 CSS 变量将手柄位置校正到边缘;
  • 将点击区域从 8px 扩展到 12px,并在分割线两侧绘制 2px 的悬停/拖拽指示线;
  • 保持宽度限制、持久化行为和拖拽逻辑由宿主 setRightbar 统一处理。

在 100% 缩放下,它主要表现为更宽的点击区域与悬停反馈。

安装与启用

通过 DSH 插件市场或 npm 安装:

dsh plugin --profile desktop add dsh-plugin-rightbar-divider

安装后,打开 Plugins → Add plugin 安装 dsh-plugin-rightbar-divider,或在应用内的插件页面安装。打开右侧边栏,将鼠标悬停在聊天与侧边栏之间的分割线上:光标变为 col-resize,并出现细线。

核心原理

DSH 的 AppFrame 定位两个手柄的方式如下:

{ side: 'sidebar',  left: cols.sidebar }
{ side: 'rightbar', left: viewport - normal.rightbar }

其中 viewport 来自 frame.getBoundingClientRect().width(视口像素),而 left 为布局像素。在 html { zoom } 下两者不一致:左侧手柄使用布局像素保持对齐,右侧手柄则偏离 viewport × (zoom − 1)。该插件通过测量布局像素边缘并重写位置来纠正这一偏移。

已知限制

  • 依赖宿主的私有属性([data-side="rightbar"]、[data-rightbar-col]、[data-sidebar-right-open])。若 DSH 未来重命名这些属性,插件将静默失效,而不是破坏布局。
  • 在缩放下,宿主仍会根据视口指针差值改变宽度,因此拖拽速度略快于光标移动(例如 120% 缩放时每 100px 光标移动对应 120px 宽度变化)。插件不接管指针事件。
  • 全屏面板按设计没有外部宽度手柄,不进行额外处理。

验证

项目包含测试脚本,通过 node test.mjs 运行,覆盖布局像素数学、宽度变化时的重新测量、手柄消失时的停用、矩形与缩放回退,以及销毁时的清理。

上游修复建议

在 AppFrame 中使用 frame.offsetWidth / clientWidth 作为 viewportWidth,或从面板的 offsetLeft 推导右侧手柄的 left,即可修复所有依赖 viewportWidth 的几何关系,而不仅限于该手柄。

适用场景与注意事项

  • 适合在 DSH 界面进行缩放后需要恢复右侧边栏分割线拖拽的场景。
  • 插件以当前 DSH 进程权限运行,安装前建议检查源码与许可证(MIT)。

结尾

该插件通过测量布局像素边缘并扩展交互区域,使右侧边栏分割线拖拽在缩放场景下恢复正常。如需更多信息,可访问插件目录页或 GitHub 仓库。

  • 目录页:https://www.skillhub.cn/plugins/1700563146/dsh-plugin-rightbar-divider
  • GitHub:https://github.com/1700563146/dsh-plugin-rightbar-divider
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye