• 原生JS实现全屏切换以及导航栏滑动隐藏及显示——修改


    之前的文章:原生JS实现全屏切换以及导航栏滑动隐藏及显示——重构前

    这篇文章对上面链接的文章的JS代码进行了修改,解决了文章中提到的bug,并对代码进行了适当的整理,比之前更加的清晰。

    bug的解决的关键是删除了对时间间隔的判断。

    点我看在线演示

    JS代码:

      1 function $(id) {
      2    return document.getElementById(id);
      3 }
      4 
      5 //跨浏览器的添加事件的函数
      6 function addHandler(element, type, handler) {
      7    if(element.addEventListener) {
      8       element.addEventListener(type, handler, false);
      9    } else if(element.attachEvent) {
     10       element.attachEvent('on' + type, handler);
     11    } else {
     12       element['on' + type] = handler;
     13    }
     14 }
     15   
     16 //跨浏览器的添加mousewheel事件的函数
     17 function addMouseWheelEvent(element,func) {    
     18    if(typeof element.onmousewheel == "object") {
     19       addHandler(element,"mousewheel",func);
     20    } 
     21    if(typeof element.onmousewheel == "undefined") {
     22       //兼容Firefox
     23       addHandler(element,"DOMMouseScroll",func);
     24    }
     25 }
     26 /**********************************全屏滚动加导航条滑动显示/隐藏***************************************/
     27 ( function() {
     28 function Obj(id,t) {
     29    this.node = $(id);
     30    this.t = t;
     31    this.timer = null;
     32    this.startDate = 0;
     33    this.stopDate = 0;
     34 }
     35 
     36 Obj.prototype.getCurrentStyle = function() {
     37    if(document.defaultView.getComputedStyle) { //DOM 2标准方法
     38       return document.defaultView.getComputedStyle(this.node,null);
     39    } else {
     40       return this.node.currentStyle;//兼容IE方法
     41    }
     42 };
     43 
     44   /*******************************中小屏显示/隐藏导航栏中项目的代码*******************************/
     45   var navbarbtn = document.getElementById("navbar-toggle");
     46   //保存navbarbtn被点击了几次
     47   navbarbtn.count = 0;
     48   navbarbtn.onclick = function() {
     49       var navbaritem = document.getElementById("navbar-item");
     50       if(navbarbtn.count === 0) {
     51          //第一次点击时显示项目
     52          navbaritem.className = "navbar-item-block";
     53          navbarbtn.count++;
     54       } else {
     55          //第二次点击时隐藏项目,并重置navbarbtn.count
     56          navbaritem.className = "navbar-item-none navbar-item-block";
     57          navbarbtn.count = 0;
     58       } 
     59   };
     60 
     61   /*******************************向左隐藏导航条,向右显示导航条**********************************/
     62   var nav = new Obj('nav',300)
     63   nav.computedStyle = nav.getCurrentStyle(); //获取nav的计算样式表
     64   nav.bool = true; //存储导航栏的状态,显示时为true,隐藏时为false
     65   //向左隐藏
     66   nav.navSlideLeft = function() {
     67       if(nav.timer) {
     68         clearInterval(nav.timer);
     69       }
     70 
     71       var width = parseInt(nav.computedStyle.width), speed = width/(nav.t/10), left = parseInt(nav.computedStyle.left);
     72       if(!Boolean(left)) {
     73         left = 0;
     74       }
     75       if(left > -width) {
     76          nav.startDate = new Date();
     77          nav.timer = setInterval(function() {
     78             nav.stopDate = new Date();
     79             if(nav.stopDate - nav.startDate < nav.t) {
     80               left += -speed;
     81             } else {
     82               left = -width;
     83               clearInterval(nav.timer);
     84             }
     85             nav.node.style.left = left + 'px';
     86          },10);
     87       } else {
     88          //添加清除计时器代码(2017-1-15更新)
     89          clearInterval(nav.timer);
     90          return;
     91       }    
     92   };
     93 
     94   nav.navSlideRight = function() {
     95       if(nav.timer) {
     96         clearInterval(nav.timer);
     97       }
     98       
     99       var width = parseInt(nav.computedStyle.width), speed = width/(nav.t/10), left = parseInt(nav.computedStyle.left);
    100       if(left < 0) {
    101          nav.startDate = new Date();
    102          nav.timer = setInterval(function() {
    103             nav.stopDate = new Date();
    104             if(nav.stopDate - nav.startDate < nav.t) {
    105               left += speed; 
    106             } else {
    107               left = 0;
    108               clearInterval(nav.timer);
    109             }
    110             nav.node.style.left = left + 'px';
    111          },10);
    112       } else {
    113          //添加清除计时器代码(2017-1-15更新)
    114          clearInterval(nav.timer);
    115          return;
    116       }
    117   };
    118 
    119   /********************************全屏滚动代码**********************************/
    120   var pageBox = new Obj('page-box',300);
    121   pageBox.computedStyle = pageBox.getCurrentStyle();
    122 
    123   //获取有几屏
    124   pageBox.pageChildren = pageBox.node.getElementsByTagName('div').length;
    125 
    126   //切换计数
    127   pageBox.num = 1;
    128 
    129   //超时调用ID,优化mousewheel事件,防止连续触发
    130   pageBox.mousewheelTimer = null;
    131 
    132   pageBox.pageSlideUp = function(num) {
    133       if(pageBox.timer) {
    134          clearInterval(pageBox.timer);
    135       }
    136       var height = parseInt(pageBox.computedStyle.height);
    137       var top = parseInt(pageBox.computedStyle.top);
    138       var speed = height/(pageBox.t/10);
    139       pageBox.startDate = new Date();
    140       pageBox.timer = setInterval(function() {
    141          pageBox.stopDate = new Date();
    142          if(pageBox.stopDate - pageBox.startDate < pageBox.t) {
    143             top += -speed;
    144          } else {
    145             top = -height*num;
    146             clearInterval(pageBox.timer);
    147          }
    148          pageBox.node.style.top = top + "px";
    149       },10);
    150   };
    151 
    152   pageBox.pageSlideDown =  function(num) {
    153       if(pageBox.timer) {
    154          clearInterval(pageBox.timer);
    155       }
    156       var height = parseInt(pageBox.computedStyle.height);
    157       var top = parseInt(pageBox.computedStyle.top);
    158       var speed = height/(pageBox.t/10);
    159       pageBox.startDate = new Date();
    160       pageBox.timer = setInterval(function() {
    161          pageBox.stopDate = new Date();
    162          if(pageBox.stopDate - pageBox.startDate < pageBox.t) {
    163             top += speed;
    164          } else {
    165             top = -height*num;
    166             clearInterval(pageBox.timer);
    167          }
    168          pageBox.node.style.top = top + "px";
    169       },10);
    170   };
    171 
    172 
    173   pageBox.mouseWheelListener = function(event) {
    174       //通过超时调用优化滚动事件
    175       if(pageBox.mousewheelTimer) {
    176          clearTimeout(pageBox.mousewheelTimer);
    177       }
    178       event = event || window.event;
    179       //获取滚动方向
    180       var wheelDelta;
    181       if(event.wheelDelta) {
    182          wheelDelta = event.wheelDelta;
    183       } else {
    184          wheelDelta = -event.detail;//兼容Firefox
    185       }
    186     
    187       //当连续两次滚动鼠标滚轮的时间间隔小于pageBox.t时,不触发滚动效果
    188       if((pageBox.stopDate - pageBox.startDate > 0) && (pageBox.stopDate - pageBox.startDate < pageBox.t)) {
    189          return;
    190       }
    191 
    192 
    193       //当滚轮向后滚动时
    194       if(wheelDelta < 0) {
    195          if(pageBox.num <= pageBox.pageChildren - 1) {
    196             pageBox.mousewheelTimer = setTimeout(pageBox.pageSlideUp(pageBox.num),20);
    197             pageBox.num++;//最后等于pageBox.pageChildren,这里为4
    198          } else { 
    199             return;
    200          }     
    201       } else {//当滚轮向前滚动时
    202          if(pageBox.num <= pageBox.pageChildren && pageBox.num > 1) {
    203             pageBox.num--;
    204             pageBox.mousewheelTimer = setTimeout(pageBox.pageSlideDown(pageBox.num-1),20);
    205          } else {
    206             pageBox.num = 1;
    207             return;
    208          }
    209       }
    210     
    211      //隐藏导航条  
    212      //导航栏高度固定为50px
    213       if(parseInt(pageBox.computedStyle.width) > 768 && event.clientY > 50) {
    214          if(pageBox.num == 2 && nav.bool) {
    215             nav.navSlideLeft();
    216             nav.bool = false;
    217          }
    218          if(pageBox.num == 1 && !nav.bool) {
    219             nav.navSlideRight();
    220             nav.bool = true;
    221          }
    222       }
    223   };
    224 
    225 //给document添加鼠标滚动事件
    226 addMouseWheelEvent(document,pageBox.mouseWheelListener);
    227 
    228 //保存超时调用ID,优化resize事件,防止连续触发
    229 var resizeTimer = null;
    230 //视口宽度小于768时,导航条不隐藏,大于768时才隐藏
    231 //同时保证全屏切换时,每一屏的高度始终等于视口高度
    232 window.onresize = function() {
    233    if (resizeTimer) {
    234       clearTimeout(resizeTimer)
    235    }
    236    resizeTimer = setTimeout(function() {
    237       pageBox.node.style.top = (-parseInt(pageBox.computedStyle.height)*(pageBox.num-1)) + "px";
    238         
    239       //最小化时显示导航条
    240       if(parseInt(pageBox.computedStyle.width) < 768) {
    241          nav.node.style.left = '0px';
    242          nav.bool = true;
    243       } 
    244       //最大化时先显示导航条,再滑动隐藏导航条
    245       if(parseInt(pageBox.computedStyle.width) >= 768 && pageBox.num != 1) {
    246          nav.node.style.left = '0px';
    247          nav.navSlideLeft();
    248          nav.bool = false;
    249       }
    250           
    251        
    252    },20);
    253 };
    254 
    255 var navhead = document.getElementById('nav-head');
    256 navhead.onmouseover = function(event) {
    257    event = event || window.event;
    258    event.target = event.srcElement || event.target; 
    259 
    260    //防止navhead的子元素触发事件(也可以阻止事件冒泡)
    261    if(event.target.id != this.id) {//换成判断id
    262       return;
    263    }
    264    if(pageBox.num == 1 || parseInt(pageBox.computedStyle.width) < 768 ) {
    265       return;
    266    }
    267     
    268    if(!nav.bool) {
    269       nav.navSlideRight();
    270       nav.bool = true;
    271    }
    272 };
    273 
    274 pageBox.node.onmouseover = function(event) {
    275    if(pageBox.num == 1 || parseInt(pageBox.computedStyle.width) < 768 ) {
    276       return;
    277    }
    278    //alert(1);
    279    event = event || window.event;
    280     
    281    if(parseInt(pageBox.computedStyle.width) > 768 && pageBox.num != 1) {
    282       if(nav.bool) {
    283          nav.navSlideLeft();
    284          nav.bool = false;
    285       }
    286    }
    287    if(parseInt(pageBox.computedStyle.width) > 768 && pageBox.num == 1) {
    288       if(!nav.bool) {
    289          nav.navSlideRight();
    290          nav.bool = true;
    291       }
    292    }
    293     
    294 };
    295 } )();
    296 //改进余地:把nav.bool 集成到导航条的navSlideLeft()和navSlideRight()方法的内部
    View Code

    HTML代码和CSS代码没有修改。

  • 相关阅读:
    Linux创建AppImage打包程序(以TrustedQSL为例)
    SDR++跨平台开源SDR应用程序
    golang 无限极树的结构化返回
    IDEA 使用Git图文详解(学好idea操作git大全)
    多网卡主机无法上网
    蓝湖如何修改标注线条颜色
    设计模式代理模式
    设计模式装饰器模式
    设计模式适配器模式
    设计模式责任链模式
  • 原文地址:https://www.cnblogs.com/fogwind/p/6286723.html
Copyright © 2020-2023  润新知