javascript 学习之自定义滚动条加滚轮事件

要自己写一个自定义滚动条加上滚轮事件,之前的没有滚轮事件不完整,今天整理了一个。

1.滚轮事件是不兼容的,firefox中是必需要用事件绑定的添加,用的DOMMouseScroll,当滚动鼠标的时候,只要鼠标滚动的方法就行了,而这通过检测datail的正负号就可以确定

2.其他的用mousewheel(Ie是onmousewheel),通过检测wheelDelta

  1 <!doctype html>
  2 <html>
  3 <head>
  4     <title>拖拽-加滚轮</title>
  5     <style>
  6         .main{ width: 300px; height: 400px; background: #ccc; margin: 10px auto;overflow: hidden;}
  7         .main-content{width: 300px; position: relative; height: 400px; overflow: hidden;}
  8         .main-content-c{width: 280px; background: #0F9932; position: absolute; top: 0;}
  9         .target{width: 20px; background: #eee;height: 400px; position: absolute; top: 0;right: 0;}
 10         .bar{width: 20px;min-height: 10px; background: #333;border-radius: 10px; position: absolute; top: 0;}
 11     </style>
 12     <script>
 13         window.onload= function(){
 14             var oContent = document.getElementById("content");
 15             var oTxt = getByClass(oContent,"main-content-c")[0];
 16             var oTarg = getByClass(oContent,"target")[0];
 17             var oBar = getByClass(oContent,"bar")[0];
 18 
 19             oBar.style.height = oTarg.offsetHeight*(oContent.offsetHeight/oTxt.offsetHeight)+'px';
 20 
 21             oBar.onmousedown = function(ev){
 22                 var oEvent = ev || event;
 23                 var disY = oEvent.clientY - oBar.offsetTop;
 24                 document.onmousemove = function(ev){
 25                     var oEvent = ev || event;
 26                     var t = oEvent.clientY - disY;
 27                     setPos(t);
 28                 }
 29                 document.onmouseup = function(){
 30                     document.onmousemove = null;
 31                     document.onmouseup = null;
 32 
 33                    oBar.releaseCapture && oBar.releaseCapture();
 34                 }
 35                 oBar.setCapture && oBar.setCapture();
 36                 oEvent.preventDefault && oEvent.preventDefault();
 37                 return false;
 38             }
 39             function setPos(t){
 40                 if(t<0){
 41                     t =0;
 42                 }else if(t>oTarg.offsetHeight-oBar.offsetHeight){
 43                     t = oTarg.offsetHeight-oBar.offsetHeight;
 44                 }
 45                 oBar.style.top = t+'px';
 46 
 47                 var scale = t/(oTarg.offsetHeight-oBar.offsetHeight);
 48                 oTxt.style.top = -scale*(oTxt.offsetHeight-oContent.offsetHeight)+'px';
 49 
 50             }
 51 
 52             addMouseWheel(oContent,function(down){
 53                 var t = oBar.offsetTop;
 54                 if(down){
 55                     t +=10;
 56                 }else{
 57                     t -=10;
 58                 }
 59                 setPos(t);
 60             });
 61 
 62         }
 63 
 64         function getByClass(oParent,sClass){
 65             if(oParent.getElementsByClassName){
 66                 return oParent.getElementsByClassName(sClass);
 67             }
 68             var aEle = oParent.getElementsByTagName("*");
 69             var aRes = [];
 70             var reg = new RegExp('\\b'+sClass+'\\b');
 71             for(var i=0;i<aEle.length;i++){
 72                 if(reg.test(aEle[i].className)){
 73                     aRes.push(aEle[i]);
 74                 }
 75             }
 76             return aEle;
 77         }
 78         function addMouseWheel(obj,fn){
 79             function fnWhell(ev){
 80                 var oEvent = ev || event;
 81                 var bDown = false;
 82 
 83                 bDown = oEvent.wheelDelta ? oEvent.wheelDelta<0 : oEvent.detail>0;
 84 
 85                 fn && fn(bDown,oEvent);
 86                 oEvent.preventDefault && oEvent.preventDefault();
 87                 return false;
 88             }
 89             if(window.navigator.userAgent.toLowerCase().indexOf("firefox")!=-1){
 90                 obj.addEventListener("DOMMouseScroll",fnWhell,false);
 91             }else{
 92                 addEvent(obj,'mousewheel',fnWhell);
 93             }
 94         }
 95         function addEvent(obj,sEv,fn){
 96             if(obj.addEventListener){
 97                 obj.addEventListener(sEv,fn,false);
 98             }else{
 99                 obj.attachEvent('on'+sEv,fn);
100             }
101         }
102     </script>
103 </head>
104 <body>
105 <div class="main">
106     <div class="main-content" id="content">
107         <div class="main-content-c">
108             正当我伸伸懒腰,打算上个厕所的时候,突然想到一件事情:如果模块越来越多,那么多文件都要分开加载?那岂不严重影响性能!?(啥,你不知道为啥?)
109             要压缩合并JavaScript呀!于是,我强忍住那股液体,开始用YUICompressor来压缩,并手动合并了两个文件。
110             这里就不展示结果了,因为很蛋疼,完全对不住我刚才忍住液体的勇气!结果当然是,失败。
111             为什么会失败呢?自己想了想,同时打开压缩后的代码一看,才发现原因:
112             压缩后之后,require变量变成了a变量。SeaJS是通过require字面来判断模块之间的依赖关系的,所以,require变量不能被简化。
113 
114             嗯,SeaJS已经替我们想到了这个问题,于是我们就采用SeaJS提供的方式来合并压缩吧(当然你也可以自己用别的方式压缩)。
115             SeaJS在2.0之前,是采用SPM作为压缩合并工具的,到了2.0,改为Grunt.js,SPM变为包管理工具,类似NPM(不知道NPM?Google一下吧)
116 
117             自动化不仅是科技带给社会的便利,也是Grunt带给前端的瑞士军刀。使用Grunt,可以很方便的定制各种任务,如压缩、合并等。使用Grunt之前,需要安装node环境和grunt工具,Google一下,十分钟后回来。
118             ……
119 
120             Grunt最核心的就两个部分,package.json、Gruntfile.js。
121 
122             a. package.json
123             Grunt把一个项目/目录视为一个npm模块,package.json就是用来描述这个模块的信息,包括name、version、author等等。
124             这里强调一下,Grunt既然将该目录视为一个模块,那么该模块当然可以依赖其他模块。
125             我们看本示例的:
126             正当我伸伸懒腰,打算上个厕所的时候,突然想到一件事情:如果模块越来越多,那么多文件都要分开加载?那岂不严重影响性能!?(啥,你不知道为啥?)
127             要压缩合并JavaScript呀!于是,我强忍住那股液体,开始用YUICompressor来压缩,并手动合并了两个文件。
128             这里就不展示结果了,因为很蛋疼,完全对不住我刚才忍住液体的勇气!结果当然是,失败。
129             为什么会失败呢?自己想了想,同时打开压缩后的代码一看,才发现原因:
130             压缩后之后,require变量变成了a变量。SeaJS是通过require字面来判断模块之间的依赖关系的,所以,require变量不能被简化。
131 
132             嗯,SeaJS已经替我们想到了这个问题,于是我们就采用SeaJS提供的方式来合并压缩吧(当然你也可以自己用别的方式压缩)。
133             SeaJS在2.0之前,是采用SPM作为压缩合并工具的,到了2.0,改为Grunt.js,SPM变为包管理工具,类似NPM(不知道NPM?Google一下吧)
134 
135             自动化不仅是科技带给社会的便利,也是Grunt带给前端的瑞士军刀。使用Grunt,可以很方便的定制各种任务,如压缩、合并等。使用Grunt之前,需要安装node环境和grunt工具,Google一下,十分钟后回来。
136             ……
137 
138             Grunt最核心的就两个部分,package.json、Gruntfile.js。
139 
140             a. package.json
141             Grunt把一个项目/目录视为一个npm模块,package.json就是用来描述这个模块的信息,包括name、version、author等等。
142             这里强调一下,Grunt既然将该目录视为一个模块,那么该模块当然可以依赖其他模块。
143             我们看本示例的:
144         </div>
145         <div class="target">
146             <div class="bar"></div>
147         </div>
148     </div>
149 </div>
150 </body>
151 </html>
View Code

posted @ 2014-08-14 18:06  泡沫幻想  阅读(467)  评论(0编辑  收藏  举报