DIV模拟的自定义滚动条

除了上下两个箭头以外,滚动条和一般的浏览器基本差不多
html结构很简单,mainBox是外层div,content是内容,滚动条div是js动态生成的.
<div id="mainBox">
        <div id="content"></div>
</div>

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>div模拟的自定义滚动条</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(img/scrollTest.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.οnmοusemοve=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>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值