Windows(Windows)滚动条快捷键有着一段简短演进历史。在早期系统版本中,滚动条仅支持鼠标点击箭头或拖拽滑块来浏览窗口内容,不便键盘操作。随后为辅助无鼠标用户,系统加入了方向键与翻页键控制滚动位置的机制,提升可达性。
正文
在 Windows 的头二十年里,滚动条控件只有几种基本操作。为了方便说明,这里假设是竖直滚动条。鼠标有五个作用区域:两端的箭头按一行滚动,滑块与箭头之间的区域按一页滚动,滑块本身可以拖动到指定位置。

Windows 7 给滚动条加了右键菜单,菜单里有四项对应已有的鼠标操作,两项对应已有的键盘操作,还有一项是全新的。
| 菜单项 | 鼠标 | 键盘 | | --- | --- | --- | | Scroll Here(滚动到此处) | 拖动滑块到某个位置 | | | Top(顶部) | 拖动滑块到起点 | Home | | Bottom(底部) | 拖动滑块到终点 | End | | Page Up(上一页) | 点击上方空白区 | PgUp | | Page Down(下一页) | 点击下方空白区 | PgDn | | Scroll Up(上滚) | 点击上箭头 | ↑ | | Scroll Down(下滚) | 点击下箭头 | ↓ |

有意思的新功能是「滚动到此处」:直接在想滚到的位置点右键,然后选这一项。要滚动很长距离时这方便得多,不用先抓住滑块再一路拖过去,只要顾着目标位置,不必管自己从哪儿出发。
需要跳很远的时候,我用这个右键菜单用得很频繁。
同一时期还加了一个更隐蔽的快捷键:按住 Shift 点击滚动条,滑块会直接跳到点击的位置。
这个快捷键我直到最近才知道,此前一直靠那个值得信赖的右键菜单。
可惜如今几乎没人在用 Win32 滚动条了,大家都用各自框架提供的自定义滚动条。
Electron 以及其他 Web 应用用的是 Chromium 滚动条,它没有实现右键菜单,但至少实现了 Shift+点击。
WPF 的 XAML 框架看来两者都实现了。
WinUI 的 XAML 框架则让人无奈地两者都没有。(至少有人提过需求。)
Qt 框架有多个定制点,所以全看每个应用的开发者:可以用 SH_ScrollBar_ContextMenu 启用右键菜单,用 SH_ScrollBar_LeftClickAbsolutePosition 启用「左键点击跳到某处」,用 SH_ScrollBar_MiddleClickAbsolutePosition 启用「中键点击跳到某处」。
好吧,等我终于知道滚动条有 Shift+点击这个快捷键时,生态已经碎到根本指望不上它能用了。
评论
大多数人对滚动条上那些鲜为人知的交互(Shift+点击定位、右键菜单、拖拽取消)被自定义实现抹掉感到惋惜,认为平台一致性正在崩塌;另一部分人则指出这些行为从来就因平台而异,连微软自己的应用都不遵守,指望统一并不现实。
自定义滚动条既不复刻行为、又砍掉功能,正在毁掉平台一致性
- 框架自制的滚动条常常只是残缺子集:外观可以自定,但行为不该和同类控件不同,至少要做成系统功能的超集而不是阉割版(较多人)
- 细滚动条乃至彻底隐藏滚动条是令人担忧的趋势,Firefox 用户还得靠 about:config 里的开关才能关掉细滚动条(较多人)
- 怀念从前 Windows 各应用 UX 一致的日子,如今连该用什么技术栈开发 Windows 桌面应用都说不清,2007 年前后开始一路混乱(较多人) > 我不介意你给应用自定义外观,我介意的是你的控件行为不像同类控件,至少该是系统功能的超集,而不是残缺的子集。(@bartread)
点击滚动条应当默认「滚动到这里」,翻页已经有键盘快捷键
- 键盘上已有 PageUp/PageDown,但「滚动到这里」没有对应的键盘操作,让鼠标去复刻键盘功能是浪费鼠标独有能力(较多人)
- 这一判断有平台依据:GTK 点击滚动条空白处就是跳转到该位置,Qt 则不是(较多人)
- 反直觉之处在于,很多人直到今天才知道 Shift+点击滚动条等于翻页,有人为此重造了滑块、上下按钮、Home/End 半个轮子(少数人) > 键盘已经有翻页快捷键,可「滚动到这里」没有快捷键,用鼠标重复键盘功能,等于浪费了鼠标独有的能力。(@mrob)
这些隐藏行为从来就不跨平台统一,连微软自己也在丢
- 各平台实测结果杂乱:GTK 下 Shift+点击、右键、中键的语义各不相同,Qt 应用(如 BibleTime)又更接近 Windows,中键在 Firefox 里干脆无效(较多人)
- Shift+点击定位是 Windows 7 才加入的,并非古已有之;讽刺的是 Microsoft Office 自己不实现它,Excel 的滚动条整体都很离谱(较多人)
- 旧版 Windows 中拖动滑块后把鼠标移远会取消滚动并复位,现在行为不一致:记事本不再支持,浏览器还支持(少数人)
- 有人靠「Shift+点击能否定位」来判断程序用的是真 Win32 控件还是自绘控件,因为几乎没几个工具包实现了它(较多人) > 有意思的是连 Raymond Chen 都不知道 Shift+点击,我是乱试 Win32 控件时发现的,后来一直用它判断程序是不是在用真正的系统控件。(@badsectoracula)
重造控件的人根本不知道这些行为,社区需要一份行为编目
- 既然无法指望大家复用同一套实现来获得一致性,至少应该把标准控件里的隐藏行为记录下来,供重新实现者参照(少数人)
- 由此还引申出一条经验:网页里不要自己实现滚动条,各平台行为差异太大,很难甚至根本没法完全对齐(少数人) > 应该有人把标准控件的这类隐藏行为编成目录,让重新实现它们的人有个参照。(@modeless)
有价值的补充
- 右键点击滚动条在部分 Qt 应用里会弹出菜单,包含「滚动到这里 / 顶部 / 底部 / 上一页 / 下一页 / 上滚 / 下滚」,LibreOffice 和 Inkscape 中按住右键还会匀速滚动,前者约每屏 15 秒(6fps),后者约每屏 3 秒且平滑。
- 中键点击在多数场景等同于翻页,但在 Firefox 中是无操作。
- 把「点击滚动条空白处」当成定位而非翻页,是 GTK 与 Qt 之间一个常被忽略的行为分叉点。
- Firefox 提供了 layout.css.scrollbar-width-thin.disabled 这一隐藏开关,用来对抗越来越细的滚动条。