<!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:20%; height: 600px; border: 1px #bbb solid; position: relative; overflow: hidden; margin: 0px auto; } #content { position: absolute; left: 0; top: 0; background:url(img/scrollTest.jpg); } .scrollDiv { width: 10px; position: absolute; top: 0; background: #666; border-radius: 10px; } </style> <script type="text/javascript"> window.onload = function() { this.divScroll(); }; //当浏览器窗口大小改变时 window.onresize = function(){ var scrollDiv = document.getElementById("scroll"); if (scrollDiv != null && scrollDiv != undefined){ var mainBox = document.getElementById('mainBox'); var contentBox = document.getElementById('content'); this.divResize(scrollDiv, mainBox, contentBox); } } //创建滚动条 var divScroll = function(){ var doc = document; var _wheelData = -1; var mainBox = doc.getElementById('mainBox'); function addEvent(element,type,handler){ //被绑定的dom对象,绑定类型,事件处理函数 if(element.addEventListener){ //非ie中的处理 element.addEventListener(type,handler,false);//false表示在冒泡阶段调用函数 } else if(element.attachEvent) { //ie中的处理 element.attachEvent("on" + type,handler); } else { //如果该浏览器对DOM2级不支持,则使用DOM0级方式。 element["on" + type] = handler; } } 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; _scroll.setAttribute("id","scroll") //新增属性 _scrollBox.setAttribute("id","scrollbox") //新增属性 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 = p.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; } } } } //自定义代码,鼠标移入内容项后再触发滚动条加载事件 var mainBox = document.getElementById("mainBox"); if (mainBox != null && mainBox != undefined){ addEvent(mainBox,"mouseover",function(){ var scroll = document.getElementById("scrollbox"); if (scroll == null || scroll == undefined){ var content = document.getElementById("content"); if(content.offsetHeight > mainBox.offsetHeight){ //滚动条加载事件 new addScroll('mainBox', 'content', 'scrollDiv'); } } }); addEvent(mainBox,"mouseout",function(event){ var scrollbox = document.getElementById("scrollbox"); if (scrollbox != null && scrollbox != undefined){ var x=event.clientX; var y=event.clientY; var divx = mainBox.offsetLeft; var divy = mainBox.offsetTop; var divWidth = mainBox.offsetLeft + mainBox.offsetWidth; var divHeight = mainBox.offsetTop + mainBox.offsetHeight; if( x < divx || x > divWidth || y < divy || y > divHeight){ //卸载滚动条 for (var i=0;i<mainBox.childNodes.length;i++) { if(mainBox.childNodes[i].id == "scrollbox"){ mainBox.removeChild(mainBox.childNodes[i]); } } } } }); } } //当浏览器窗体大小改变时 var divResize = 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"; } </script> </head> <body> <div id="mainBox"> <div id="content"> javascript scroll </div> </div> </body> </html>