JavaScript 媒体查询打破了 greensock

JavaScript media queries breaking greensock

本文关键字:greensock 媒体 查询 JavaScript      更新时间:2023-09-26

我正在尝试创建一个导航栏,当使用JavaScript和Greensock单击时,该导航栏可以滑入和滑出。出于某种原因,单击时操作在不同大小单击时随机不起作用,但有时它工作得很好。

我的代码如下,您可以在以下位置找到此导航的实时示例:http://www.kramergraphicdesign.com/Maura_Website/

    var resize = function(){
    var viewportWidth = $(window).width();
  var lastLiWith = $('#logo').width();
  console.log(openOrShut + " this is the true false var");

   if ($(window).width() >= 0 && $(window).width() <= 639 ) {  

          console.log("mobile");
          $("#logo, #close, .arrow-right").click(function()
          {
            console.log("mobile-click");
            if(openOrShut === false)
            {
              TweenLite.to("#custom-nav",".5",{x:viewportWidth-lastLiWith});
              openOrShut = true;
            }
            else{
              TweenLite.to("#custom-nav",".5",{x:0});
              openOrShut = false;
            }
          });
   }
   else if ($(window).width() >= 640 ) {  
          console.log("tablet");
          $("#logo, #close, .arrow-right").click(function()
          {
            console.log("tablet-click");
            if(openOrShut === false)
            {
              TweenLite.to("#custom-nav",".5",{x:400});
              openOrShut = true;
            }
            else{
              TweenLite.to("#custom-nav",".5",{x:0});
              openOrShut = false;
            }
          });

   } 
   else if ($(window).width() >= 1025 && $(window).width() <= 10000 ) {  
          console.log("dekstop");
          $("#logo, #close, .arrow-right").click(function()
          {
            console.log("desktop-click");
            if(openOrShut === false)
            {
              TweenLite.to("#custom-nav",".5",{x:400});
              openOrShut = true;
            }
            else{
              TweenLite.to("#custom-nav",".5",{x:0});
              openOrShut = false;
            }
          });
   } 
 };


$(document).ready(resize);

$(window).resize(function(){
resize();
});

首先,resize事件可能会发生很多,尤其是在拖动以调整窗口大小期间。这意味着两件事:

  1. 尽量减少您所做的工作量,使其快速运行,或对函数进行去抖动(例如使用 Lodash(,以便它仅在您短时间内停止接收调整大小事件后运行。
  2. 更重要的是,您每次都会添加新的click处理程序。

因此,它"随机"不做任何事情的原因是,每当您单击时,如果您之前已经调整了窗口大小,您实际上会多次运行函数来切换菜单。如果这个次数恰好是偶数,那么就没有净效应。

可能有很多方法可以解决此问题,但这里有两种:

  1. 附加一次单击处理程序,但检查处理程序内部的宽度,以确定将其动画处理到多远/如何以不同的方式响应不同的大小。
  2. 在重新添加之前,先取消注册现有的点击事件(使用 jQuery 的 .off()(,因此只有一个处理程序注册。我建议使用事件命名空间,以便您可以一次取消注册命名空间上的所有内容。

额外观察:您对平板电脑宽度的条件意味着桌面代码永远不会运行,因为平板电脑块没有<= 1024条件。