可滚动区域的样式

Avatar of Chris Coyier
Chris Coyier

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

浏览器窗口上的滚动条不是由网站本身,甚至通常不是由浏览器设置样式的。它们来自操作系统本身。

定制这些滚动条样式的需求很强烈。在刚开始时,感觉就像你应该能够使用 CSS 来做到这一点。如果搜索有关更改/自定义滚动条的 CSS,问题会变得更加复杂,你可能会找到它。问题在于,在 IE 5.5 中,存在专有的浏览器扩展程序,可以使用诸如“scrollbar-face-color”之类的属性来更改滚动条的外观。IE 5.5 已经很久远了,允许在 CSS 中进行这种控制的概念也随之消失了。

不过,在某些情况下,你强烈希望能够控制滚动条的外观。例如,当滚动条不是针对整个浏览器窗口时。页面上有一个小部分需要控制其高度,但包含的内容超出了容器。你可以将该容器的溢出设置为“auto”,并获得默认的滚动条。根据网站的设计,此滚动条可能看起来很笨拙,根本不可取。

幸运的是,我们可以利用 JavaScript 的强大功能来解决此问题,并再次完全控制滚动条的设计。基本原理是我们用隐藏的溢出创建一个新元素来包裹可滚动区域,然后我们从内部元素中移除溢出,使其可以根据需要变得足够高。然后我们添加我们自己的滚动条并监视其上的鼠标事件。当我们上下拖动它时,它会调整内部容器的相对顶部值,完美地复制滚动效果。

为了简化操作,我们将使用一个现有的 jQuery 插件:jScrollPane

查看演示 下载文件

 

已测试并在 Fx3、Safari 4、IE 6 中正常工作。Opera 9.52 也可以工作,但在某些情况下会奇怪地触发常规的正文滚动条。

步骤 1:标记

<body>

	<div id="page-wrap">

	<div class="scroll-pane">
 		
	</div>
	
	<img src="images/bottomshadow.png" alt="" class="bottomshadow" />
	
	</div>

</body>

我们在这里拥有 pagewrap 的唯一原因是我们正在居中我们的可滚动区域。由于插件会将该 div(带有“scroll-pane”类)包装到另一个 div 中,因此我们应用于它的任何居中操作只会将其居中到该新包装中,而不是主体本身。因此,与其弄乱它,我们只需将其再次包装在 page-wrap 中以进行基本定位和居中。我们还可以将相对定位应用于该包装,这将允许我们将阴影图形放置在其中并将其绝对定位在我们想要放置在底部的任何位置。

步骤 2:CSS

*					{ margin: 0; padding: 0; }
body				{ font-size: 12px; line-height: 30px; font-family: Georgia, serif; 
					  background: url(../images/clown.jpg) top left no-repeat #fbfbfb; }

#page-wrap			{ width: 244px; margin: 50px auto; position: relative; }

.scroll-pane 		{ width: 234px; overflow: auto; padding-right: 10px; height: 400px; }

.bottomshadow 		{ position: absolute; top: 375px; left: -47px; z-index: 9999; }

.jScrollPaneContainer 	{ position: relative; overflow: hidden; z-index: 1; }

.jScrollPaneTrack 		{ position: absolute; cursor: pointer; right: 0; top: 0; height: 100%;
						  background: url(../images/bar.jpg) top center repeat-y; padding: 3px; }

.jScrollPaneDrag	{ position: absolute; background: url(../images/ball.png) center center no-repeat;
					  cursor: pointer; overflow: hidden; }

我们已经在这里介绍了大部分理论。值得关注的是 jScrollPaneTrack 和 jScrollPaneDrag。在这里,你可以控制滚动条和滚动句柄的外观。我将一条相当参差不齐的线用作轨道,并将一个小小的参差不齐的球体用作手柄。

步骤 3:激活 JavaScript

这里典型的插件激活。在页面上包含 jQuery,然后是插件,然后使用所需的参数调用插件的新函数。在我们的例子中,球体宽度为 12px,因此在调用函数时需要指定它。这就是此函数的工作方式。

<script type="text/javascript" src="js/jquery-1.2.6.min.js"></script>
<script type="text/javascript" src="js/jScrollPane.js"></script>
<script type="text/javascript">
	$(function(){
		$('.scroll-pane').jScrollPane({
			scrollbarWidth: 12
		});
	});
</script>

步骤 4:考虑可用性和可访问性

以这种方式移除标准滚动条时,会从用户那里移除一致性和约定。人们对滚动条之类的用户界面约定非常习惯,以至于他们可能会忽略你自定义的滚动条,甚至无法将其识别为滚动条。这显然是一个问题。如果你希望人们实际使用你的滚动条,你应该确保你的滚动条看起来像一个滚动条(本文中的示例在这方面可以得到极大的改进)。我当然不崇拜 Jakob Nielsen(尤其是他糟糕透顶的网站),但他有一篇关于滚动条标准的非常好的文章,以及自定义滚动条在哪些方面有效,哪些方面无效。

还要注意,标准滚动条具有一些内置的可访问性功能,而你的新自定义滚动条则没有。总体而言,这种插件方法很可靠。如果 JavaScript 关闭,你将只获得常规滚动条。如果 CSS 关闭,你将能够正常看到所有内容。如果两者都打开,你将获得你漂亮的滚动条,但你将无法使用传统方法(例如鼠标上的滚轮)向下滚动该区域。

在采用自定义方法之前,请务必考虑所有这些因素。我认为在许多设计情况下,操作系统标准的滚动条可能会破坏设计,因此自定义方法可能是正确的选择。