【现代 CSS】标准滚动条控制规范 scrollbar-color 和 scrollbar-width

css,scrollbar,color,width · 浏览次数 : 0

小编点评

本文介绍了 Chrome 121 版本起原生支持的滚动条样式相关属性:scrollbar-color 和 scrollbar-width。这两个属性分别用于设置滚动条的颜色和粗细,以提高网站的兼容性和用户体验。 1. scrollbar-color 属性用于设置滚动条的颜色。它允许为轨道和滑块设置两个不同的颜色值。在 Chrome 121 版本之前,使用非标准的 ::-webkit-scrollbar 规范来控制滚动条样式。然而,自规范发布以来,它的支持和实现并不稳定。因此,建议使用最新的 standard 属性。 2. scrollbar-width 属性用于设置滚动条的粗细。然而,在 CSS Scrollbars Styling Module Level 1 第一阶段规范中,这个属性的功能较弱。它仅接受三个关键字:auto、thin 和 none,不能分别设置滑块和轨道的宽度。目前,大多数浏览器的用户代理并不支持这两个关键字。 总的来说,虽然这两个滚动条样式属性在功能和实现上还不够完善,但它们代表了向更标准化滚动条样式迈进的一步。开发者可以根据实际需求考虑使用这些属性,以提高网站的可访问性和美观性。

正文

Chrome 在 121 版本开始,原生支持了两个滚动条样式相关的样式 scrollbar-color 和 scrollbar-width。

要知道,在此前,虽然有 ::-webkit-scrollbar 规范可以控制滚动条,可是,::-webkit-scrollbar 是非标准特性,在 MDN 文档中都明确了不应该在生产环境使用它。

MDN - ::-webkit-scrollbar
Non-standard: This feature is non-standard and is not on a standards track. Do not use it on production sites facing the Web: it will not work for every user. There may also be large incompatibilities between implementations and the behavior may change in the future.

scrollbar-colorscrollbar-width 是官方标准,在 CSS Scrollbars Styling Module Level 1 规范中被提出。

本文,我们就将一起学习看看这两个属性的使用。

scrollbar-color 设置滚动条颜色

顾名思义,scrollbar-color 就是用于设置滚动条颜色的。

不过有意思的是,一个完整的滚动条,其实是有多个小组件组成的,所以能设置的颜色其实也有很多。

以非标准规范 ::-webkit-scrollbar 为例,它将滚动条拆分成了这么多个部分:

当然,新规范没有这么复杂,我们简化上述的图,可以得到这么一张图:

scrollbar-color 能够设置的,正是上图中的 track 和 thumb 的颜色:

  • 轨道(track)是指滚动条,其一般是固定的而不管滚动位置的背景。
  • 滑块(thumb)是指滚动条通常漂浮在轨道的顶部上的移动部分。

简单举个例子:

<div class="scroll-box">
  <p>
    Lorem ipsum dolor sit amet consectetur adipisicing elit. Reiciendis quaerat ipsam fugit fugiat cupiditate asperiores neque libero natus atque, suscipit error esse inventore numquam molestiae quas laborum eius debitis cum?
    Lorem ipsum dolor sit amet consectetur adipisicing elit. Reiciendis quaerat ipsam fugit fugiat cupiditate asperiores neque libero natus atque, suscipit error esse inventore numquam molestiae quas laborum eius debitis cum?
    ...
  </p>
</div>
.scroll-box {
    border: 1px solid #666;
    overflow: scroll;    
}

正常而言,当 <p> 标签内的内容足够多,溢出到开始滚动,则滚动条样式为:

此时,我们可以通过 scrollbar-color 设置滚动条的轨道颜色和滑块颜色:

.scroll-box {
    border: 1px solid #666;
    overflow: scroll;    
    scrollbar-color: #fff #000;
    // OR
    scrollbar-color: #000 #fff;
}

则,样式表现如下:

看图就非常好理解了,简单而言 scrollbar-color: #000 #fff,需要设置两个颜色,将第一种颜色应用于滚动条滑块,第二种颜色应用于滚动条轨道。

当然,上图是在 Windows 操作系统下的样式表现,我再补充一张在 macOS/iOS 操作系统下的样式表现效果:

由于 macOS/iOS 操作系统默认情况下,即便容器内是可滚动的,也不会显示滚动条,上述效果都是在 Hover 状态或者滚动状态下的效果。

并且,值得注意的是,大家可以发现,macOS/iOS 操作系统下滚动条轨道是透明的,无法被设置颜色,只能设置滚动条滑块的颜色

完整的 DEMO,你可以戳这里:CodePen Demo -- Scrollbar-color Demo

当然,值得注意的是。很多人看中文版的 MDN 文档(2024-04-06),会看到除了直接设置两个颜色值,以及上面的 auto 关键字,规范还提供了 lightdark 关键字:

{
  /* Keyword values */
  scrollbar-color: auto;
  scrollbar-color: dark;
  scrollbar-color: light;
}

在我实测过后,发现实际没有任何浏览器(用户代理)目前支持 lightdark 关键字。

中文文档存在一定的滞后性,还是推荐大家直接看英文文档:

scrollbar-width设置滚动条粗细

了解完 scrollbar-color 后,我们再来看看 scrollbar-width。这个从名字也很好理解,设置滚动条的宽度。

那是否和我们想象的一样,可以任意设置滚动条的宽度,甚至乎,可以定制化的设置滑块和轨道的宽度?

遗憾的是,在 CSS Scrollbars Styling Module Level 1 一期滚动条规范中,这个属性的功能被设置的非常弱。

不要说分别设置滑块和轨道的宽度,scrollbar-width 目前甚至不支持接受一个宽度数值。

什么意思呢?也就是,当前 scrollbar-width 只接收 3 个关键字:

{
  /* Keyword values */
  scrollbar-width: auto;
  scrollbar-width: thin;
  scrollbar-width: none;
}
  • scrollbar-width: auto:系统默认的滚动条宽度。
  • scrollbar-width: thin:系统提供的瘦滚动条宽度,或者比默认滚动条宽度更窄的宽度
  • scrollbar-width: none:不显示滚动条,但是该元素依然可以滚动

简单示意图如下:

完整的 DEMO,你可以戳这里:CodePen Demo -- Scrollbar-width Demo

总结一下

可以看到,其实就目前 scrollbar-width 而言,其能力还是属于比较鸡肋的。相对正常的样式,仅仅多了一种瘦版样式选择以及提供了无滚动条模式。

当然,整个 scrollbar-colorscrollbar-width 相较于非标准的 ::-webkit-scrollbar 规范已经是非常大的一步跨越。只是其功能的丰富性和全面性还需要等待。

最后

好了,本文到此结束,希望对你有帮助 😃

更多精彩 CSS 技术文章汇总在我的 Github -- iCSS ,持续更新,欢迎点个 star 订阅收藏。

如果还有什么疑问或者建议,可以多多交流,原创文章,文笔有限,才疏学浅,文中若有不正之处,万望告知。

参考链接

与【现代 CSS】标准滚动条控制规范 scrollbar-color 和 scrollbar-width相似的内容:

【现代 CSS】标准滚动条控制规范 scrollbar-color 和 scrollbar-width

Chrome 在 121 版本开始,原生支持了两个滚动条样式相关的样式 scrollbar-color 和 scrollbar-width。 要知道,在此前,虽然有 ::-webkit-scrollbar 规范可以控制滚动条,可是,::-webkit-scrollbar 是非标准特性,在 MDN 文

原生CSS嵌套简介

> 嵌套是使用Sass等CSS预处理器的核心原因之一。现在,该功能已经以类似的语法出现在标准浏览器CSS中。你能否在构建系统时放弃对预处理器的依赖? CSS嵌套可以节省输入时间,并使语法更易于阅读和维护。迄今为止,你必须像这样键入完整的选择器路径: ```css .parent1 .child1,

如何正确使用:has和:nth-last-child

我们可以用CSS检查,以了解一组元素的数量是否小于或等于一个数字。例如,一个拥有三个或更多子项的`grid`。你可能会想,为什么需要这样做呢?在某些情况下,一个组件或一个布局可能会根据子元素的数量而改变。 这在CSS中已经存在很多年了,但现在通过CSS `:has`,它变得更加强大。我们可以把`nt

Typora markdown 满屏显示,去除两边的留白

Typora 宽度在CSS样式文件中有个 max-width 值,现在的显示器分辨率比较高,会导致编辑器两边留白比较多 导致文档编辑时,高分辨率的显示器,得不到充分利用

[译]这几个CSS小技巧,你知道吗?

# 前言 在网页设计和前端开发中,CSS属性是非常重要的一部分。掌握常用的CSS属性不仅可以使你的网页看起来更美观,还能提升用户体验,今天小编为大家介绍8个常见的CSS小技巧: # 1.修改滚动条样式 下图是我们常见的滚动条,现在需要改变滚动条的宽度和颜色了,并把它画的圆一点。 ![](https:

千姿百态,瞬息万变,Win11系统NeoVim打造全能/全栈编辑器(前端/Css/Js/Vue/Golang/Ruby/ChatGpt)

我曾经多次向人推荐Vim,其热情程度有些类似现在卖保险的,有的时候,人们会因为一些弥足珍贵的美好暗暗渴望一个巨大的负面,比如因为想重温手动挡的快乐而渴望买下一辆二十万公里的老爷车,比如因为所谓完美的音质而舍不得一个老旧的有线耳机,比如因为一个铜炉火锅而期待北京那漫长而寒冷的冬天。

新知识get,vue3是如何实现在style中使用响应式变量?

前言 vue2的时候想必大家有遇到需要在style模块中访问script模块中的响应式变量,为此我们不得不使用css变量去实现。现在vue3已经内置了这个功能啦,可以在style中使用v-bind指令绑定script模块中的响应式变量,这篇文章我们来讲讲vue是如何实现在style中使用script

iOS开发基础133-崩溃预防

现代移动应用的用户体验依赖于其稳定性和可靠性。然而,在开发过程中,我们时常会遇到各种崩溃问题。崩溃不仅会影响用户的使用体验,还可能损害应用的声誉。因此,本文将详细介绍一个名为CrashPrevention的工具类,它能够为iOS开发者提供多方面的崩溃预防措施,借助该工具类,开发者能够有效减少崩溃的发

将传统应用带入浏览器的开源先锋「GitHub 热点速览」

现代浏览器已经不再是简单的浏览网页的工具,其潜能正在通过技术不断地被挖掘和扩展。得益于 WebAssembly 等技术的出现,让浏览器能够以接近原生的速度执行非 JavaScript 语言编写的程序,从而打开了浏览器的“潘多拉魔盒”。

基于助听器开发的一种高效的语音增强神经网络

现代语音增强算法利用大量递归神经网络(RNNs)实现了显著的噪声抑制。然而,大型RNN限制了助听器硬件(hearing aid hardware,HW)的实际部署,这些硬件是电池供电的,运行在资源受限的微控制器单元(microcontroller units,MCU)上,内存和计算能力有限。在这项工