Jquery实现自定义滚动条,DIV滑动效果

本文介绍了如何使用jQuery实现自定义滚动条效果,通过改变元素的top值和应用animate等方法来创建个性化的滚动体验。只需掌握基本的CSS、HTML和jQuery事件处理知识即可实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  浏览器自带的滚动条一般都不符合我们的需求(因为不好看,太丑,还不能改!),网上搜了一下,发现有很多用js或者jquery实现的自定义的滚动条,而且样式都很漂亮。比如说这个: http://manos.malihu.gr/jquery-custom-content-scroller/ 里面有很多很多很漂亮的滚动条的example。
  言归正传,既然都有了直接拿来用不就好了么!个人拿来随便用啊,但是你要是使用到工作上,考虑的东西就比较多了。所以就自己倒腾倒腾,研究了下他的变化,其实就是自己重新定义一个滚动条样式,然后通过改变标签的top值来实现滚动变化。
  这样一想是不是就简单多了!嗯,你只需要了解一点css,一点html,一点jquery中的mousedown、mousemove、mouseup、animate、onmousewheel、hover知识就可以了。下面开始上代码,css的话就不整理出来了,也可以通过上面的连接去下载css文件。

Html代码:

<html>
<head>
    <script type="text/javascript" src="jquery-1.12.1.js"></script>
    <link rel="stylesheet" href="jquery.mCustomScrollbar.css">
    <style type="text/css">

    </style>
</head>
<body align="center">
<div id="demo">
    event.pageXY: <span id="eventpageXY" ></span>
        <section id="examples" style="margin: auto;width: 800px;">  
            <div id="content-1" class="content mCustomScrollbar _mCS_1 mCS-autoHide">
             <div id="mCSB_1" class="mCustomScrollBox mCS-rounded mCSB_vertical mCSB_inside" style="max-height: none;" tabindex="0">
                    <div id="mCSB_1_container" class="mCSB_container" style="position: relative; top: 0px; left: 0px;" dir="ltr">
                        <h2>Content</h2>
                        <hr>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. 
Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p> 
<p>Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint 
occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
<p>Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, 
eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo.</p> 
ratione voluptatem sequi nesciunt.</p> 
<p>Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam 
exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur?</p> 
<p>Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, 
vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?</p>
corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui 
officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio.</p> 
omnis voluptas assumenda est, omnis dolor repellendus.</p> 
<p>Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae 
maiores alias consequatur aut perferendis doloribus asperiores repellat.</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. 
Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p> 
Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
<p>Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, 
eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo.</p> 
<p>Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos 
qui ratione voluptatem sequi nesciunt.</p> 
modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum 
exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur?</p> 
vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?</p>
<p>At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque 
officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio.</p> 
<p>Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere 
possimus, omnis voluptas assumenda est, omnis dolor repellendus.</p> 
sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis 
voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat.</p>
                        <hr>
                        <p>End of content.</p>
                    </div>
style="display: block;">
                        <div class="mCSB_draggerContainer">
                            <div id="mCSB_1_dragger_vertical" class="mCSB_dragger" style="position: absolute; min-height: 14px; 
                            top: 0px; display: block;">
                                <div class="mCSB_dragger_bar"></div>
                            </div>
                            <div class="mCSB_draggerRail"></div>
                        </div>
                    </div>
                </div>
            </div>          
        </section>
    </div>  
</body>
</html>

Jquery代码:

    <script type="text/javascript">
        var toButtom = toTop = ynew = y = 0;
        var isFinish = true;
        var hoverDiv = true;
        var divHeight = $("#mCSB_1").height();
        $(document).ready(function(){
          $(document).mousemove(function(e){ 
            $("#eventpageXY").text("X: " + e.pageX + ", Y: " + e.pageY); 
          });
        });
        //拖动事件
        var topChange = 0;
        var contentDiv = $("#mCSB_1_container");                   
        var objDiv = $("#mCSB_1_scrollbar_vertical");
        var obj = $('#mCSB_1_dragger_vertical');   
        var offsettop = obj.offset().top;
        var contentOffsettop = contentDiv.offset().top;
        var objHeight = obj.height();
        var objDivHeight = objDiv.height();
        var contentHeight = contentDiv.height();
        $(function(){
            $('#mCSB_1_dragger_vertical').mousedown(function (event) {     
                var isMove = true; 
                $(document).mousemove(function (event) {  
                    event.preventDefault();
                        if (isMove) {
                            var oldTop = parseInt(obj.css("top"));
                            if(oldTop < 0)
                            {
                                obj.css('top',0);
                                contentDiv.css("top",0);
                                return;
                            }
                            if(oldTop > objDivHeight - objHeight){
                                obj.css('top',objDivHeight - objHeight);
                                contentDiv.css("top","-" + (contentHeight - objDivHeight));
                                return;
                            }
                            if(oldTop >= 0 && oldTop <= (objDivHeight - objHeight)){
                                if((event.pageY -offsettop -5) < 0 )
                                {
                                    obj.css('top',0);
                                    contentDiv.css("top",0);
                                    return;
                                }
                                if((event.pageY -offsettop -5) > (objDivHeight - objHeight))
                                {
                                    obj.css('top',objDivHeight - objHeight);
                                    contentDiv.css("top","-" + (contentHeight - objDivHeight));
                                    return;                                 
                                }
                                obj.css('top',event.pageY -offsettop -5); 
                                var newTop = parseInt(obj.css("top"));
                                topChange = oldTop - newTop;
                                var divNewTop = parseInt(contentDiv.css("top")) + topChange*(contentHeight/objDivHeight);
                                contentDiv.css("top",divNewTop);
                            }
                        }  
                    }  
                ).mouseup(function () {  
                            isMove = false;  
                }); 
            }); 
        }); 
        //滚轮下滑,内容上滑,top递减
        function upContent(){
            var oldTop = parseInt(contentDiv.css("top"));
            var olTopScrol = parseInt(obj.css("top"));
            var srcDivNewTop = oldTop - divHeight;
            if(oldTop > 0){
                contentDiv.animate(
                    {top:'-=' + oldTop + 'px'},
                    "normal",
                    "linear",
                    function(){
                        isFinish = true;
                    }
                );
                obj.animate(
                    {top:'-=' + olTopScrol +'px'},
                    "normal",
                    "linear",
                    function(){
                        isFinish = true;
                    }
                );
                return;
            }else
            {
                if(srcDivNewTop < (objDivHeight - contentHeight))
                {
                    if(oldTop == (objDivHeight - contentHeight))
                    {
                        isFinish = true;
                        return;
                    }
                    contentDiv.animate(
                        {top:'-=' + ((contentHeight- objDivHeight) + oldTop) + 'px'},
                        "normal",
                        "linear",
                        function(){
                            isFinish = true;
                        }
                    );
                    obj.animate(
                        {top:'+=' + (divHeight - objHeight - olTopScrol) +'px'},
                        "normal",
                        "linear",
                        function(){
                            isFinish = true;
                        }
                    );
                    return;
                }
                contentDiv.animate(
                    {top:'-=' + divHeight + 'px'},
                    "normal",
                    "linear",
                    function(){
                        isFinish = true;
                    }
                );
                obj.animate(
                    {top:'+=' + (divHeight*divHeight/contentHeight) +'px'},
                    "normal",
                    "linear",
                    function(){
                        isFinish = true;
                    }
                );
            }   
        }
        //滚轮上滑,内容下滑,top递增
        function downContent(){
            var oldTop = parseInt(contentDiv.css("top"));   
            var olTopScrol = parseInt(obj.css("top"));
            var srcDivNewTop = oldTop + divHeight;
            if(oldTop >= 0){
                contentDiv.animate(
                    {top:'-=' + oldTop + 'px'},
                    "normal",
                    "linear",
                    function(){
                        isFinish = true;
                    }
                );
                obj.animate({
                    top:'-=' + olTopScrol +'px'},
                    "normal",
                    "linear",
                    function(){
                        isFinish = true;
                    }
                );
                return;
            }else
            {
                if(srcDivNewTop > 0){
                    contentDiv.animate(
                        {top:'-=' + oldTop + 'px'},
                        "normal",
                        "linear",
                        function(){
                            isFinish = true;
                        }
                    );
                    obj.animate(
                        {top:'-=' + olTopScrol +'px'},
                        "normal",
                        "linear",
                        function(){
                            isFinish = true;
                        }
                    );
                    return;
                };
                contentDiv.animate(
                    {top:'+=' + divHeight + 'px'},
                    "normal",
                    "linear",
                    function(){
                        isFinish = true;
                    }
                );
                obj.animate(
                    {top:'-=' + (divHeight*divHeight/contentHeight) +'px'},
                    "normal",
                    "linear",
                    function(){
                        isFinish = true;
                    }
                );
            }
        }

        function mainFunc(){
            if(isFinish)
            {
                isFinish = false;           
                //滚轮下滑,内容上滑,top递减
                if(e.wheelDelta/-120 > 0){
                    upContent();
                }
                //滚轮上滑,内容下滑,top递增
                if(e.wheelDelta/120 > 0){
                    downContent();
                }
            }
        }

        $("#content-1").hover(function(){
            hoverDiv = true;
        },function(){
            hoverDiv = false;
        });         
        //鼠标滚轮事件
        document.onmousewheel = function(e) {
            if(isFinish && hoverDiv)
            {
                isFinish = false;           
                //滚轮下滑,内容上滑,top递减
                if(e.wheelDelta/-120 > 0){
                    upContent();
                }
                //滚轮上滑,内容下滑,top递增
                if(e.wheelDelta/120 > 0){
                    downContent();
                }
            }           
        };
    </script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值