滚动条样式修改

article/2025/10/31 6:12:32

前言

浏览器中的滚动条样式大家一定都不陌生,其样式并不好康。可能很多小伙伴还不知道,这个东东的样式也可以修改(仅支持部分现代浏览器),本次就来带大家用 CSS 修改一下它的样式。

一、认识滚动条

首先我们先来简单看一下滚动条是由哪几部分组成的:

滚动条的组成.png

当横向和纵向都有滚动条时,还会有一个交汇的部分(见下图),但是因为一般网页开发中都不会让横向出现滚动条(因为影响美观),所以这个小方块出现的频率不算太高。下图为同时有垂直滚动条和水平滚动条时交汇的部分:

当同时有垂直滚动条和水平滚动条时交汇的部分.png

二、解决方案

1. CSS伪类

目前我们可以通过 CSS伪类 来实现滚动条的样式修改,以下为修改滚动条样式用到的CSS伪类:

  • ::-webkit-scrollbar — 整个滚动条
  • ::-webkit-scrollbar-button — 滚动条上的按钮 (上下箭头)
  • ::-webkit-scrollbar-thumb — 滚动条上的滚动滑块
  • ::-webkit-scrollbar-track — 滚动条轨道
  • ::-webkit-scrollbar-track-piece — 滚动条没有滑块的轨道部分
  • ::-webkit-scrollbar-corner — 当同时有垂直滚动条和水平滚动条时交汇的部分
  • ::-webkit-resizer — 某些元素的corner部分的部分样式(例:textarea的可拖动按钮)

此处附上MDN文档传送门:https://developer.mozilla.org/zh-CN/docs/Web/CSS/::-webkit-scrollbar

2. 兼容性问题

当然这种解决方案还存在一定的兼容性问题,仅仅在支持WebKit的浏览器 (例如, 谷歌Chrome, 苹果Safari)可以使用。其实一看到 -webkit- 前缀就能明白它是 CSS3 中的 私有属性前缀 ,特定前缀是为了适配特定浏览器内核的。我们前往Can I use对其兼容性一探究竟:

“::-webkit-scrollbar”属性兼容性.png

由上图我们可以看到,兼容性并不算太好,不过我们也不用过于在意,毕竟我们只是规则的使用者而非制定者。

三、进行测试

1. 整个滚动条

我们一条属性一条属性来进行测试,首先使用 ::-webkit-scrollbar 。先改变一下它的宽度,测试一下效果:

/* 整个滚动条 */
/* 宽高分别对应纵向滚动条和横向滚动条的宽度 */
::-webkit-scrollbar {width: 50px;
}

滚动条样式修改测试-1.gif

我们可以看到,滚动条似乎“消失”了,但是仍然能靠鼠标拖动来滚动页面。我们再给它加一个背景色康康效果:

/* 整个滚动条 */
::-webkit-scrollbar {width: 50px;background-color: skyblue;
}

滚动条样式修改测试-2.png

增加背景颜色后,滚动条又“出现”了。结合刚才的代码我们不难看出:设置 ::-webkit-scrollbar 属性会使滚动条默认样式失效。既然如此,我们就必须结合其他属性一起使用。

2. 滚动条上的箭头按钮

我们来使用一下 ::-webkit-scrollbar-button 属性,发现当此属性单独使用时无任何效果:

/* 滚动条上的箭头按钮 */
::-webkit-scrollbar-button {background-color: slateblue;
}

滚动条样式修改测试-3.png

于是乎我们加上之前的代码再试试:

滚动条样式修改测试-4.png

我们可以看出,两个箭头的按钮位置的背景颜色发生了变化。看来,滚动条的其他伪类属性需要配合第一步中的 ::-webkit-scrollbar 才能生效。

3. 滚动条上的滚动滑块

我们用 ::-webkit-scrollbar-thumb 来改变滚动条中滑块的样式:

/* 整个滚动条 */
::-webkit-scrollbar {width: 50px;background-color: skyblue;
}/* 滚动条上的滚动滑块 */
::-webkit-scrollbar-thumb {background-color: orange;
}

滚动条样式修改测试-5.gif

4. 滚动条轨道

::-webkit-scrollbar-track 属性修改滚动条轨道样式:

/* 整个滚动条 */
::-webkit-scrollbar {width: 50px;background-color: skyblue;
}/* 滚动条上的滚动滑块 */
::-webkit-scrollbar-thumb {background-color: orange;
}/* 滚动条轨道 */
::-webkit-scrollbar-track {background-color: hotpink;
}

滚动条样式修改测试-6.png

通过效果图我们可以发现,设置的滚动条轨道背景色遮住了设置的整个滚动条的背景色(天蓝)。那是否可以实现两种背景色里外嵌套的效果呢,目前做出了几种尝试都没有效果,只能暂时放弃,以下为经测试未实现嵌套背景色效果代码:

/* 未实现背景色嵌套效果代码 */
::-webkit-scrollbar {/* 无法通过 padding 实现 */padding: 4px;width: 50px;background-color: skyblue;box-sizing: border-box;
}::-webkit-scrollbar-track {/* 无法通过调整宽度实现 */width: 80%;background-color: hotpink;
}

既然如此,我们如果需要调整滚动条的背景颜色,只需要在 ::-webkit-scrollbar::-webkit-scrollbar-track 中任选其一即可。

5. 滚动条没有滑块的轨道部分

这次我们同时设置 ::-webkit-scrollbar-track::-webkit-scrollbar-track-piece 来看效果:

/* 整个滚动条 */
::-webkit-scrollbar {width: 50px;
}/* 滚动条上的滚动滑块 */
::-webkit-scrollbar-thumb {background-color: orange;
}/* 滚动条轨道 */
::-webkit-scrollbar-track {background-color: hotpink;
}/* 滚动条没有滑块的轨道部分 */
::-webkit-scrollbar-track-piece {background-color: purple;
}

滚动条样式修改测试-7.png

上述代码符合预期效果,但是我给滑块设置透明的背景色(transparent)则会全是 purple 颜色,也不会出现滑块底部呈现 pink 颜色。所以,如果要改背景色还是选择轨道来修改吧。

6. 测试总结

  1. 设置 ::-webkit-scrollbar 属性会使滚动条默认样式失效
  2. 其他修改滚动条样式的私有属性需要配合 ::-webkit-scrollbar 属性使用
  3. 如果要设置滚动条背景色, ::-webkit-scrollbar::-webkit-scrollbar-track::-webkit-scrollbar-track-piece 三个属性设置一个即可。

四、开始换装

1. 纯色系滚动条

在研究过滚动条修改的 CSS 属性后我们终于可以开始动工了,先来仿照Element中的滚动条样式,修改一个纯色系滚动条:

/* 整个滚动条 */
::-webkit-scrollbar {/* 对应纵向滚动条的宽度 */width: 10px;/* 对应横向滚动条的宽度 */height: 10px;
}/* 滚动条上的滚动滑块 */
::-webkit-scrollbar-thumb {background-color: #49b1f5;border-radius: 32px;
}/* 滚动条轨道 */
::-webkit-scrollbar-track {background-color: #dbeffd;border-radius: 32px;
}

滚动条样式修改测试-8.gif

效果还不错,比默认的样式要好上不少。此处使用蓝色,实际开发中可以使用项目的主题色作为滚动条的配色参考。

2. 花纹系滚动条

我们可以利用 background-image 这一属性来实现滚动条的花纹效果(此处效果非本人原创),直接上代码:

/* 整个滚动条 */
::-webkit-scrollbar {width: 10px;height: 10px;
}/* 滚动条上的滚动滑块 */
::-webkit-scrollbar-thumb {background-color: #49b1f5;/* 关键代码 */background-image: -webkit-linear-gradient(45deg,rgba(255, 255, 255, 0.4) 25%,transparent 25%,transparent 50%,rgba(255, 255, 255, 0.4) 50%,rgba(255, 255, 255, 0.4) 75%,transparent 75%,transparent);border-radius: 32px;
}/* 滚动条轨道 */
::-webkit-scrollbar-track {background-color: #dbeffd;border-radius: 32px;
}

滚动条样式修改测试-9.gif

感觉效果棒棒哒(前提是喜欢花里胡哨的人),心动不如行动,赶紧Copy下来备用吧!

参考资料

  • https://developer.mozilla.org/zh-CN/docs/Web/CSS/::-webkit-scrollbar

http://chatgpt.dhexx.cn/article/qumVYxv1.shtml

相关文章

Java中compareTo()方法比较字符串详解

中心:String 是字符串,它的比较用compareTo方法,它从第一位开始比较, 如果遇到不同的字符,则马上返回这两个字符的ascii值差值.返回值是int类型 1.当两个比较的字符串是英文且长度不等时, 1)长度短的与长度长的字符一样,则返回的…

Comparable Comparator的区别

Comparable & Comparator接口都可以用来实现集合中元素的比较、排序,Comparator位于包java.util下, Comparable位于包java.lang下 Comparable接口将比较代码嵌入自身类中 Comparator在一个独立的类中实现比较。 像Integer、String等这些基本类型的JA…

Comparable接口和compareTo()函数

Comparable Comparable可以认为是一个内比较器,实现了Comparable接口的类有一个特点,就是这些类是可以和自己比较的,至于具体和另一个实现了Comparable接口的类如何比较,则依赖compareTo方法的实现,compareTo方法也被…

Compareable接口的compareTo方法详解

Compareable接口可以实现类中成员属性的排序方法。通过重写Compareable接口中的CompareTo方法实现自定义规则的排序。 针对Compareable接口的排序方式,将通过对学生类和测试类进行一个代码演示 一般情况下 一般情况下Compareable接口是实现自然排序,即依照对象的添加顺序进行…

关于比较CompareTo的用法

CompareTo的比较原理: 先读取出字符串的第一个“字母”进行比较,比较的方法是ascii码表的值(字符所对应的十进制值),如果前面的大那么返回1,后面的大返回-1;此位置相同,继续比较下一…

Java compare方法和compareTo方法

1.compare 对于 public int compare(Object arg0, Object arg1)的理解 //数组排序 String[] str new String[5]; Arrays.sort(str, new Comparator<String>() {Overridepublic int compare(String o1, String o2) {// TODO Auto-generated method stubreturn 0;} }); …

compareTo比较大小

public class TestInteger {public static void main(String[] args){//比较大小Integer i1new Integer(3);Integer i2new Integer(5);System.out.println(i1.compareTo(i2));} }因为i1<i2&#xff0c;所以输出的是-1&#xff1b; compareTo() 方法用于将 Number 对象与方法…

Java之比较CompareTo的用法

CompareTo的比较原理&#xff1a; 先读取出字符串的第一个“字母”进行比较&#xff0c;比较的方法是ascii码表的值&#xff08;字符所对应的十进制值&#xff09;&#xff0c;如果前面的大那么返回1&#xff0c;后面的大返回-1&#xff1b;此位置相同&#xff0c;继续比较下一…

MFC修改AfxMessageBox对话框标题

AfxMessageBox的对话框标题默认为项目工程的名字&#xff0c;对话框一般是为了给用户提示相关信息&#xff0c;而软件名字一般都与项目工程名不一样&#xff0c;例如软件可能是中文名。 1. 在资源视图&#xff0c;在String Table没有AFX_IDS_APP_TITLE 2. 添加字符串“AFX_IDS…

VS mfc MessageBox() 和 AfxMessageBox()

转载&#xff1a;http://blog.csdn.net/phenixyf/article/details/41744039 一、MessageBox()用法 1、函数原型 Messagebox函数在Win32 API和MFC里的定义有区别。 Win32 API的定义如下&#xff1a; [cpp] view plain copy int WINAPI MessageBox( HWND hWnd, // h…

修改MFC中AfxMessageBox()函数的对话框标题

修改MFC中AfxMessageBox()函数的对话框标题 如何在MFC中修改AfxMessageBox()函数所弹出的对话框标题&#xff0c;步骤如下&#xff1a; 1.找到项目工程的资源视图&#xff0c;打开.rc资源文件下的String Table资源&#xff1b; 2.在String Table资源找到ID号为AFX_IDS_APP_T…

AfxMessageBox的常见应用

新建一个基于对话框的MFC应用程序AfxMessageBoxTest&#xff0c;删除对话框中原有控件。添加3个按钮&#xff0c;为每个按钮添加一些文字&#xff0c;如下图&#xff1a; 从上到下&#xff0c;依次为每个按钮添加事件函数&#xff0c;第一个按钮代码如下&#xff1a; void CA…

MFC 修改AfxMessageBox默认标题

双击新建的字符串ID&#xff0c;改为**AFX_IDS_APP_TITLE**&#xff1a; 修改标题为“温馨提示”

AfxMessageBox与MessageBox函数

创建消息提示对话框&#xff1a; 前者调用的是MFC的底层函数库&#xff0c;后者调用的是最为基本的Win32 API。 MessageBox()的函数原型如下&#xff1a; int MessageBox(LPCTSTR lpszText,LPCTSTR lpszCaption NULL,UINT nType MB_OK );参数说明&#xff1a; lpszText&am…

AfxMessageBox和MessageBox的用法

目录 一、AfxMessageBox 1. 函数定义原型 3. 返回值 二、MessageBox 1. 定义 ​2. 参数介绍 三、 AfxMessageBox和MessageBox的区别 1. 区别一 2. 区别二 3. 区别三 一、AfxMessageBox AfxMessageBox是一种函数原型&#xff0c;特点是应用程序的可执行文件&#xff…

AfxMessageBox 自定义封装

一般情况下AfxMessageBox是系统提供的一个对话框&#xff0c;若要做这种效果的&#xff0c;必须重写。 实例1&#xff1a; void test_SgxMemDialog_AutoSize() { //使用给定大小的对话框 CSgxMemDialog dlg(180, 60); dlg.SetWindowTitle(_T(" SegeX - CT&qu…

AfxMessageBox()函数消息框按钮和图标

消息框中显示的按钮 CString str1;str1.Format(_T("MB_ABORTRETRYIGNORE"), height, width);//消息框包含三个按钮&#xff1a;Abort&#xff0c;Retry和IgnoreAfxMessageBox(str1, MB_ABORTRETRYIGNORE | MB_ICONINFORMATION, 0);CString str2;str2.Format(_T(&quo…

VC中MessageBox与AfxMessageBox用法与区别

一、MessageBox()用法 1、函数原型 Messagebox函数在Win32 API和MFC里的定义有区别。 Win32 API的定义如下&#xff1a; int WINAPI MessageBox(HWND hWnd, // handle of owner windowLPCTSTR lpText, // address of text in message boxLPCTSTR lpCaption, //…

MFC:AfxMessageBox函数随记

函数原型 函数原型1 int AfxMessageBox( LPCTSTR lpszText, UINT nType MB_OK, UINT nIDHelp 0 );lpszText:弹窗内容 nType &#xff1a;弹窗类型和按钮类型进行或&#xff0c;比如询问框等 函数原型2 int AFXAPI AfxMessageBox( UINT nIDPrompt, UINT nType MB_OK, UIN…

MFC之MessageBox、AfxMessageBox用法

在软件中我们经常会弹出个小窗口,给一点点提示.这就会用到消息对话框.在Win32 API程序中只有MessageBox这一种用法. 而在MFC中就有三各方法: 1.调用API中的MessageBox&#xff1b; 2.调用CWnd的成员函数MessageBox&#xff1b; 3.调用全局函数AfxMessageBox&#xff1b; M…