滚动条的处理办法

由于系统默认滚动条的样式过于单调,许多时候我们需要自己定义滚动条,这里有几个处理办法:

第一个:通过Scroll,滚动条的样式,这里可以参考文章:

IE下的滚动条样式

IE是最早提供滚动条的样式支持,嗯,好多年了,但是其它浏览器一直没有支持,IE独孤求败了。

这些样式规则很简单:

  • scrollbar-arrow-color: color; /*三角箭头的颜色*/
  • scrollbar-face-color: color; /*立体滚动条的颜色(包括箭头部分的背景色)*/
  • scrollbar-3dlight-color: color; /*立体滚动条亮边的颜色*/
  • scrollbar-highlight-color: color; /*滚动条的高亮颜色(左阴影?)*/
  • scrollbar-shadow-color: color; /*立体滚动条阴影的颜色*/
  • scrollbar-darkshadow-color: color; /*立体滚动条外阴影的颜色*/
  • scrollbar-track-color: color; /*立体滚动条背景颜色*/
  • scrollbar-base-color:color; /*滚动条的基色*/

大概就这些,你也可以定义cursor来定义滚动条的鼠标手势。

这里,很久以前danger做了个基于Flash的可视化工具,简单但是好用:

选中CSS选项即可自动生成CSS样式,这里不再过多的介绍了。嗯,多谢大猫老湿推荐。

webkit的自定义滚动条样式

yes,这里才是今天要重点介绍的。

从上一部分的样式名中就可以看到,IE只能定义相关部分的color等属性,这样太不灵活了。

webkit最近实现了对滚动条的支持,先看一个简单的demo:

不过,webkit不再是用简单的几个CSS属性,而是一坨的CSS伪元素

  • ::-webkit-scrollbar 滚动条整体部分
  • ::-webkit-scrollbar-button 滚动条两端的按钮
  • ::-webkit-scrollbar-track 外层轨道
  • ::-webkit-scrollbar-track-piece 内层轨道,滚动条中间部分(除去)
  • ::-webkit-scrollbar-thumb (拖动条?滑块?滚动条里面可以拖动的那个,肿么翻译好呢?)
  • ::-webkit-scrollbar-corner 边角
  • ::-webkit-resizer 定义右下角拖动块的样式

通过这些伪元素,可以完全的重写一个网站的滚动条样式。

当然webkit提供的不止这些,还有很多伪类,可以更丰富滚动条样式:

  • :horizontal – horizontal伪类应用于水平方向的滚动条
  • :vertical – vertical伪类应用于竖直方向的滚动条
  • :decrement – decrement伪类应用于按钮和内层轨道(track piece)。它用来指示按钮或者内层轨道是否会减小视窗的位置(比如,垂直滚动条的上面,水平滚动条的左边。)
  • :increment – increment伪类和decrement类似,用来指示按钮或内层轨道是否会增大视窗的位置(比如,垂直滚动条的下面和水平滚动条的右边。)
  • :start – start伪类也应用于按钮和滑块。它用来定义对象是否放到滑块的前面。
  • :end – 类似于start伪类,标识对象是否放到滑块的后面。
  • :double-button – 该伪类以用于按钮和内层轨道。用于判断一个按钮是不是放在滚动条同一端的一对按钮中的一个。对于内层轨道来说,它表示内层轨道是否紧靠一对按钮。
  • :single-button – 类似于double-button伪类。对按钮来说,它用于判断一个按钮是否自己独立的在滚动条的一段。对内层轨道来说,它表示内层轨道是否紧靠一个single-button。
  • :no-button – 用于内层轨道,表示内层轨道是否要滚动到滚动条的终端,比如,滚动条两端没有按钮的时候。
  • :corner-present – 用于所有滚动条轨道,指示滚动条圆角是否显示。
  • :window-inactive – 用于所有的滚动条轨道,指示应用滚动条的某个页面容器(元素)是否当前被激活。(在webkit最近的版本中,该伪类也可以用于::selection伪元素。webkit团队有计划扩展它并推动成为一个标准的伪类)

另外,:enabled、:disabled、:hover 和 :active 等伪类同样可以用于滚动条中。

关于具体的demo,这里不再做了,网上已经有很多demo可以参考,比如,webkit官方的这个,具体的线上项目中也有现成的例子,比如,QQ空间的签到弹出框和豆瓣说的右侧详情栏(某条信息评论多的时候会显示)。

值得一提的是,webkit的这个伪类和伪元素的实现很强大,虽然类目有些多,但是我们可以把滚动条当成一个页面元素来定义,也差不多可以用上一些高级的CSS3属性,比如渐变、圆角、RGBa等等,当然有些地方也可以用图片,然后图片也可以转换成Base64,总之,可以尽情发挥了。

 

第二种:当然就是自定义滚动条了,用DIV设置滚动条,高度宽度,然后自定义。

这里就分为非JQuery方式和JQUERY方式,如果是不用Jquery的,可以参考(但是内容的高度需要自定义,不能自动):

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
<style type="text/css">
*{ margin:0; padding:0;}
p{ height:1000px;}
#mainBox{ width:400px; height:500px; border:1px #bbb solid; position:relative; overflow:hidden; margin:50px auto;}
#content{  height:2500px; position:absolute; left:0; top:0; background:url(http://h.hiphotos.baidu.com/album/s%3D1400%3Bq%3D90/sign=84e8a533d562853596e0d625a0df4db7/728da9773912b31bafe912e88618367adbb4e16e.jpg) }
.scrollDiv{ width:18px;  position:absolute; top:0; background:#666; border-radius:10px;}
</style>
</head>

<body>
<div id="mainBox">
	<div id="content"></div>
</div>
<p></p>
<script type="text/javascript">

var doc=document;
var _wheelData=-1;
var mainBox=doc.getElementById('mainBox');
function bind(obj,type,handler){
	var node=typeof obj=="string"?$(obj):obj;
	if(node.addEventListener){
		node.addEventListener(type,handler,false);
	}else if(node.attachEvent){
		node.attachEvent('on'+type,handler);
	}else{
		node['on'+type]=handler;
	}
}
function mouseWheel(obj,handler){
	var node=typeof obj=="string"?$(obj):obj;
		bind(node,'mousewheel',function(event){
			var data=-getWheelData(event);
			handler(data);
			if(document.all){
				window.event.returnValue=false;
			}else{
				event.preventDefault();
			}
			
		});
		//火狐
		bind(node,'DOMMouseScroll',function(event){
			var data=getWheelData(event);
			handler(data);
			event.preventDefault();
		});
		function getWheelData(event){
			var e=event||window.event;
			return e.wheelDelta?e.wheelDelta:e.detail*40;
		}
}

function addScroll(){
	this.init.apply(this,arguments);
}
addScroll.prototype={
	init:function(mainBox,contentBox,className){
		var mainBox=doc.getElementById(mainBox);
		var contentBox=doc.getElementById(contentBox);
		var scrollDiv=this._createScroll(mainBox,className);
		this._resizeScorll(scrollDiv,mainBox,contentBox);
		this._tragScroll(scrollDiv,mainBox,contentBox);
		this._wheelChange(scrollDiv,mainBox,contentBox);
		this._clickScroll(scrollDiv,mainBox,contentBox);
	},
	//创建滚动条
	_createScroll:function(mainBox,className){
		var _scrollBox=doc.createElement('div')
		var _scroll=doc.createElement('div');
		var span=doc.createElement('span');
		_scrollBox.appendChild(_scroll);
		_scroll.appendChild(span);
		_scroll.className=className;
		mainBox.appendChild(_scrollBox);
		return _scroll;
	},
	//调整滚动条
	_resizeScorll:function(element,mainBox,contentBox){
		var p=element.parentNode;
		var conHeight=contentBox.offsetHeight;
		var _width=mainBox.clientWidth;
		var _height=mainBox.clientHeight;
		var _scrollWidth=element.offsetWidth;
		var _left=_width-_scrollWidth;
		p.style.width=_scrollWidth+"px";
		p.style.height=_height+"px";
		p.style.left=_left+"px";
		p.style.position="absolute";
		p.style.background="#ccc";
		contentBox.style.width=(mainBox.offsetWidth-_scrollWidth)+"px";
		var _scrollHeight=parseInt(_height*(_height/conHeight));
		if(_scrollHeight>=mainBox.clientHeight){
			element.parentNode.style.display="none";
		}
		element.style.height=_scrollHeight+"px";
	},
	//拖动滚动条
	_tragScroll:function(element,mainBox,contentBox){
		var mainHeight=mainBox.clientHeight;
		element.onmousedown=function(event){
			var _this=this;
			var _scrollTop=element.offsetTop;
			var e=event||window.event;
			var top=e.clientY;
			//this.onmousemove=scrollGo;
			document.onmousemove=scrollGo;
			document.onmouseup=function(event){
				this.onmousemove=null;
			}
			function scrollGo(event){
				var e=event||window.event;
				var _top=e.clientY;
				var _t=_top-top+_scrollTop;
				if(_t>(mainHeight-element.offsetHeight)){
					_t=mainHeight-element.offsetHeight;
				}
				if(_t<=0){
					_t=0;
				}
				element.style.top=_t+"px";
				contentBox.style.top=-_t*(contentBox.offsetHeight/mainBox.offsetHeight)+"px";
				_wheelData=_t;
			}
		}
		element.onmouseover=function(){
			this.style.background="#444";	
		}
		element.onmouseout=function(){
			this.style.background="#666";	
		}
	},
	//鼠标滚轮滚动,滚动条滚动
	_wheelChange:function(element,mainBox,contentBox){
		var node=typeof mainBox=="string"?$(mainBox):mainBox;
		var flag=0,rate=0,wheelFlag=0;
		if(node){
			mouseWheel(node,function(data){
				wheelFlag+=data;
				if(_wheelData>=0){
					flag=_wheelData;
					element.style.top=flag+"px";
					wheelFlag=_wheelData*12;
					_wheelData=-1;
				}else{
					flag=wheelFlag/12;
				}
				if(flag<=0){
					flag=0;
					wheelFlag=0;
				}
				if(flag>=(mainBox.offsetHeight-element.offsetHeight)){
					flag=(mainBox.clientHeight-element.offsetHeight);
					wheelFlag=(mainBox.clientHeight-element.offsetHeight)*12;
					
				}
				element.style.top=flag+"px";
				contentBox.style.top=-flag*(contentBox.offsetHeight/mainBox.offsetHeight)+"px";
			});
		}
	},
	_clickScroll:function(element,mainBox,contentBox){
		var p=element.parentNode;
		p.onclick=function(event){
			var e=event||window.event;
			var t=e.target||e.srcElement;
			var sTop=document.documentElement.scrollTop>0?document.documentElement.scrollTop:document.body.scrollTop;
			var top=mainBox.offsetTop;
			var _top=e.clientY+sTop-top-element.offsetHeight/2;
			if(_top<=0){
				_top=0;
			}
			if(_top>=(mainBox.clientHeight-element.offsetHeight)){
				_top=mainBox.clientHeight-element.offsetHeight;
			}
			if(t!=element){
				element.style.top=_top+"px";
				contentBox.style.top=-_top*(contentBox.offsetHeight/mainBox.offsetHeight)+"px";
				_wheelData=_top;
			}
		}
	}
}
new addScroll('mainBox','content','scrollDiv');
</script>
</body>
</html>

然后Jquery方式用得也比较常见:

GIT:https://github.com/inuyaksa/jquery.nicescroll

也可以:https://files.cnblogs.com/xuweili/scroll_nice.7z

或者:https://files.cnblogs.com/xuweili/scroll_demo.rar

然后使用

jquery.nicescroll

实现,可以是实现自动化。

 

posted @ 2013-11-03 19:56  山顶的鱼  阅读(271)  评论(0编辑  收藏  举报