CSS滚动条生成器

下一个

自定义滚动条曾经是一场充斥着厂商前缀伪元素的噩梦。如今,scrollbar-colorscrollbar-width已能在所有现代浏览器中处理常见场景:窄宽度或普通宽度,以及双色(滑块和轨道)主题。若需像素级控制(轨道内边距、滑块圆角、悬停状态),旧版::-webkit-scrollbar伪元素在Chrome和Safari中仍然可用。本生成器会同时输出这两种写法,并正确进行层叠。

如何为滚动条设置样式

  1. 1

    选择宽度

    auto(平台默认宽度)、thin(更窄),或通过webkit规则指定具体的像素值。

  2. 2

    设置滑块和轨道颜色

    现代的`scrollbar-color`接受两种颜色。webkit规则可分别设置颜色、圆角和悬停状态。

  3. 3

    添加悬停效果(可选)

    滑块在悬停时会变亮。通过`::-webkit-scrollbar-thumb:hover`实现。

  4. 4

    确定作用范围

    应用于`html` / `body`(整个页面),或仅应用于某个特定的滚动容器。

  5. 5

    复制CSS

    现代规则与webkit规则相结合:在每个现代浏览器中都能正常运行,并具备优雅的回退。

现代标准属性(2023年及以后)

/* Applies to the element that scrolls */
html {
  scrollbar-width: thin;           /* auto | thin | none */
  scrollbar-color: #4f46e5 #e5e7eb; /* thumb track */
}

浏览器支持(2024年):

  • scrollbar-width:Chrome 121+、Safari 18.2+、Firefox 64+。
  • scrollbar-color:Chrome 121+、Safari 18.2+、Firefox 64+。
  • scrollbar-gutter: stable:Chrome 94+、Safari 14+、Firefox 97+。即使不需要滚动条,也会为其预留空间,防止布局偏移。

webkit伪元素(Chrome、Safari、旧版Edge)

::-webkit-scrollbar {
  width: 10px;
  height: 10px;
}
::-webkit-scrollbar-track {
  background: #e5e7eb;
  border-radius: 10px;
}
::-webkit-scrollbar-thumb {
  background: #4f46e5;
  border-radius: 10px;
}
::-webkit-scrollbar-thumb:hover {
  background: #3730a3;
}

更精细的控制。width设置垂直滚动条的宽度;height设置水平滚动条的高度。对于可双向滚动的容器,请同时添加这两者。

层叠两种方案

先指定现代规则,再将webkit作为增强,用于同时渲染两者的浏览器:

.scroll-area {
  scrollbar-width: thin;
  scrollbar-color: #4f46e5 #e5e7eb;
}
.scroll-area::-webkit-scrollbar       { width: 8px; }
.scroll-area::-webkit-scrollbar-track { background: #e5e7eb; }
.scroll-area::-webkit-scrollbar-thumb {
  background: #4f46e5;
  border-radius: 4px;
  border: 2px solid #e5e7eb;
}

Firefox仅遵循现代的scrollbar-*规则。Chrome和Safari遵循webkit规则(这些规则会覆盖现代规则,因此行为保持一致)。

scrollbar-gutter防止内容偏移

若未预留间隙,当滚动条出现时内容会重新排布(在动态列表中很常见)。解决方法:

html { scrollbar-gutter: stable; }
/* or */
html { scrollbar-gutter: stable both-edges; }

无论内容是否滚动,都会为滚动条预留位置。both-edges会在相对的一侧添加相匹配的间隙,使内容在视觉上保持居中。

完全隐藏滚动条

.no-scrollbar {
  scrollbar-width: none;           /* Firefox */
}
.no-scrollbar::-webkit-scrollbar { display: none; }  /* Chrome, Safari */

请注意:隐藏滚动条会让用户看不到内容可以滚动。仅在配有明确指示(箭头、页面圆点)时使用,或者当滚动行为从上下文中显而易见时使用(如水平轮播、聊天记录)。

移动端注意事项

在iOS和Android上,滚动条仅在滚动时短暂出现。你自定义的滚动条CSS仍会生效,但用户看到它的时间可能不会超过一秒。请据此进行设计,不要在很少出现的视觉细节上投入过多精力。

无障碍性

  • 对比度:滑块相对于轨道,应满足非文本对比度3:1(WCAG 1.4.11)。
  • 宽度:细滚动条用鼠标较难抓取,对运动功能受限的用户尤其如此。普通宽度是更安全的默认值。
  • 切勿移除滚动区域上的滚动条,除非提供其他滚动方式。依赖滚动条的用户否则将无法操作。

常见问题

可以,使用现代的scrollbar-widthscrollbar-color属性即可。Firefox不支持webkit伪元素,因此为了在各浏览器间获得一致的外观,请先使用现代属性,再将webkit规则作为增强添加。

因为默认滚动条会覆盖在内容之上,在需要之前不会预留空间。请在滚动元素上设置scrollbar-gutter: stable,始终预留间隙,从而避免滚动条出现或消失时发生重排。

通常应该隐藏,因为滚动条显得格格不入,并与内容相互干扰。请添加可见的分页圆点或箭头控件,让用户仍然知道内容可以滚动。如果使用滚动吸附(scroll-snapping),请遵循prefers-reduced-motion

有可能。非常细或对比度很低的滚动条,对运动功能受限和视力较弱的用户来说很难使用。请将滚动条宽度保持在至少8–10px以便舒适抓取,并在滑块与轨道之间保持3:1的对比度。

相关工具