自定义滚动条

Posted 飘然离去

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自定义滚动条相关的知识,希望对你有一定的参考价值。

转载:

0.模拟滚动条的原理。

http://www.qdfuns.com/notes/13003/128599c8f7abfee8e2e1933ed79353e7

1.最简单的css3自定义滚动条,但是兼容性我没有测试。

http://www.qdfuns.com/notes/25619/986fecdbc6b3b2ca0378c4036e8f0d25.html

2.看网友定义的一个,也叫xiaoyan,代码看的挺好的,他还定义了一个自己的库看的很6。

http://www.qdfuns.com/notes/16843/e204e911e9637b77ad8fed50bcfa3ed9.html

3.jquery 插件一种简易的自定义方式。

代码粘贴

<!doctype html>
<html lang="en">
<head>
  <meta charset="UTF-8" />
  <title>Document</title>
  <script src="https://cdn.bootcss.com/jquery/1.11.1-beta1/jquery.js"></script>
  <script src="https://cdn.bootcss.com/jquery-mousewheel/3.1.13/jquery.mousewheel.min.js"></script>
</head>
<body>
  <div class="box">
     <div class="scroll-content">
               内容区...........
     </div>
  </div>
  <style>
      .box{width:500px;height:300px;border:1px solid #ccc;overflow:hidden;position:relative;}
  .scroll-bar-parent{background-color:#ccc;right:0;}/*滚动条父级的样式*/
  .scroll-bar{background:#666;left:0;}/*滚动条的样式*/
  </style>
</body>
</html>
(function(){
        
        $.fn.scrollBar = function( options ){
                
                options = $.extend({}, $.fn.options, options);//默认参数,如果没传 则使用默认参数
                
                
                var _scrollInit = function (obj){//滚动主函数
                        
                        obj.data(‘_this‘,this);//把当前对象缓存起来,更新的时候会用到this
                        
                        this.This = obj,//当前调用的对象
                        this.scrollContent = this.This,//滚动的内容
                        this.parent = this.This.parent(),//对象父级
                        this.scrollContent = this.scrollContent.wrap(‘<div class="scroll-box"></div>‘),//给滚动内容包裹一个容器
                        this.scrollBox = this.scrollContent.parent(‘.scroll-box‘),//容器
                        this.scrollBarParent = $(‘<div class="scroll-bar-parent"><div class="scroll-bar"></div></div>‘).appendTo(this.scrollBox),//插入一个滚动条到容器中(这一块是滚动条的父级)
                        this.scrollBar = this.scrollBarParent.children();//滚动条
                        this.mark = true;//一个标记,当options.animate(是否运动方式滚动)存在时,记录是否运动完毕,当完毕情况下才能继续滚动;
                
                        this.setStyle();
                        this.styleInit();//初始化元素高宽,一般用于内容区高度改变时调用
                        this.scrollWheel();//初始化滚动事件
                                                this.mouse();
                }
                
                _scrollInit.prototype = {//函数方法
                        setStyle:function(){//初始化样式
                                this.scrollBox.css({//容器样式
                                        ‘overflow‘:‘hidden‘,
                                        ‘position‘:‘relative‘
                                });
                                this.This.css({//滚动内容的样式
                                        ‘position‘:‘relative‘
                                });
                                this.scrollBarParent.css({//滚动条父级样式
                                        ‘position‘:‘absolute‘,
                                        ‘height‘:‘100%‘,
                                        ‘width‘:‘10px‘,
                                        ‘top‘:‘0‘
                                });
                                this.scrollBar.css({
                                        ‘position‘:‘absolute‘,
                                        ‘top‘:‘0‘,
                                        ‘width‘:‘100%‘,
                                        ‘height‘:‘20px‘
                                });
                        },
                        styleInit:function(){//初始化元素高宽
                                $.fn.scrollChange.call(this);//第一次初始化改变this指向
                        },
                        scrollWheel : function(e){//鼠标轮滚动事件
                                
                                var _this = this;//当前对象
                                this.scrollContent.mousewheel(function(e, delta){//添加事件
                                        e.preventDefault();
                                        if(options.animate){//判断是否是以运动形式滚动
                                                if(!_this.mark)return;//判断是否运动完成
                                                _this.mark = true;//还在运动当中的话 就设置为false
                                        }
                                        
                                        var $this = $(this);//当前事件对象
                                        if(delta < 0){//小于0说明往下面滚
                                                var t = _this.scrollBar.position().top + options.distance;//滚动内容的top值-设定的距离值
                                                
                                        }else{//往上面滚
                                                var t =_this.scrollBar.position().top - options.distance;//滚动内容的top值+设定的距离值
                                        }
                                        _this.scrollTop(t);//设置元素的位置
                                        
                                });
                        },
                         mouse:function(){
                                                        
                                                        var _this = this;
                                                        this.scrollBar.mousedown(function(e){
                                                                var DY = e.clientY -_this.scrollBar.position().top;
                                                                
                                                                $(document).mousemove(function(e){
                                                                        var MY = e.clientY - DY;
                                                                        _this.scrollTop(MY,true);
                                                                        return false;
                                                                });
                                                                
                                                                $(document).mouseup(function(e){
                                                                        $(document).unbind(‘mousemove‘);
                                                                        $(document).unbind(‘mouseup‘);
                                                                });
                                                                return false;        
                                                        });
                                                                
                         },
                        scrollTop:function(t,type){//设置元素滚动位置
                                
                                if(t < 0){//大于0  滚动条到顶了
                                        t = 0;//不能让他超出,所以设置为0
                                }else if(t > this.barParentHeight - this.scrollHeight){//滚动条到底了
                                        t = this.barParentHeight - this.scrollHeight;//让他直接等于底部的值
                                }
                                
                                var pro = this.scrollHeight / this.barParentHeight;//拿到滚动条与父级的比例
                                                                        
                                var _this = this;//当前对象
                                if( options.animate ){//判断是否是以运动形式滚动
                                        this.scrollContent.stop().animate(
                                                                                        {
                                                                                                top:-t / pro}
                                                                                        ,options.speed
                                                                                        ,options.esing
                                                                                        ,function(){//t : 滚动的值,options.speed: 运动的速度,options.esing:运动方式
                                                options.Callback && options.Callback({t:t,o:this});//滚动完成回调函数
                                                _this.mark = true;//完成运动之后把标记设置为true,这样就可以继续下一次滚动
                                                        });
                                                                                if(type){
                                                                                        this.scrollBar.css({‘top‘:t});//设置滚动条的top
                                                                                }else{         
                                                this.scrollBar.stop().animate({‘top‘: t},options.speed);//滚动条滚动
                                                                                }
                                }else{//直接滚动,不以运动方式滚动
                                                                                this.scrollBar.css({‘top‘:t});//设置滚动条的top
                                        this.scrollContent.css({top:-t / pro});//设置滚动内容的top
                                }        
                        }
                }
                
                $.fn.scrollChange = function(){//更新函数
                        
                        if($(this).data(‘_this‘)){//如果当前元素初始化过,则用缓存中的this
                                var This = $(this).data(‘_this‘);//取出缓存中的对象
                        }else{
                                var This = this;//否则是第一次初始化
                        }
                        
                        This.boxWidth = This.parent.outerWidth(true);//父级的宽度
                        This.boxHeight =This.parent.outerHeight(true);//父级的高度
                        
                        This.scrollBox.css({//设置容器的高宽
                                width:This.boxWidth,
                                height:This.boxHeight
                        });
                        
                        This.scrollBarParent.css({//设置滚动条父级的高宽
                                height:This.boxHeight,
                                width:options.width
                        });
                        
                        This.barParentHeight = This.scrollBarParent.outerHeight(true);//滚动条父级的高度
                        This.contentHeight = This.scrollContent.outerHeight(true);//滚动内容的高度
                                                
                       var pro = This.boxHeight / This.contentHeight;//拿到父级高度与滚动内容的比例
                       var t = This.scrollContent.position().top;
                        This.scrollBar.css({//设置滚动条的高度
                                /*父容器的高度乘以滚动条父级的高度除以 滚动内容的高度等于 滚动条的高度*/
                                height:This.boxHeight * This.barParentHeight / This.contentHeight,
                                top:-t * pro
                        });
                                                This.scrollHeight = This.scrollBar.innerHeight();//滚动条高度
                }
                
                
                return this.each(function(){
                        var scrollObj =  new _scrollInit($(this));//初始化对象
                });
                
        }
        
        $.fn.options = {//默认参数
                width:6,//滚动条的宽度
                distance : 100,//一次滚动的距离
                animate:false,//是否以运动形式滚动
                speed:500,//运功速度(animate为true的情况下才能设置)
                esing:‘swing‘,//运动方式
                Callback:function(position){//回调函数
                        
                }
        }
        
})();
$(‘.box .scroll-content‘).scrollBar();

  

3.

以上是关于自定义滚动条的主要内容,如果未能解决你的问题,请参考以下文章

Malihu 自定义滚动条 - 滚动到 id 插件在页面中不起作用

自定义滚动条样式

如何在 MS Word 文档中显示代码片段,因为它在 *** 中显示(滚动条和灰色背景)

自定义滚动条跨浏览器[重复]

在 jQuery 自定义滚动条中使用鼠标滚动事件移动自定义滚动条

带有 css 或 jquery 的自定义滚动条 firefox