zoukankan      html  css  js  c++  java
  • 滚动篇————附一个简单单的自定义滚动条

    好几天没有发文了,这几天考试,所有耽搁了下来。今天说一说滚动的问题。
    前端学习中,页面滚动是一个很重要的部分。
    首先要说的是偏移量的问题。先看元素的几个属性
    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是只读的。

  • 相关阅读:
    legend3---videojs存储视频的播放速率便于用户观看视频
    legend3---mathjax的动态渲染问题解决
    matplotlib库疑难问题---10、画直方图
    matplotlib库疑难问题---9、画箭头(综合实例)
    js释放图片资源
    javascript中的原型与原型链
    前端跨域方式
    matplotlib清除 axes 和 figure
    matplotlib画直方图细解
    CentOS 7.8 安装 Python 3.8.5
  • 原文地址:https://www.cnblogs.com/echoRadish/p/3745383.html
Copyright © 2011-2022 走看看