• 《SmartJs系列》屌丝逆袭,华丽转身,解读自定义ScrollBar(一)


    最近项目中频频遇到ScrollBar(滚动条),若是document的ScrollBar还可以容忍,关键是内部Div也有。下载个插件吧,显得太业余(原谅我吧,其实手很白),思索再三,自己搞一个吧。OK,接下来的时间,现场观众们跟我一起嗨起来。。。NO,NO,还是跟我一起看一下吧。

    一、首先呢,我有一个Div,这个Div不得了,里面内容太多太多,so,我设置了overflow-y:auto;

    200px;
    height:150px;
    padding:10px;
    line-height:1.5;
    overflow-y:auto;
    font-size:13px;
    color:blue;
    border:1px solid #bbb
    View Code

    二、基于原有Div,构造新的自定义结构__《DOM操作》

     

    图中所示:① 为原始Div,我们需要更改一下它的CSS,position为relative,overflow为hidden;

          是我们新建的一个Div,它里面的内容是 原始Div里面的内容,position为absolute; 这里有一点需要注意的地方,原始div有padding的时候,需要处理一下,另外设置宽高时还需要考虑一下ScrollBar所占的宽度。高度就无所谓了,适应就行。

         ③ 这个就是我们ScrollBar的背景了,高度需要考虑border,这些大家都可以自己亲手试一下。

          这个是主角,我习惯叫它ControlBar(控制条),Bar和Bra是不一样的,当然大家完全可以把它作为Bra看待。它的高度是由 ② 和 ① 的高度比算出来的。

    三、MouseWheel  (鼠标滚动)

      MouseWheel是有兼容性问题的,这个想必大家都知道,我贴下我的代码,有更好的欢迎交流,Tips:项目中引用了JQ,所贴代码仅供参考,当然我没有用JQ滚动插件。

    function mouseWheel (obj ,fn) {
                    var scrollfn = function(e){ 
                        var direct = 0,
                        e = e || window.event; 
                        if( e.wheelDelta ){ 
                            direct = - e.wheelDelta / 120; 
                        }
                        else if( e.detail ){
                            direct = e.detail / 3; 
                        } 
                        fn( direct );
                        if( jQuery.browser.mozilla ){ 
                            e.preventDefault();
                        }
                        else {
                            e.returnValue = false ;
                        }    
                    } 
                
                    if(document.addEventListener){ 
                        obj.addEventListener('DOMMouseScroll',scrollfn,false); 
                    }
                    obj.onmousewheel = scrollfn;
    View Code

      MouseWheel的时候我们需要做的就是改变的top值 , 这里的可移动高度啊,什么的需要大家自己计算一下,切记不可将此移动单位定死,建议每次滚动高度的一半。

      MouseWheel的时候同时需要改变的还有的top值,至于每次滚动改变多少,还是那句话,计算所得。

      值得注意的是临界点的处理,我的方法是:

        可移动px  <  移动单位  ? 可移动px : 移动单位 

      也就是说Div不够再移动一次了,否则就出界了,那么我们灵活的把移动单位更改为 可移动的px。 这个方法同时适用 的处理 ;

      总结一下:MouseWheel的知识点在兼容上,还有临界点的处理,这个还有其他方法,以上所述个人觉得是最直观,最简单的。如果是原生JS的话,可能还需要写一个简单的运动框架,否则体验不到过程。

     

      2013-08-13 22:31:58 今天是国产情人节,本着早睡早起的好习惯,博主就先就寝了,接下来会继续剖析自定义ScrollBar,

      声明一下,博主注重实用性,而非简单实现效果,所以你懂的,接下来更精彩。。。

  • 相关阅读:
    ul前面有40px的距离怎么办
    JQuey中 attr('checked', true)设置状态只有第一次有用
    只有一个RADIO的单选框如何在选中后取消选中
    为Table中的thead加上边框
    ADB 无线连接设备
    面试准备的内容
    蓝牙MESH相关代码
    怎样重构代码
    safari 调试iPhone web页面
    Appium1.6.4 真机运行ios10.3.1 填坑记
  • 原文地址:https://www.cnblogs.com/SmartJs/p/3256180.html
Copyright © 2020-2023  润新知