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: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>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值