博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
原生JS实现全屏切换以及导航栏滑动隐藏及显示——修改
阅读量:5872 次
发布时间:2019-06-19

本文共 9584 字,大约阅读时间需要 31 分钟。

之前的文章:

这篇文章对上面链接的文章的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;//兼容Firefox185       }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,这里为4198          } 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 //导航栏高度固定为50px213 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) {
//换成判断id262 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代码没有修改。

转载于:https://www.cnblogs.com/fogwind/p/6286723.html

你可能感兴趣的文章