WebKit 中的自定义滚动条

Avatar of Chris Coyier
Chris Coyier

DigitalOcean 为您旅程的每个阶段提供云产品。立即开始使用 200 美元的免费额度!

很久以前,您可以在 IE(例如 v5.5)中使用非标准 CSS 属性(如 scrollbar-base-color)来自定义滚动条,您可以将其用于滚动元素(如 <body>)并执行 非常酷的事情。IE 弃用了该功能。

如今,自定义滚动条又回来了,但这次是 WebKit。现在稍微好一点,因为这些属性带有供应商前缀(例如 ::-webkit-scrollbar)并使用“Shadow DOM”。这已经存在几年了。David Hyatt 在 2009 年初 发布了博文

具体内容

不同的部分

这些是伪元素本身。滚动条的实际部分。

::-webkit-scrollbar              { /* 1 */ }
::-webkit-scrollbar-button       { /* 2 */ }
::-webkit-scrollbar-track        { /* 3 */ }
::-webkit-scrollbar-track-piece  { /* 4 */ }
::-webkit-scrollbar-thumb        { /* 5 */ }
::-webkit-scrollbar-corner       { /* 6 */ }
::-webkit-resizer                { /* 7 */ }

不同的状态

这些是伪类选择器。它们允许更具体地选择部分,例如当滚动条处于不同状态时。

:horizontal
:vertical
:decrement
:increment
:start
:end 
:double-button
:single-button
:no-button
:corner-present
:window-inactive

我将从 David 在 WebKit 博客上的博文 中窃取整个部分,因为它很好地解释了每个部分

:horizontal – 水平伪类应用于任何具有水平方向的滚动条部分。

:vertical – 垂直伪类应用于任何具有垂直方向的滚动条部分。

:decrement – 减量伪类应用于按钮和轨道部分。它指示按钮或轨道部分在使用时是否会减小视图的位置(例如,在垂直滚动条上向上,在水平滚动条上向左)。

:increment – 增量伪类应用于按钮和轨道部分。它指示按钮或轨道部分在使用时是否会增加视图的位置(例如,在垂直滚动条上向下,在水平滚动条上向右)。

:start – 开始伪类应用于按钮和轨道部分。它指示对象是否放置在滑块之前。

:end – 结束伪类应用于按钮和轨道部分。它指示对象是否放置在滑块之后。

:double-button – 双按钮伪类应用于按钮和轨道部分。它用于检测按钮是否属于一对位于滚动条同一端的按钮的一部分。对于轨道部分,它指示轨道部分是否与一对按钮相邻。

:single-button – 单按钮伪类应用于按钮和轨道部分。它用于检测按钮是否单独位于滚动条的末端。对于轨道部分,它指示轨道部分是否与单个按钮相邻。

:no-button – 应用于轨道部分,并指示轨道部分是否延伸到滚动条的边缘,即该端没有按钮。

:corner-present – 应用于所有滚动条部分,并指示是否存在滚动条角。

:window-inactive – 应用于所有滚动条部分,并指示包含滚动条的窗口当前是否处于活动状态。(在最近的 nightly 版本中,此伪类现在也应用于 ::selection。我们计划将其扩展以适用于任何内容,并将其作为新的标准伪类提出。)

现在一起使用

这些伪元素和伪类选择器协同工作。以下是一些随机示例

::-webkit-scrollbar-track-piece:start {
   /* Select the top half (or left half) or scrollbar track individually */
}

::-webkit-scrollbar-thumb:window-inactive {
   /* Select the thumb when the browser window isn't in focus */
}

::-webkit-scrollbar-button:horizontal:decrement:hover {
   /* Select the down or left scroll button when it's being hovered by the mouse */
}

非常简单的示例

要制作一个非常简单的自定义滚动条,我们可以这样做

::-webkit-scrollbar {
    width: 12px;
}
 
::-webkit-scrollbar-track {
    -webkit-box-shadow: inset 0 0 6px rgba(0,0,0,0.3); 
    border-radius: 10px;
}
 
::-webkit-scrollbar-thumb {
    border-radius: 10px;
    -webkit-box-shadow: inset 0 0 6px rgba(0,0,0,0.5); 
}

在这种情况下,我们会在一个带有垂直溢出文本的简单 div 上获得以下内容

在实际应用中

查看 Tim Van Damme 的博客 Maxvoltar 上非常微妙且漂亮的滚动条(**2012 年 9 月更新**:Tim 的网站不再使用此设计)

这里特别棒的一点是,滚动条位于 body 元素上,但滚动条没有像通常那样粘在浏览器窗口的顶部、底部或右侧边缘。我创建了一个测试页面,其中包含可复制粘贴的代码以实现类似的效果

查看演示

Forrst 上,他们在代码片段上使用了自定义滚动条,这些滚动条也非常不错。它们的视觉效果不那么强烈,因此与代码突出显示的冲突较少。

相关内容

  • Dion Almaer 有一个有用的用于滚动条的小型 “调试”页面,其中所有部分都以粗体颜色显示,以便查看各个部分。(来自 这篇文章
  • 类似的文章 发表在 Beautiful Pixels 上。
  • Google Wave 过度使用了它们,当时它还是一个事物。