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 相关文章推荐
var与Javascript变量隐式声明
Sep 17 Javascript
HTA版JSMin(省略修饰语若干)基于javascript语言编写
Dec 24 Javascript
JSChart轻量级图形报表工具(内置函数中文参考)
Oct 11 Javascript
基于jquery的高性能td和input切换并可修改内容实现代码
Jan 09 Javascript
JS 对象属性相关(检查属性、枚举属性等)
Apr 05 Javascript
jquery地址栏链接与a标签链接匹配之特效代码总结
Aug 24 Javascript
Bootstrap弹出框modal上层的输入框不能获得焦点问题的解决方法
Dec 13 Javascript
学好js,这些js函数概念一定要知道【推荐】
Jan 19 Javascript
@ResponseBody 和 @RequestBody 注解的区别
Mar 08 Javascript
AngularJS实现tab选项卡的方法详解
Jul 05 Javascript
js使用generator函数同步执行ajax任务
Sep 05 Javascript
Vue动态获取width的方法
Aug 22 Javascript
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
天使彦史上最神还原,性别曝光的那一刻,百万网友恋爱了
2020/03/02 国漫
php 8小时时间差的解决方法小结
2009/12/22 PHP
对淘宝URL中ID提取的PHP代码
2013/09/01 PHP
php实现的IMEI限制的短信验证码发送类
2015/05/05 PHP
top.location.href 没有权限 解决方法
2008/08/05 Javascript
jquery ajax 登录验证实现代码
2009/09/23 Javascript
JavaScript中的small()方法使用详解
2015/06/08 Javascript
jQuery Ajax 全局调用封装实例代码详解
2016/06/02 Javascript
关于 jQuery Easyui异步加载tree的问题解析
2016/12/06 Javascript
vue如何使用 Slot 分发内容实例详解
2017/09/05 Javascript
vue element-ui 绑定@keyup事件无效的解决方法
2018/03/09 Javascript
Element Breadcrumb 面包屑的使用方法
2020/07/26 Javascript
vue 接口请求地址前缀本地开发和线上开发设置方式
2020/08/13 Javascript
JavaScript WeakMap使用详解
2021/02/05 Javascript
Python使用稀疏矩阵节省内存实例
2014/06/27 Python
Python采用socket模拟TCP通讯的实现方法
2014/11/19 Python
Python 性能优化技巧总结
2016/11/01 Python
Python基于回溯法子集树模板解决选排问题示例
2017/09/07 Python
Python中eval带来的潜在风险代码分析
2017/12/11 Python
对pandas进行数据预处理的实例讲解
2018/04/20 Python
python+ffmpeg批量去视频开头的方法
2019/01/09 Python
python async with和async for的使用
2019/06/20 Python
python-Web-flask-视图内容和模板知识点西宁街
2019/08/23 Python
Python matplotlib生成图片背景透明的示例代码
2019/08/30 Python
Jupyter notebook运行Spark+Scala教程
2020/04/10 Python
Windows下PyCharm配置Anaconda环境(超详细教程)
2020/07/31 Python
python抢购软件/插件/脚本附完整源码
2021/03/04 Python
《春雨》教学反思
2014/04/24 职场文书
大学生演讲稿
2014/04/25 职场文书
班委竞选演讲稿
2014/04/28 职场文书
党员教师四风问题对照检查材料
2014/09/26 职场文书
投诉信范文
2015/07/02 职场文书
生日寿星公答谢词
2015/09/29 职场文书
Python字符串对齐方法使用(ljust()、rjust()和center())
2021/04/26 Python
Spring 使用注解开发
2022/05/20 Java/Android
JavaScript实现一键复制内容剪贴板
2022/07/23 Javascript