js原生封装自定义滚动条

摘要:
1/*2*@作者:dothin前端3*@日期:2015-11-2100:12:154*@上次修改人:dothin前端5*@上次更改时间:2015-11-200:29:126*/7!function(){8varEventUtil={9addHandler:函数(obj,类型,处理程序){10if(obj.addEventLi
  1 /* 
  2  * @Author: dothin前端
  3  * @Date:   2015-11-21 00:12:15
  4  * @Last Modified by:   dothin前端
  5  * @Last Modified time: 2015-11-21 00:29:12
  6  */
  7 ! function() {
  8     var EventUtil = {
  9         addHandler: function(obj, type, handler) {
 10             if (obj.addEventListener) {
 11                 obj.addEventListener(type, handler, false);
 12             } else if (obj.attachEvent) {
 13                 obj.attachEvent("on" + type, handler);
 14             } else {
 15                 obj["on" + type] = handler;
 16             }
 17         },
 18         removeHandler: function(obj, type, handler) {
 19             if (obj.removeEventListener) {
 20                 obj.removeEventListener(type, handler, false);
 21             } else if (obj.detachEvent) {
 22                 obj.detachEvent("on" + type, handler);
 23             } else {
 24                 obj["on" + type] = null;
 25             }
 26         },
 27         getEvent: function(event) {
 28             return event ? event : window.event;
 29         },
 30         getTarget: function(event) {
 31             return event.target || event.srcElement;
 32         },
 33         preventDefault: function(event) {
 34             if (event.preventDefault) {
 35                 event.preventDefault();
 36             } else {
 37                 event.returnValue = false;
 38             }
 39         },
 40         stopPropagation: function(event) {
 41             if (event.stopPropagation) {
 42                 event.stopPropagation();
 43             } else {
 44                 event.cancelBubble = true;
 45             }
 46         },
 47         getWheelDelta: function(event) {
 48             if (event.wheelDelta) {
 49                 return event.wheelDelta;
 50             } else {
 51                 return -event.detail * 40;
 52             }
 53         }
 54     };
 55     //tip:滚动条上面的长度可变的按钮
 56     //scrollBar:滚动条
 57     //section:内容父级
 58     //article:内容
 59     function ScrollBar(tip, scrollBar, section, article) {
 60         this.oTip = document.getElementById(tip);
 61         this.oScrollBar = document.getElementById(scrollBar);
 62         this.oSection = document.getElementById(section);
 63         this.oArticle = document.getElementById(article);
 64         var _this = this;
 65         this.init();
 66         this.oTip.onmousedown = function(ev) {
 67             _this.Down(ev);
 68             return false;
 69         };
 70         //给需要加滚动事件的元素加滚动事件
 71         EventUtil.addHandler(this.oSection, 'mousewheel', function(ev) {
 72             _this.onMouseWheel(ev);
 73         }); //ie,chrome
 74         EventUtil.addHandler(this.oSection, 'DOMMouseScroll', function(ev) {
 75             _this.onMouseWheel(ev);
 76         }); //ff
 77         EventUtil.addHandler(this.oScrollBar, 'mousewheel', function(ev) {
 78             _this.onMouseWheel(ev);
 79         }); //ie,chrome
 80         EventUtil.addHandler(this.oScrollBar, 'DOMMouseScroll', function(ev) {
 81             _this.onMouseWheel(ev);
 82         }); //ff
 83     };
 84     //初始化滚动条,内容不够时隐藏滚动条,滚动条按钮长度由内容长度决定
 85     ScrollBar.prototype.init = function() {
 86         if (this.oSection.offsetHeight >= this.oArticle.offsetHeight) {
 87             this.oScrollBar.style.display = 'none';
 88         } else {
 89             this.oTip.style.height = 100 * this.oScrollBar.offsetHeight / (this.oArticle.offsetHeight - this.oSection.offsetHeight) + 'px';
 90             //document.title = this.oTip.style.height;
 91         }
 92         //各浏览器行高,字体大小,字体类型,不一致,要想初始化滚动条一致,先统一样式
 93     };
 94     ScrollBar.prototype.Down = function(ev) {
 95         var oEvent = EventUtil.getEvent(ev);
 96         var _this = this;
 97         this.maxH = this.oScrollBar.offsetHeight - this.oTip.offsetHeight;
 98         this.disY = oEvent.clientY - this.oTip.offsetTop;
 99         document.onmousemove = function(ev) {
100             _this.fnMove(ev);
101             return false;
102         }
103         document.onmouseup = function(ev) {
104             _this.Up(ev);
105         }
106     };
107     ScrollBar.prototype.fnMove = function(ev) {
108         var oEvent = EventUtil.getEvent(ev);
109         var t = oEvent.clientY - this.disY;
110         this.Move(t);
111     };
112     ScrollBar.prototype.onMouseWheel = function(ev) {
113         var oEvent = EventUtil.getEvent(ev);
114         this.maxH = this.oScrollBar.offsetHeight - this.oTip.offsetHeight;
115         this.disY = oEvent.clientY - this.oTip.offsetTop;
116         if (EventUtil.getWheelDelta(oEvent) > 0) {
117             var t = this.oTip.offsetTop - 10;
118             this.Move(t);
119         } else {
120             var t = this.oTip.offsetTop + 10;
121             this.Move(t);
122         }
123         EventUtil.preventDefault(oEvent);
124     };
125     ScrollBar.prototype.Move = function(t) {
126         if (t < 0) {
127             t = 0;
128         } else if (t > this.maxH) {
129             t = this.maxH;
130         }
131         this.oTip.style.top = t + 'px';
132         this.contentH = this.oArticle.offsetHeight - this.oSection.offsetHeight;
133         this.oArticle.style.top = -this.contentH * this.oTip.offsetTop / this.maxH + 'px';
134     };
135     ScrollBar.prototype.Up = function(ev) {
136         document.onmousemove = document.onmouseup = null;
137     };
138     window.ScrollBar = ScrollBar;
139 }();

调用实例:

 1 <!DOCTYPE html>
 2 <html lang="en" id="html">
 3 <head>
 4     <meta charset="UTF-8" />
 5     <title>title here</title>
 6     <script src="scrollBar.js"></script>
 7     <style>
 8         #section{position:absolute;top:200px; left:50px;width:300px; height:298px; border:1px solid #999; overflow: hidden; }
 9         #article{position:absolute;padding:20px; text-indent: 30px;font-size: 14px; line-height: 25px; font-family: '微软雅黑';}
10         #scrollBar{ position:absolute;top:0; right:0;height:300px; width:20px; background:#ddd;}
11         #tip{position:absolute;top:0;left:0; background:#999; width:20px; min-height:20px; cursor:pointer;}
12     </style>
13 </head>
14 <body id="body" style="height:2000px;">
15     <div id="section">
16         <div id="article">
17             一滴血而已,居然带动天地大势,滚滚而涌,让大漠沸腾,沙浪拍天,所有人都在颤栗!
18 
19     异域百世
20    一滴血,居然造成这种要灭世般的景象,怎能令人不畏?
21    
22    “不朽之王!”
23    
24    这一刻,异域百万大军顶礼膜拜后,全都高呼,他们激动,神色疯狂,带着敬仰。还有无比的崇敬,仰望血海。
25    
26    五色血液浩荡,真的如汪洋席卷而来,淹没这里。
27    的杀气,滔天而上,滚滚沸腾。
28 
29     大旗横空,如银河翻卷。猎猎作响,绽放出刺目的光,上面有血迹,虽然过去了一个纪元,还未彻底干涸。
30 
31     因为,那是属于仙王的血,此时像是要滴落了下来,从旗面内不断渗出!
32     万大军全都跪伏了下去,进行膜拜!
33 
34     刹那,域外诸多星斗都在摇动,整片大宇宙都要震荡起来,那种威势不可想象,撼天动地,岁月长河跟着浮现。
35 
36     一滴血而已,就造成了这般无法理解的恐怖景象!
37 
38     所有人都知道,那是异域的无上强者演绎的,真身过不来,洒出一滴血,跨过天渊,飞临这片战场中。
39 
40  一滴血,晶莹欲滴,绽放五色不朽之光,滚滚而来,看着很小一滴,但是气势磅礴,压的乾坤轰鸣,要崩溃了。
41    
42    帝关,城墙上。
43    
44    许多人胆寒,哪怕有巨城可守,难以攻破,众人也惶恐,神魂都在不由自主的颤栗。
45    
46    “我就知道,孟天正惹大祸了,我都已经谈好条件,他还出城,今日若有大难,他将是千古罪人!”金太君说道。
47    
48    至于各族修士,包括金系人马、杜家等都早已说不出话来,那种恐怖波动,让他们一个脸色苍白。
49    
50    许多人都觉得,不朽之王是不可战胜的,万一他们真的动身过来,城破了怎么办?
51    
52    “应该……不会跨界吧?”一些人颤声道,这是杜家的大统领。
53    
54    “跨界与否,一直是五五之数,就看他们的心意了!”金太君手拄着木杖说道。
55    
56    帝关前,出城作战的帝关修士自然也都面色发白了,虽然说他们很勇猛,无所畏惧,但是那种压迫让他们身体难受。
57    
58    轰!
59    
60    几件仙器发光,隔绝外界,绽放出一缕又一缕白雾,那是仙气在弥漫,守护了他们。
61    
62    然而,那滴血也发生了奇异的变化。迅速放大,如同汪洋一般,席卷了天上地下,迅速而来。铺天盖地。
63    
64    仿佛世界末日来临,震撼人间,所有人都惶恐,难以抗拒。
65    
66    域外,一颗又一颗星体都在跟着颤栗。在抖动,间要解体,要在这一刻崩开。
67    
68    
69    “铁血战旗,不复苏更待何时!”孟天正站在那里,一招手,将那面破烂的战旗取到手中,一声大吼,而后猛力将它掷出。
70 
71     破烂的战旗,饱经岁月洗礼。带着万古的沉重与沧桑,哗的一声卷动,朝前方飞去,而后不断放大。
72 
73     到了最后。它抖动起来,原本暗淡的旗面,发出盖
74         </div>
75         <div id="scrollBar">
76             <div id="tip"></div>
77         </div>
78     </div>
79     <script>
80         new ScrollBar('tip','scrollBar','section','article');
81     </script>
82 </body>
83 </html>

免责声明:文章转载自《js原生封装自定义滚动条》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇vue 实现分类渲染数据linux使用xampp安装MediaWiki环境下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Web--js高级--11月30日随笔

一: 面向对象的三种方式: 1.单例模式 2.工厂模式 3.构造函数 js天生自带的类 Object 基类: Function Array Number Math Boolean Date Regexp String 二:事件 浏览器客户端上客户出发的行为都成为是事件 所有的事件都是天生自带的,不需要我们去绑定,只需要我们去触发。 通过 obj.事件名=...

浏览器滚动条的参数总结

有朋友常提关于IE滚动条的问题,特总结该贴。简单地介绍一下涉及浏览器滚动条的样式表内容(某些样式需ie5.5+才能支持):1.overflow内容溢出时的设置(设定被设定对象是否显示滚动条)    overflow-x水平方向内容溢出时的设置    overflow-y垂直方向内容溢出时的设置    以上三个属性设置的值为visible(默认值)、scro...

android 内存泄漏,以及检测方法

1、为什么会产生内存泄漏 当一个对象已经不需要再使用本该被回收时,另外一个正在使用的对象持有它的引用从而导致它不能被回收,这导致本该被回收的对象不能被回收而停留在堆内存中,这就产生了内存泄漏。 2、内存泄漏对程序的影响 内存泄漏是造成应用程序OOM的主要原因之一。我们知道Android系统为每个应用程序分配的内存是有限的,而当一个应用中产生的内存泄漏比较多...

Handler为什么可能会造成内存泄漏以及可用的四种解决方法

在Android系统中,Handler是一个消息发送和处理机制的核心组件之一,与之配套的其他主要组件还有Looper和Message,MessageQueue。 根据官网的描述 There are two main uses for a Handler: (1) to schedule messages and runnables to be execut...

fullcalendar日历控件知识点集合

1、基本的语法: 首先,fullcalendar和JQUERY一样,以面向对象的方式来组织代码。当然,这里的面向对象不过指能够把整个fullcalendar理解为一个类,这个类里包含有非常多的属性、方法、托付(函数回调)作为成员变量。通过为这些成员变量赋值,就可以实例化出一个符合自己需求的fullcalendar实例出来,即终于在浏览器里渲染出的日历。换...

JS阻止默认行为

如果事件可取消,则取消该事件,而不停止事件的进一步传播。 语法 event.preventDefault(); 案例 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>ev...