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开发框架小成 学习js的朋友可以看看
Nov 16 Javascript
jQuery常见开发技巧详细整理
Jan 02 Javascript
浅谈Javascript 执行顺序
Dec 18 Javascript
jQuery查找节点并获取节点属性的方法
Sep 09 Javascript
分享一个原生的JavaScript拖动方法
Sep 25 Javascript
JavaScript实现兼容IE6的收起折叠与展开效果实例
Sep 20 Javascript
H5+C3+JS实现五子棋游戏(AI篇)
May 28 Javascript
基于vue 实现表单中password输入的显示与隐藏功能
Jul 19 Javascript
Node.js+Vue脚手架环境搭建的方法步骤
Mar 08 Javascript
vue-cli3使用mock数据的方法分析
Mar 16 Javascript
ES6 解构赋值的原理及运用
May 25 Javascript
浅谈Web Storage API的使用
Jun 23 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
php 论坛采集程序 模拟登陆,抓取页面 实现代码
2009/07/09 PHP
php文件上传表单摘自drupal的代码
2011/02/15 PHP
PHP goto语句简介和使用实例
2014/03/11 PHP
PHP的命令行命令使用指南
2015/08/18 PHP
功能强大的PHP发邮件类
2016/08/29 PHP
php 判断IP为有效IP地址的方法
2018/01/28 PHP
laravel解决迁移文件一次删除创建字段报错的问题
2019/10/24 PHP
JavaScript跨域方法汇总
2014/10/16 Javascript
全面理解JavaScript中的闭包
2016/05/12 Javascript
深入理解JavaScript中的并行处理
2016/09/22 Javascript
微信小程序 rich-text的使用方法
2017/08/04 Javascript
JavaScript编写的网页小游戏,很给力
2017/08/18 Javascript
微信小程序实践之动态控制组件的显示/隐藏功能
2018/07/18 Javascript
js核心基础之构造函数constructor用法实例分析
2019/05/11 Javascript
javascript实现blob加密视频源地址的方法
2019/08/08 Javascript
Python导出数据到Excel可读取的CSV文件的方法
2015/05/12 Python
Python中random模块用法实例分析
2015/05/19 Python
在Python中操作字典之clear()方法的使用
2015/05/21 Python
python调用摄像头显示图像的实例
2018/08/03 Python
django 控制页面跳转的例子
2019/08/06 Python
Python Tornado批量上传图片并显示功能
2020/03/26 Python
解决pytorch 交叉熵损失输出为负数的问题
2020/07/07 Python
零基础学Python之前需要学c语言吗
2020/07/21 Python
Python调用C/C++的方法解析
2020/08/05 Python
python中如何打包用户自定义模块
2020/09/23 Python
python爬虫中抓取指数的实例讲解
2020/12/01 Python
多视角3D逼真HTML5水波动画
2016/03/03 HTML / CSS
前端实现打印图像功能
2019/08/27 HTML / CSS
学生党员思想汇报范文
2014/01/09 职场文书
伊索寓言教学反思
2014/05/01 职场文书
雏鹰争章活动总结
2014/05/09 职场文书
学习十八届四中全会依法治国心得体会
2014/11/03 职场文书
婚礼新人答谢词
2015/01/04 职场文书
求职推荐信范文
2015/03/27 职场文书
2016年企业先进员工事迹材料
2016/02/25 职场文书
clear 万能清除浮动(clearfix:after)
2023/05/21 HTML / CSS