zoukankan      html  css  js  c++  java
  • mousewheel

    感谢院长提供

      1 <!DOCTYPE html>
      2 <html>
      3 <head>
      4 <title></title>
      5 
      6 <style type="text/css">
      7 
      8 div {
      9     border: 1px solid #000;
     10     overflow: auto;
     11     height: 260px;
     12     width: 300px;
     13 }
     14 
     15 #tester2{
     16     width: 200px;
     17     height: 160px;
     18 }
     19 
     20 </style>
     21 </head>
     22 <body>
     23 No BOM UTF-8 File!
     24 <div id="tester">
     25 prevent<br />
     26 wheel<br />
     27 bubble<br />
     28 
     29 <div id="tester2">
     30 Chrome OK<br />
     31 Opera OK<br />
     32 Firefox OK<br />
     33 aaaa<br />
     34 aaaa<br />
     35 aaaa<br />
     36 aaaa<br />
     37 aaaa<br />
     38 aaaa<br />
     39 aaaa<br />
     40 aaaa<br />
     41 aaaa<br />
     42 aaaa<br />
     43 aaaa<br />
     44 aaaa<br />
     45 aaaa<br />
     46 </div>
     47 
     48 aaaa<br />
     49 aaaa<br />
     50 aaaa<br />
     51 aaaa<br />
     52 aaaa<br />
     53 aaaa<br />
     54 aaaa<br />
     55 aaaa<br />
     56 aaaa<br />
     57 aaaa<br />
     58 aaaa<br />
     59 aaaa<br />
     60 aaaa<br />
     61 </div>
     62 
     63 <script type="text/javascript">
     64 //通用事件增加函数
     65 var addEvent = window.addEventListener ? function(el, name, callback, useCapture){
     66     el.addEventListener(name, callback, !!useCapture);
     67     return callback;
     68 } : window.attachEvent ? function(el, name, callback){
     69     var f = function(e){
     70         e = e || window.event;
     71         callback.call(el, e || window.event);
     72     }
     73     el.attachEvent('on' + name, f);
     74     return f;
     75 } : function(el, name, callback){
     76     el['on' + name] = callback;
     77     return callback;
     78 }
     79 
     80 //取值鼠标滚动时,是使用wheelDelta还是使用detail。
     81 //在webkit和opera中,滚动事件对象都具有这两个属性
     82 //opera中,wheelDelta与detail的关系为:wheelDelta = -40 * detail
     83 //但是在webkit中,detail始终为0,wheelDelta始终120。
     84 //不过此例对最终值不关心,只在值的正负。
     85 //最终定为向下为正,对wheelDeta需修正。
     86 //由于属性的混乱,所以最后只能根据浏览器判定取哪个属性。
     87 //所以采用ua判断浏览器,标记useWheelDelta,最后判断值的取向。
     88 var useWheelDelta = false;
     89 var wheelEventName = 'mousewheel';
     90 navigator.userAgent.replace(/webkit|presto|firefox/i, function(m){
     91     m = m.toLowerCase();
     92     if(m === 'webkit'){
     93         useWheelDelta = true;
     94     } else if(m === 'firefox'){
     95         wheelEventName = 'DOMMouseScroll';
     96     }
     97 })
     98 
     99 var el = document.getElementById('tester');
    100 var el2 = document.getElementById('tester2');
    101 
    102 var
    103   el2_preventDefault_down = false    //是否阻止向下滚动的标记
    104 , el2_preventDefault_up = true    //是否阻止向上滚动的标记
    105 , el2_areaY = el2.scrollHeight - el2.offsetHeight    //可滚动区域大小,用于判断向下滚动是否到头
    106 ;
    107 
    108 addEvent(el2, wheelEventName, function(e){
    109     //修正滚动值
    110     //正值下 负值上
    111     var detail = useWheelDelta ? e.wheelDelta * -1 : e.detail;
    112     e.stopPropagation();
    113 
    114     if(
    115         (detail > 0 && el2_preventDefault_down)    //向下滚动 并且 滚动到头了
    116         ||    //或者
    117         (detail < 0 && el2_preventDefault_up)    //向上滚动 并且 滚动到头了
    118         ){
    119 
    120         console.log('to ' + (detail < 0 ? 'up' : 'down') + ' end');
    121 
    122         e.preventDefault();
    123     }
    124 
    125 });
    126 //scroll在wheel事件触发时还没有发生,
    127 //所以需要增加scroll判断某个方向上的滚动结果。
    128 //当滚动位置有剩余时,即便单次滚动的单位量大于剩余量
    129 //多余的量也不会溢出到父元素。万幸。
    130 addEvent(el2, 'scroll', function(e){
    131     e.stopPropagation();
    132     el2_preventDefault_up = el2.scrollTop <= 0;    //向上滚动到头了
    133     el2_preventDefault_down = el2_areaY - el2.scrollTop <= 0;    //向下滚动到头了
    134 });
    135 
    136 </script>
    137 
    138 </body>
    139 </html>
  • 相关阅读:
    写程序一定要养成良好习惯程序编码规范
    今天用GRID感觉它严重缺少灵活性
    REPEATER 嵌套
    DATAGRID的困惑。。。
    VB常用函数。。。。
    子父表,就是这么简单。。。。。
    今天解决了DataGrid无刷新全选删除问题。
    看来我还没完全懂DATAGRID。。。
    indexOf 和 lastIndexOf 使用
    javascript 要注意的事项
  • 原文地址:https://www.cnblogs.com/qzsonline/p/2908868.html
Copyright © 2011-2022 走看看