js 自制滚动条的小例子


Posted in Javascript onMarch 16, 2013

写了个js自制滚动条,首先,先看一下demo(点击这里) 先

有两个demo,右边那个黑色那个,是我一开始写的比较肤浅的代码:

var scrollself=(function(){
    var scrollblock, //滚动块
        scrollcontent,  //被滚动的内容
        scrollbar,    //滚动条
        scrollpanel,    //滚动内容的滚动区域
        cdistance,  //滚动内容要滚动的距离
        bdistance,    //滚动块要滚动的距离
        minuTop, //滚动条头尾剩下的空白
        cTop,    //滚动内容的top
        startY=0,    //滚动动作开始初鼠标的位置
        bTop=0,    //滚动动作开始初滚动块的top
        isDrag=false;  //是否拉动滚动块

    function prevent(e){
        if(e.preventDefault){
            e.preventDefault();
        }
        if(e.stopPropagation){
            e.stopPropagation();
        }
        e.cancelBubble=true;
        e.returnValue=false;
    }
    function mouseDown(event){
        isDrag=true;
        event=event||window.event;
        startY=event.clientY;
        bTop=scrollblock.offsetTop;
        cTop=scrollcontent.offsetTop;
        // prevent(event);
    }
    function mouseMove(event){
        if(isDrag){
            event=event||window.event;
            var newbTop=event.clientY-startY+bTop,
                newcTop=cTop-(event.clientY-startY)/bdistance*cdistance;
            if(newbTop<minuTop){
                newbTop=minuTop;
                newcTop=0;
            }else{
                if(newbTop>bdistance+minuTop){
                    newcTop=-cdistance;
                    newbTop=bdistance+minuTop;
                }
            }
            scrollblock.style.top=newbTop+'px';
            scrollcontent.style.top=newcTop+'px';
        }else{
            isDrag=false;
        }
        // prevent(event);
    }
    function mouseUp(event){
        isDrag=false;
        // prevent(event);
    }
    function addHandler(){
        scrollblock.onmousedown=mouseDown;
        scrollblock.onmousemove=mouseMove;
        scrollblock.onmouseup=mouseUp;
        document.onmouseup=mouseUp;
    }

    return{
        init:function(scrollpanel_id,scrollcontent_id,scrollbar_id,scrollblock_id){
            scrollblock=document.getElementById(scrollblock_id);
            scrollcontent=document.getElementById(scrollcontent_id);
            scrollbar=document.getElementById(scrollbar_id);
            scrollpanel=document.getElementById(scrollpanel_id);
            minuTop=scrollblock.offsetTop;
            cdistance=scrollcontent.offsetHeight-scrollpanel.offsetHeight;
            bdistance=scrollbar.offsetHeight-minuTop*2-scrollblock.offsetHeight;
            enclose(scrollpanel,scrollcontent,scrollbar,scrollblock,bdistance,cdistance,minuTop);
            addHandler();
        }
    }

}());
scrollself.init('scrollpanel2','scrollcontent2','scrollbar2','scrollblock2');

之所以说它肤浅,比较一下两个demo的滚动效果就知道了,右边的拉动滚动块时候,体验效果好差,很卡,而左边的就流畅多了。

因为很卡,我就又上网看了一下别人的代码,然后把根据别人的思路把代码改了一下,就有了左边那个绿色的那个demo,很明显,效果好了很多,代码:

var scroll=(function(){
    var scrollblock, //滚动块
        scrollcontent,  //被滚动的内容
        scrollbar,    //滚动条
        scrollpanel,    //滚动内容的滚动区域
        cdistance,  //滚动内容要滚动的距离
        bdistance,    //滚动块要滚动的距离
        minuTop, //滚动条头尾剩下的空白
        cTop,    //滚动内容的top
        startY=0,    //滚动动作开始初鼠标的位置
        bTop=0;    //滚动动作开始初滚动块的top

    function mouseDown(event){
        event=event||window.event;
        startY=event.clientY;
        bTop=scrollblock.offsetTop;
        cTop=scrollcontent.offsetTop;
        if(scrollblock.setCapture){
            scrollblock.onmousemove=doDrag;
            scrollblock.onmouseup=stopDrag;
            scrollblock.setCapture();
        }else{
            document.addEventListener("mousemove",doDrag,true);
            document.addEventListener("mouseup",stopDrag,true);
        }
    }
    function doDrag(event){
        event=event||window.event;
        var newbTop=event.clientY-startY+bTop,
            newcTop=cTop-(event.clientY-startY)/bdistance*cdistance;
        if(newbTop<minuTop){
            newbTop=minuTop;
            newcTop=0;
        }else if(newbTop>bdistance+minuTop){
            newcTop=-cdistance;
            newbTop=bdistance+minuTop;
        }
        scrollblock.style.top=newbTop+'px';
        scrollcontent.style.top=newcTop+'px';
    }
    function stopDrag(event){
        if(scrollblock.releaseCapture){
            scrollblock.onmousemove=doDrag;
            scrollblock.onmouseup=stopDrag;
            scrollblock.releaseCapture();
        }else{
            document.removeEventListener("mousemove",doDrag,true);
            document.removeEventListener("mouseup",stopDrag,true);
        }
        scrollblock.onmousemove=null;
        scrollblock.onmouseup=null;
    }
    return{
        init:function(scrollpanel_id,scrollcontent_id,scrollbar_id,scrollblock_id){
            scrollblock=document.getElementById(scrollblock_id);
            scrollcontent=document.getElementById(scrollcontent_id);
            scrollbar=document.getElementById(scrollbar_id);
            scrollpanel=document.getElementById(scrollpanel_id);
            minuTop=scrollblock.offsetTop;
            cdistance=scrollcontent.offsetHeight-scrollpanel.offsetHeight;
            bdistance=scrollbar.offsetHeight-minuTop*2-scrollblock.offsetHeight;
            scrollblock.onmousedown=mouseDown;
            enclose(scrollpanel,scrollcontent,scrollbar,scrollblock,bdistance,cdistance,minuTop);
        }
    }
}());
scroll.init('scrollpanel','scrollcontent','scrollbar','scrollblock');

比较了一下两个的代码,其实修改的不多,就有一点很大的不同,流畅的那一个(左边绿色那一个)多了这个东西——setCapture、releaseCapture。

具体是怎样的,再研究一下先。

Javascript 相关文章推荐
一些常用的JS功能函数代码
Jun 23 Javascript
ext jquery 简单比较
Apr 07 Javascript
高性能web开发 如何加载JS,JS应该放在什么位置?
May 14 Javascript
js写一个字符串转成驼峰的实例
Jun 21 Javascript
jQuery的attr与prop使用介绍
Oct 10 Javascript
angularJS提交表单(form)
Feb 09 Javascript
Node.js中的process.nextTick使用实例
Jun 25 Javascript
基于JavaScript FileReader上传图片显示本地链接
May 27 Javascript
微信小程序之picker日期和时间选择器
Feb 09 Javascript
js移动端图片压缩上传功能
Aug 18 Javascript
JS中touchstart事件与click事件冲突的解决方法
Mar 12 Javascript
一起来看看Vue的核心原理剖析
Mar 24 Vue.js
JavaScript创建一个欢迎cookie弹出窗实现代码
Mar 15 #Javascript
js加强的经典分页实例
Mar 15 #Javascript
Jquery刷新页面背景图片随机变换的实现方法
Mar 15 #Javascript
jQuery方法简洁实现隔行换色及toggleClass的使用
Mar 15 #Javascript
jquery使用ColorBox弹出图片组浏览层实例演示
Mar 14 #Javascript
JavaScript 函数replace深入了解
Mar 14 #Javascript
JS异常处理的一个想法(sofish)
Mar 14 #Javascript
You might like
PHP常用代码
2006/11/23 PHP
菜鸟学PHP之Smarty入门
2007/01/04 PHP
探讨GDFONTPATH能否被winxp下的php支持
2013/06/21 PHP
PHP集成百度Ueditor 1.4.3
2014/11/23 PHP
在php和MySql中计算时间差的方法详解
2015/03/27 PHP
CMSPRESS 10行代码搞定 PHP无限级分类2
2018/03/30 PHP
Laravel框架路由设置与使用示例
2018/06/12 PHP
基于php解决json_encode中文UNICODE转码问题
2020/11/10 PHP
快速保存网页中所有图片的方法
2006/06/23 Javascript
JavaScript调用ajax获取文本文件内容实现代码
2014/03/28 Javascript
javascript进行数组追加方法小结
2014/06/16 Javascript
vue中渐进过渡效果实现
2016/10/27 Javascript
Nodejs 和Session 原理及实战技巧小结
2017/08/25 NodeJs
vue生命周期的探索
2019/04/03 Javascript
vue弹出框组件封装实例代码
2019/10/31 Javascript
手把手教你实现 Promise的使用方法
2020/09/02 Javascript
原生JavaScript实现贪吃蛇游戏
2020/11/04 Javascript
[01:04:01]2014 DOTA2华西杯精英邀请赛5 24 DK VS VG
2014/05/25 DOTA
python结合selenium获取XX省交通违章数据的实现思路及代码
2016/06/26 Python
使用Python生成XML的方法实例
2017/03/21 Python
深入理解python中函数传递参数是值传递还是引用传递
2017/11/07 Python
Python随机生成均匀分布在单位圆内的点代码示例
2017/11/13 Python
用Python写脚本,实现完全备份和增量备份的示例
2018/04/29 Python
python得到单词模式的示例
2018/10/15 Python
Django admin禁用编辑链接和添加删除操作详解
2019/11/15 Python
python GUI库图形界面开发之PyQt5信号与槽机制、自定义信号基础介绍
2020/02/25 Python
Python操作PostgreSql数据库的方法(基本的增删改查)
2020/12/29 Python
css3类选择器之结合元素选择器和多类选择器用法
2017/03/09 HTML / CSS
Python如何定义一个函数
2015/09/01 面试题
个人找工作求职简历的自我评价
2013/10/20 职场文书
森林防火标语
2014/06/23 职场文书
乡镇精神文明建设汇报材料
2014/08/15 职场文书
国庆节促销广告语2014
2014/09/19 职场文书
2014小学语文教学工作总结
2014/12/17 职场文书
行政复议决定书
2015/06/24 职场文书
Python selenium绕过webdriver监测执行javascript
2022/04/12 Python