【问题标题】:Mobile Menu Flashes up After Window Re-sizing (CSS & JS issue)调整窗口大小后移动菜单闪烁(CSS 和 JS 问题)
【发布时间】:2017-11-21 23:38:50
【问题描述】:

场景

我有一个移动菜单,当窗口低于 736 像素时显示。此菜单上有一个 javascript 切换,用于添加和删除显示移动菜单 ul(当然还有子 li 项)的 CSS 类。

当您调整窗口大小时,CSS 媒体查询会将桌面菜单换成单独的移动菜单,并且切换按计划工作。

问题

当我重新调整窗口大小然后打开和关闭移动菜单时,一切正常,当窗口随后再次重新调整大小时,当窗口点击时,移动 ul 和 li 会闪烁一秒钟再次出现 CSS 媒体查询断点 (736px)。

我不知道如何阻止这种情况的发生,它真的让我完全陷入了困境,我似乎已经为此花费了几个小时,但我无处可去。

如果有人可以帮助我,我将不胜感激。

P.S 如果移动菜单保持打开状态,我不介意在重新调整大小后移动菜单仍然存在 - 这是预期的行为。当移动菜单关闭并且窗口大小调整为桌面然后再次返回移动菜单时,就会发生菜单闪烁。

codepen:https://codepen.io/emilychews/pen/aVYGPr

JS

var mobileMenuButton = document.getElementById("mobile-menu-button")
var mobileMenuItems = document.getElementById("mobile-nav-menu-items")

// TOGGLE MOBILE MENU
var mobileMenu = false

function toggleMobileMenu() {

    if (mobileMenu === false) {

      mobileMenuItems.classList.remove("mobileMenuInactive")
      mobileMenuItems.classList.add("mobileMenuActive")
      mobileMenuButton.innerHTML = "Close"
      mobileMenu = true

    } else {

      mobileMenuItems.classList.add("mobileMenuInactive")
      mobileMenuItems.classList.remove("mobileMenuActive")
      mobileMenuButton.innerHTML = "Menu"
      mobileMenu = false

    }
}

mobileMenuButton.addEventListener("click", function() {
    toggleMobileMenu()
}, false)

CSS

body, ul {padding: 0; margin: 0}

#main-header {width: 100%; height: 100px;}

/* desktop navigation */
#main-navigation {
  position: relative;
  width: 100%;
  height: 100px;
  background: red;
  display: flex;
  justify-content: space-between;
  box-sizing: border-box;
  padding: 10px 5% 10px 5%;
  align-items: center;
}

#logo-holder {
  width: 150px;
  height: 66px;
  background-color: grey;
}

ul#nav-menu-items {
  display: flex;
  margin-left: auto;
}

#main-navigation ul li {list-style-type: none;}

#main-navigation ul#nav-menu-items li a {
  padding: 10px 15px;
  margin: 0 5px;
  box-sizing: border-box;
  background: yellow;
  text-decoration: none;
  color:#000;
}

#main-navigation ul#nav-menu-items li a:hover {
  color:blue;
  transition: color .25s;
}

#mobile-menu-button, ul#mobile-nav-menu-items {
  display: none;
}

/* --- MOBILE MENU AND DROPDOWN  ---
Below is a separate menu added for mobiles.
*/

@media screen and (max-width : 736px) {

/*  hides desktop menu  */

  ul#nav-menu-items {display: none}

  #mobile-menu-button {
    display: flex;
    justify-content: center;
    background: blue;
    color: white;
    padding: 10px 15px;
    min-width: 75px;
    cursor: pointer;}

  ul#mobile-nav-menu-items {
    opacity: 0;
    transform: scaleY(0);
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    min-width: 150px;
    background: blue;
    position: absolute;
    right: 5%;
    top: 100px;
    padding: 10px 0px;

  }

  ul#mobile-nav-menu-items li {
    padding: 10px 10px;
  }

  ul#mobile-nav-menu-items li a {
    padding: 10px 15px;
    color: white;
    text-decoration: none;
    transition: color .3s; 
  }

  ul#mobile-nav-menu-items li a:hover {
    color: lightblue;
  }

/* -------- MOBILE CLASSES ADDED WITH JavaScript*/

#mobile-nav-menu-items.mobileMenuActive {
  animation: showMobileMenu .5s ease-in forwards;
}

@keyframes showMobileMenu {
  0% {opacity: 0;transform: scaleY(0);}
  1% {opacity: 0; transform: scaleY(1);}
  100% {opacity: 1; transform: scaleY(1);}
}

#mobile-nav-menu-items.mobileMenuInactive {
  animation: removeMobileMenu .5s ease-out forwards;
}

@keyframes removeMobileMenu {
  0% {opacity: 1; transform: scaleY(1);}
  99% {opacity: 0; transform: scaleY(1);}
  100% {opacity: 0; transform: scaleY(0);}
}

} /*END OF MOBILE MENU STYLING*/

HTML

<header id="main-header">
<!--   desktop nav -->
  <nav id="main-navigation"> 
    <div id="logo-holder"></div>
    <ul id="nav-menu-items">
      <li class="menu-item menu-item-1"><a href="https://www.google.com">News</a></li>
      <li class="menu-item menu-item-2"><a href="https://www.google.com">About</a></li>
      <li class="menu-item menu-item-3"><a href="https://www.google.com">Contact</a></li>
    </ul>
<!--    mobile nav -->
    <ul id="mobile-nav-menu-items">
      <li class="mobile-menu-item mobile-menu-item-1"><a href="https://www.google.com">News</a></li>
      <li class="mobile-menu-item mobile-menu-item-2"><a href="https://www.google.com">About</a></li>
      <li class="mobile-menu-item mobile-menu-item-3"><a href="https://www.google.com">Contact</a></li>
    </ul>
<!--     button for triggering mobile nav -->
    <div id="mobile-menu-button">Menu</div>

  </nav>
</header>

【问题讨论】:

    标签: javascript html css


    【解决方案1】:

    我刚刚删除了下面的代码,它可以正常工作,可能是因为您在 CSS 和 JS 文件中操作相同的事件。

    @keyframes removeMobileMenu {
      0% {opacity: 1; transform: scaleY(1);}
      99% {opacity: 0; transform: scaleY(1);}
      100% {opacity: 0; transform: scaleY(0);}
    }
    

    【讨论】:

    • 我希望动画不只是消失,所以这不是一个选项。
    猜你喜欢
    • 2015-08-29
    • 2014-12-29
    • 1970-01-01
    • 2016-03-19
    • 1970-01-01
    • 2019-01-09
    • 1970-01-01
    • 2018-09-07
    • 2019-12-06
    相关资源
    最近更新 更多