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 相关文章推荐
一页面多XMLHttpRequest对象
Jan 22 Javascript
超级酷和最实用的jQuery实例收集(20个)
Apr 21 Javascript
判断iframe里的页面是否加载完成
Jun 06 Javascript
HTML5 Shiv完美解决IE(IE6/IE7/IE8)不兼容HTML5标签的方法
Nov 25 Javascript
javascript中eval解析JSON字符串
Feb 27 Javascript
Bootstrap3.0学习教程之JS折叠插件
May 27 Javascript
JavaScript中offsetWidth的bug及解决方法
May 17 Javascript
详解vue-cli3使用
Aug 14 Javascript
AngularJS 多指令Scope问题的解决
Oct 25 Javascript
详解vuejs2.0 select 动态绑定下拉框支持多选
Apr 25 Javascript
javascript实现鼠标点击生成文字特效
Dec 24 Javascript
jquery更改元素属性attr()方法操作示例
May 22 jQuery
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连接mysql是否成功的代码分享
2014/01/24 PHP
tp5框架前台无限极导航菜单类实现方法分析
2020/03/29 PHP
JavaScript具有类似Lambda表达式编程能力的代码(改进版)
2010/09/14 Javascript
js检测判断日期大于多少天的方法
2015/05/04 Javascript
简介alert()与console.log()的不同
2015/08/26 Javascript
Zero Clipboard实现浏览器复制到剪贴板的方法(多个复制按钮)
2016/03/24 Javascript
JavaScript语言精粹经典实例(整理篇)
2016/06/07 Javascript
PHP实现本地图片上传和验证功能
2017/02/27 Javascript
JS+html5 canvas实现的简单绘制折线图效果示例
2017/03/13 Javascript
详解微信小程序 template添加绑定事件
2017/06/23 Javascript
JavaScript条件判断_动力节点Java学院整理
2017/06/26 Javascript
webpack使用 babel-loader 转换 ES6代码示例
2017/08/21 Javascript
详解Vue.js Mixins 混入使用
2017/09/15 Javascript
详解weex默认webpack.config.js改造
2018/01/08 Javascript
nodejs图片处理工具gm用法小结
2018/12/12 NodeJs
mpvue开发音频类小程序踩坑和建议详解
2019/03/12 Javascript
实现vuex与组件data之间的数据同步更新方式
2019/11/12 Javascript
vuex的使用和简易实现
2021/01/07 Vue.js
详解vite+ts快速搭建vue3项目以及介绍相关特性
2021/02/25 Vue.js
[11:01]2014DOTA2西雅图邀请赛 冷冷带你探秘威斯汀
2014/07/08 DOTA
[43:33]EG vs Spirit Supermajor 败者组 BO3 第一场 6.4
2018/06/05 DOTA
从零学Python之hello world
2014/05/21 Python
Python的Django框架下管理站点的基本方法
2015/07/17 Python
Python实现针对给定字符串寻找最长非重复子串的方法
2018/04/21 Python
Django使用Mysql数据库已经存在的数据表方法
2018/05/27 Python
基于python纯函数实现井字棋游戏
2020/05/27 Python
Pycharm制作搞怪弹窗的实现代码
2021/02/19 Python
canvas实现圆形进度条动画的示例代码
2017/12/26 HTML / CSS
阿里健康官方海外旗舰店:阿里健康国际自营
2017/11/24 全球购物
固特异美国在线轮胎店:Goodyear Tire
2019/02/23 全球购物
函数指针的定义是什么
2016/08/14 面试题
机械专业应届生求职信
2013/09/21 职场文书
美国探亲签证邀请信
2014/02/05 职场文书
《值日生》教学反思
2014/02/17 职场文书
爱护公共设施演讲稿
2014/09/13 职场文书
2014年财政工作总结
2014/12/10 职场文书