滚动篇————附一个简单单的自定义滚动条

好几天没有发文了,这几天考试,所有耽搁了下来。今天说一说滚动的问题。
前端学习中,页面滚动是一个很重要的部分。
首先要说的是偏移量的问题。先看元素的几个属性
1.offsetHeight,offsetWidth:这两个属性是元素在水平和垂直方向所占的空间大小。包含边框。
2.offsetLeft,offsetTop:元素相对于包含元素的上、左方向的距离。
再看一个问题,客户区的大小,指的是元素内容及其内边距所占的空间大小。不包含边框。用clientWidth,clientHeight表示。
最后要介绍的是滚动大小,scrollHeigth,和scrollWidth表示在没有滚动条的情况下,元素内容的总高度和总宽度。scrollLeft,scrollTop,被隐藏的内容区域的像素数。
在涉及浏览器的滚动的时候需要注意的是,混杂模式下IE是在body中滚动,而其他的浏览器大多认为是在浏览器的视口中滚动,所以在这里就用做一些兼容问题:

scrollHeight = document.documentElement.scrollHeight||document.body.scrollHeight;

接下来通过一个自定义滚动条来进一步讨论这两个问题。

<head>
    <script>
window.onload=function(){
    var div3=document.getElementById("div3");
    var div2=document.getElementById('div2');
    var div4=document.getElementById('div4');

    div3.onmousedown=function(e){
      var  e=e||event;

        var yy= e.clientY-div3.offsetTop


        document.onmousemove=function(ev){
         var   e=ev||event;
         var  l = e.clientY-yy;
            if(l<0){
                l=0;
            }else if(l>390){
                l=390   ;
            };
            div3.style.top=l+'px';
            div4.style.top=-l/390*(div4.offsetHeight-400)+'px';

        }
        document.onmouseup=function(){
            document.onmousemove=null;
        }
        return false;
    }
}

    </script>
    <style type="text/css">
        #div1{
            width:100px;
            height:400px;
            border:solid black 1px;
            float:left;
            position: relative;
        }
    </style>
</head>

<div id="div1" >
    <div id="div4" style="position: absolute;100px;overflow:hidden;">
    # 在此处输入标题

    标签(空格分隔): 未分类

    ---
    ##javascript中event汇总
    ie firefox chrome opera Safari浏览器中对 event的处理并不一致,在此我将各个浏览器中event的兼容处理做了一个汇总,此处引用的是javascript中的event兼容处理代码。
    
    var EventUtil = {//在这里我们用一个对象来将对event的各种兼容处理封装起来
    //首先是对绑定事件的兼容
    addHandler: function(element, type, handler){
    if (element.addEventListener){
    //DOM2级处理绑定事件方法
    element.addEventListener(type, handler, false);
    } else if (element.attachEvent){
    //IE绑定方法
    element.attachEvent("on" + type, handler);
    } else {
    //DOM0级处理方法(可选,仅支持DOM0级的浏览器似乎已经不存在了)
    element["on" + type] = handler;
    }
    },
    //鼠标按钮的兼容处理
    getButton: function(event){
    if (document.implementation.hasFeature("MouseEvents", "2.0")){//首先检查是否是DOM标准
    return event.button;
    } else {
    //对IE向DOM兼容
    switch(event.button){
    case 0:
    case 1:
    case 3:
    case 5:
    case 7:
    return 0;
    case 2:
    case 6:
    return 2;
    case 4: return 1;
    }
    }
    },
    //获取字符编码
    getCharCode: function(event){
    if (typeof event.charCode == "number"){
    return event.charCode;
    } else {//IE8之前和opera 需要使用keyCode获取字符编码
    return event.keyCode;
    }
    },
    //剪切板的访问
    getClipboardText: function(event){
    var clipboardData =  (event.clipboardData || window.clipboardData);
    return clipboardData.getData("text");
    },
    //得到事件对象
    getEvent: function(event){
    return event ? event : window.event;
    },
    //得到相关元素
    getRelatedTarget: function(event){
    if (event.relatedTarget){
    return event.relatedTarget;
    } else if (event.toElement){
    return event.toElement;
    } else if (event.fromElement){
    return event.fromElement;
    } else {
    return null;
    }

    },
    //得到事件目标
    getTarget: function(event){
    return event.target || event.srcElement;
    },
    //对滑轮事件进行兼容
    getWheelDelta: function(event){
    if (event.wheelDelta){
    return (client.engine.opera && client.engine.opera < 9.5 ? -event.wheelDelta : event.wheelDelta);
    } else {
    return -event.detail * 40;
    }
    },
    //阻止默认事件
    preventDefault: function(event){
    if (event.preventDefault){
    event.preventDefault();
    } else {
    event.returnValue = false;
    }
    },
    //移除事件
    removeHandler: function(element, type, handler){
    if (element.removeEventListener){
    element.removeEventListener(type, handler, false);
    } else if (element.detachEvent){
    element.detachEvent("on" + type, handler);
    } else {
    element["on" + type] = null;
    }
    },
    //设置剪切板内容
    setClipboardText: function(event, value){
    if (event.clipboardData){
    event.clipboardData.setData("text/plain", value);
    } else if (window.clipboardData){
    window.clipboardData.setData("text", value);
    }
    },
    //阻止事件冒泡
    stopPropagation: function(event){
    if (event.stopPropagation){
    event.stopPropagation();
    } else {
    event.cancelBubble = true;
    }
    }

    };
   
    此处添加的事件尚不完全,有待扩充。
    </div>
</div>
<div id="div2" style="height:400px;10px;border:1px solid black;float:left;position:relative;"><div id="div3" style="height:10px;10px;background:red;position:absolute;top:0px;"></div></div>
<body>

</div>

[实例测试](http://www.chinajs.net/test)

在这个自定义滚动条中我们通过设置top来更改元素的位置,不能使用scrollTop因为scrollTop是只读的。

原文地址:https://www.cnblogs.com/echoRadish/p/3745383.html