zoukankan      html  css  js  c++  java
  • jQuery,自定义滚动条

    目的:用js模拟实现滚动条,从而达到设计图以及产品要求的效果……
    原理:伴随着父级容器overflow,控制绝对容器的left,top值,从而达到效果。

    在线代码地址:http://runjs.cn/code/agzuqcdh

    在线测试地址:http://sandbox.runjs.cn/show/agzuqcdh

    html代码

     1 <div id="show">
     2             <!--内容区域-->
     3             <div id="container">
     4                 <p>1326546478797897987</p>
     5                 <p>1326546478797897987</p>
     6                 <p>1326546478797897987</p>
     7                 <p>1326546478797897987</p>
     8                 <p>1326546478797897987</p>
     9                 <p>1326546478797897987</p>
    10                 <p>1326546478797897987</p>
    11                 <p>1326546478797897987</p>
    12                 <p>1326546478797897987</p>
    13                 <p>1326546478797897987</p>
    14                 <p>1326546478797897987</p>
    15                 <p>1326546478797897987</p>
    16                 <p>1326546478797897987</p>
    17                 <p>1326546478797897987</p>
    18                 <p>1326546478797897987</p>
    19                 <p>1326546478797897987</p>
    20             </div>
    21             
    22             <!--滚动条区域-->
    23             <div id="sctollCon">
    24                 <div id="sctollDo"></div>
    25             </div>
    26         </div>

    js代码:

    ScorllTop({
        "show":$("#show"),//可视区域
        "container":$("#container"),//内容区域
         "scroll":$("#sctollCon"),//滚动条区域
         "scrollDo":$("#sctollDo")//滚动条
    
    });
    
    //竖向的滚动条,四个参数,jQuery对象,
    // {
    //     "show":,//可视区域
    //     "container":,//内容区域
    //     "scroll":,//滚动条区域
    //     "scrollDo"://滚动条
    // }
    function ScorllTop($obj){
        var $container = $obj.show,//可视区域
            $contanr   = $obj.container,//内容区域
            $conScroll = $obj.scroll,//滚动条活动区域
            $sroll     = $obj.scrollDo,//滚动条
            startY     = 0,//开始位置  
            lastY      = 0,//结束位置
            YN         = false,
            bBtn       = true;//判断滚动条上滚还是下滚
    
            $container.mouseover(function(){
                if ( $contanr.height() > $container.height() ) {
                    $conScroll.show();
                    //初始化滚动条的高度
                       $sroll.height($container.height()*$conScroll.height()/$contanr.height());
                    //添加拖动事件
                    addEvent($sroll[0],'mousedown',mouseDown);
                    //添加滚动条事件
                    addEvent($contanr[0],'DOMMouseScroll',mouseMove);
                    addEvent($conScroll[0],'DOMMouseScroll',mouseMove);
                    $contanr[0].onmousewheel = MouseScr;
                    $conScroll[0].onmousewheel = MouseScr;
                }else{
                    $contanr.css({'top':0});
                    $sroll.css({'top':0});
                }
            });
    
            $container.mouseout(function(){
                $conScroll.hide();
            });
    
            function mouseDown(e){
                startY = e.clientY - this.offsetTop;
                this.setCapture && this.setCapture();//避免IE下拖拽过快鼠标失去对象
                console.log(startY);
                addEvent(document,'mousemove',mouseMove);
                addEvent(document,'mouseup',mouseUp);
                return false;
            }
    
            function mouseMove(e){
                var maxVal = $conScroll.height() - $sroll.height();//最大值
                this.setCapture && this.setCapture();//避免IE下拖拽过快鼠标失去对象
                lastY = e.clientY - startY;
                lastY = lastY < 0 ? 0 :lastY;
                lastY = lastY > maxVal ? maxVal : lastY;
    
                $sroll.css({'top':lastY+'px'});
                $contanr.css({'top':-$conScroll.height()*lastY/$sroll.height()});
                return false;
            }
    
            function mouseUp(){
                console.log('取消事件');
                removeEvent(document,'mousemove',mouseMove);
                removeEvent(document,'mouseup',mouseUp);
                return false;
            }
    
            function MouseScr(ev){
                var ev = ev || window.event,
                  TopY = 0;
                if(ev.detail){
                    bBtn = ev.detail>0  ?  true : false;
                }
                else{
                    bBtn = ev.wheelDelta<0  ?  true : false;
                }
                if(bBtn){   //
                    TopY = $contanr.position().top-10;
                }
                else{  //
                    TopY = $contanr.position().top+10;
                }
                var maxTop = $contanr.outerHeight()-$container.outerHeight();
                TopY = TopY > 0 ? 0 : TopY;
                TopY = TopY < -maxTop ? -maxTop : TopY;
    
                $contanr.css({'top':TopY+'px'});
                $sroll.css({'top':$sroll.height()*Math.abs(TopY)/$conScroll.height()+'px'});
    
                if(ev.preventDefault){
                    ev.preventDefault();
                }
                else{
                    return false;
                }
            }
    }
    //ScorllTop end!
    
    //拖拽活动层,拖拽的区域,活动的区域,最大活动区域,默认是window
    function dragConFun(obj){
        var $dragDo  = obj.dragObj,//拖拽触发点
            $dragCon = obj.activeObj,//拖拽的大容器
            $dragMax = obj.maxCon || $(window),//最大的容器,默认是window
    
            //拖拽容器的大小
            dragWidth  = $dragCon.outerWidth(),//拖拽容器的
            dragHeight = $dragCon.outerHeight(),
            //最大活动范围
            maxWidth   = $dragMax.width() - dragWidth,
            maxHeight  = $dragMax.height() - dragHeight,
            //操作变量
            startX     = 0,
            startY     = 0,
            
            a;
    
        addEvent($dragDo[0],'mousedown',mouseDoun);
    
        function mouseDoun(e){
            startX = e.clientX - $dragCon[0].offsetLeft;
            startY = e.clientY - $dragCon[0].offsetTop;
            this.setCapture && this.setCapture();//避免IE下拖拽过快鼠标失去对象
    
            $("body").css({
                'cursor':"move"
            });
            addEvent(document,'mousemove',mouseMove);
            addEvent(document,'mouseup',mouseUp);
            return false;
        };
    
        function mouseMove(e){
            var endX       = 0,
                endY       = 0;
    
            endX = e.clientX - startX;
            endY = e.clientY - startY;
            endX = endX < 0 ? 0 : endX;
            endX = endX > maxWidth ? maxWidth : endX;
            endY = endY < 0 ? 0 : endY;
            endY = endY > maxHeight ? maxHeight : endY;
    
            $dragCon.css({
                'left':endX,
                'top':endY
            });
            return false;
        };
    
        function mouseUp(){
            $("body").css({
                'cursor':"auto"
            });
            removeEvent(document,'mousemove',mouseMove);
            removeEvent(document,'mouseup',mouseUp);
            return false;
        };
    
        if (obj.clickother) {
            //非目标区域,隐藏
            $(document).mouseup(function(e){
                var _con = $dragCon;   // 设置目标区域
                if(!_con.is(e.target) && _con.has(e.target).length === 0){ // Mark 1
                  $dragCon.hide();
               }
            });
        };
            
    }//dragConFun end!
    
    //添加监听事件
    function addEvent( obj, type, fn ) { 
        if ( obj.attachEvent ) { 
            obj['e'+type+fn] = fn; 
            obj[type+fn] = function(){obj['e'+type+fn]( window.event );} 
            obj.attachEvent( 'on'+type, obj[type+fn] ); 
        } else{
            obj.addEventListener( type, fn, false ); 
        } 
            
    } 
    //移除监听事件
    function removeEvent( obj, type, fn ) { 
        if ( obj.detachEvent ) { 
            obj.detachEvent( 'on'+type, obj[type+fn] ); 
            obj[type+fn] = null; 
        } else {
            obj.removeEventListener( type, fn, false ); 
        }
    }
  • 相关阅读:
    图像风格迁移也有框架了:使用Python编写,与PyTorch完美兼容,外行也能用
    YOLOv5的项目实践 | 手势识别项目落地全过程(附源码)
    TensorFlow 参考学习资料
    eeglab中文教程系列(6)-数据叠加平均{1}(Data averaging)
    eeglab中文教程系列(5)-提取数据epoch
    eeglab中文教程系列(4)-预处理工具
    eeglab中文教程系列(3)-绘制通道光谱图
    eeglab中文教程系列(2)-绘制脑电头皮图
    eeglab中文教程系列(1)-加载、显示数据
    eeglab在MATLAB中安装教程
  • 原文地址:https://www.cnblogs.com/xxyy1122/p/5070495.html
Copyright © 2011-2022 走看看