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

好几天没有发文了,这几天考试,所有耽搁了下来。今天说一说滚动的问题。
前端学习中,页面滚动是一个很重要的部分。
首先要说的是偏移量的问题。先看元素的几个属性
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;width: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;width:10px;border:1px solid black;float:left;position:relative;"><div id="div3" style="height:10px;width:10px;background:red;position:absolute;top:0px;"></div></div>

<body>



</div>

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

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

你可能感兴趣的:(滚动条)