javascript滚动条之ScrollBar.js

时间:2021-09-14 21:03:20
ScrollBar.js是一个仅仅120行的滚动条JS插件,使用非常方便 详情阅读:https://git.oschina.net/wuquanyao/scrollbar.js/*=================================  * ScrollBar.js beta  * Author:wuquanyao  * Email:

ScrollBar.js是一个仅仅120行的滚动条JS插件,使用非常方便
详情阅读:https://git.oschina.net/wuquanyao/scrollbar.js

    1. /*=================================
    2.  * ScrollBar.js beta
    3.  * Author:wuquanyao
    4.  * Email:wqynqa@163.com
    5.  *=================================*/
    6. var ScrollBar = {};
    7. (function(ScrollBar){
    8.     var parent,root,track,bar,tx,ch,h,sh,rate;
    9.     ScrollBar.adapter = function(config)
    10.     {
    11.         init(config);
    12.     }
    13.     function init(config)
    14.     {
    15.         parent = document.querySelector(config['selector']);
    16.         root   = parent.parentNode;
    17.         createBar();
    18.         mouseaction();
    19.     }
    20.     function createBar()
    21.     {
    22.         track = document.createElement('div');
    23.         track.setAttribute('class','scroll-track');
    24.         bar   = document.createElement('div');
    25.         bar.setAttribute('class','scroll-bar');
    26.         track.appendChild(bar);
    27.         root.appendChild(track);
    28.         sh = root.scrollHeight;
    29.         ch = root.offsetHeight;
    30.         tx = root.offsetTop;
    31.         h  = ch/sh*ch;
    32.         if(h<30){
    33.             bar.style.height = '30px';
    34.             h = 30;
    35.         }else{
    36.             bar.style.height = h+'px';
    37.         }
    38.         rate = (sh-ch)/(ch-h);
    39.     }
    40.     function mouseaction()
    41.     {
    42.         function eventparse(obj,type,func){
    43.             if(document.attachEvent){
    44.                 var events = {
    45.                     click:'onclick',
    46.                     mouseover:'onmouseover',
    47.                     mousemove:'onmousemove',
    48.                     mouseout:'onmouseout',
    49.                     mousedown:'onmousedown',
    50.                     mouseup:'onmouseup',
    51.                     wheel:'DOMMouseScroll'
    52.                 };
    53.                 obj.attachEvent(events[type],func);
    54.             }else{
    55.                 var events = {
    56.                     click:'click',
    57.                     mouseover:'mouseover',
    58.                     mousemove:'mousemove',
    59.                     mouseout:'mouseout',
    60.                     mousedown:'mousedown',
    61.                     mouseup:'mouseup',
    62.                     wheel:'DOMMouseScroll'
    63.                 };
    64.                 obj.addEventListener(events[type],func,false);
    65.             }
    66.         }
    67.         
    68.         function init(){
    69.             var bool = false,v;
    70.             eventparse(bar,'mousedown',function(event){
    71.                 bool  = true;
    72.             });            
    73.             eventparse(document,'mousemove',function(event){
    74.                 if(bool){
    75.                     if(event.clientY<=(tx+10)){
    76.                         v = 0;
    77.                     }else if(event.clientY>=(tx+ch-h)){
    78.                         v = tx+ch-h;
    79.                     }else{
    80.                         v = event.clientY;
    81.                     }
    82.                     parent.style.transform = 'translate(0px,'+(-v*rate)+'px)'; 
    83.                     bar.style.transform = 'translateY('+v+'px)';
    84.                 }
    85.             });
    86.             eventparse(document,'mouseup',function(event){ 
    87.                 bool = false;
    88.             });
    89.             // eventparse(track,'click',function(event){
    90.             //     event.stopPropagation();
    91.             //     bar.style.transition = 'all 0ms ease 0ms';
    92.             //     if(event.clientY<(tx+h)){
    93.             //         bar.style.transform = 'translate(0px,0px)';
    94.             //     }else if(event.clientY>=(tx+ch-h)){
    95.             //         bar.style.transform = 'translate(0px,'+(tx+ch-h)+'px)';
    96.             //     }else{
    97.             //         bar.style.transform = 'translate(0px,'+(event.clientY-h/2)+'px)';
    98.             //     }
    99.             //     parent.style.transform = 'translate(0px,'+((-event.clientY+tx)*rate)+'px)'; 
    100.             // });
    101.             var offset=0;
    102.             if (window.navigator.userAgent.indexOf("Firefox") >= 0) {
    103.                 eventparse(parent,'wheel',wheelEvent);    
    104.             }else{
    105.                 parent.onmousewheel=parent.onmousewheel=wheelEvent;
    106.             }
    107.             function wheelEvent(e){
    108.                 var transform,bO,wv = (e.detail/3*20) || (-(e.wheelDelta/120*20));
    109.                 if((offset<(sh-ch) &&(offset>=0))){
    110.                     transform = 'translate(0px,'+(-offset)+'px)'; 
    111.                     bO = 'translateY('+(offset/rate)+'px)';
    112.                     offset = ((offset+wv)>(sh-ch))?offset:( ((offset+wv)<=0)?0:(offset+wv) );
    113.                 }
    114.                 bar.style.transform = bO;
    115.                 parent.style.transform = transform; 
    116.             }
    117.         }
    118.         init();
    119.     }
    120. })(ScrollBar);

javascript滚动条之ScrollBar.js的更多相关文章

  1. 【JavaScript】使用纯JS实现多张图片的懒加载(附源码)

    一.效果图如下 上面的效果图,效果需求如下 1.还没加载图片的时候,默认显示加载图片背景图 2.刚开始进入页面,自动加载第一屏幕的图片 3.下拉界面,当一张图片容器完全显露出屏幕,即刻加载图片,替换背 ...

  2. 初探JavaScript(三)——JS带我&quot&semi;碰壁&quot&semi;带我飞

    已经写了两篇关于小白的JavaScript之行,不可否认,每一种语言都有其精华与糟粕之处,来不及细细体味其精华奥妙,也没法对其评头论足,只能先了解,后深入.到目前为止已经看完<JavaScrip ...

  3. 初探JavaScript(二)——JS如何动态操控HTML

    除去五一三天,我已经和<JavaScript Dom编程艺术>磨合了六天,第一印象很好.慢慢的,我发现这是一块排骨,除了肉还有骨头.遇到不解的地方就会多看几遍,实在不懂的先跳过,毕竟,初次 ...

  4. 强大的JavaScript动画图形库mo&period;js

    最近在学习前端动画方面知识时发现了挺有趣的一个动画的图形库mo.js,页面效果真是酷炫,有兴趣的同学可以研究下:). 酷炫的效果: 以下是官方的demo效果,更多详情请查看 mo.js http:// ...

  5. 省市县 三级 四级联动Javascript JQ 插件PCASClass&period;js

    想要使用这款组件,需要页面引入 PCASClass.js 核心文件,该文件在您的HTML文档<head>标签之内. <script type="text/javascrip ...

  6. 【转】《高级前端3&period;6》JavaScript多线程——Concurrent&period;Thread&period;js&comma; WebWork

    原文链接:http://www.cnblogs.com/woodk/articles/5199536.html JavaScript多线程,在HTML5 WebWork没出现之前很多人都是用Concu ...

  7. JavaScript模板引擎Template&period;js使用详解

    这篇文章主要为大家详细介绍了JavaScript模板引擎Template.js使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下   template.js 一款 JavaScript 模板引 ...

  8. 坑人的 Javascript 模块化编程 require&period;js

    坑人的 Javascript 模块化编程 require.js

  9. 坑人的 Javascript 模块化编程 sea&period;js

    坑人的 Javascript 模块化编程 sea.js 忧伤 加 蛋疼的 开始了 看文档 Sea.js 进行配置 seajs.config({ // 设置路径,方便跨目录调用 paths: { 'ar ...

随机推荐

  1. 使用AFNetworking 2&period;0 请求数据时出现错误 Request failed&colon; unacceptable content-type&colon; text&sol;html 解决方法

    使用AFNetworking 2.0 请求数据时出现错误 Request failed: unacceptable content-type: text/html 解决方法 添加一行 manager. ...

  2. Java之面向对象例子(三) 多态,重写,重载,equals&lpar;&rpar;方法和toString&lpar;&rpar;方法的重写

    重写(继承关系) 子类得成员方法和父类的成员方法,方法名,参数类型,参数个数完全相同,这就是子类的方法重写了父类的方法. 重载 在一个类里有两个方法,方法名是完全一样的,参数类型或参数个数不同. 例子 ...

  3. XSS Challenges闯关笔记

    前言 做xss做疯了再来一个. 地址:https://xss-quiz.int21h.jp/ ,这个貌似是日本的一个安全研究员yamagata21做的. 做到第九关就跪了,而总共有二十关.一半都还没有 ...

  4. Win 10 无法打开内核设备&OpenCurlyDoubleQuote;&bsol;&bsol;&period;&bsol;Global&bsol;vmx86”问题

    Win 10操作系统, VMWareWorkstation10 无法打开内核设备"\\.\Global\vmx86": 系统找不到指定的文件.你想要在安装 VMware Works ...

  5. mapper加载的3种方法

    <!-- mapper加载有3种方法: 1:通过resource或url加载单个mapper 2:通过mapper接口类名加载单个mapper 3:通过package批量加载多个mapper(推 ...

  6. 发布自己的类库到NuGet

    NuGet是一个为大家所熟知的Visual Studio扩展,通过这个扩展,开发人员可以非常方便地在Visual Studio中安装或更新项目中所需要的第三方组件,同时也可以通过NuGet来安装一些V ...

  7. HTML&amp&semi;javaSkcript&amp&semi;CSS&amp&semi;jQuery&amp&semi;ajax(九)

    一.HTML 1.单选按钮 <form action="><inpput type="radio" name="sex" value ...

  8. automapper demo

    最近做项目,需要把DataTable中的数据强类型化.于是试用了下比较常用的AutoMapper,通过看代码中附带的Demo与网上的教程,也算能够勉强使用了,现将学习笔记记录如下: namespace ...

  9. Python基本模块介绍&colon;sys、platform

    sys模块 常用函数 sys.argv 命令行参数,实现从程序外部向程序传递参数. sys.path 模块搜索路径. sys.platform 获取当前系统平台. sys.version 获取pyth ...

  10. c run-time library 和 standard c&plus;&plus; library

    参考: c run-time libraries:  http://msdn.microsoft.com/zh-cn/library/vstudio/abx4dbyh(v=vs.100).aspx H ...