Vanilla JS setTimeout():识别错误行为
P粉797855790
P粉797855790 2024-04-02 20:44:40
0
1
459

我的汉堡式菜单上有一个用 HTML、CSS 和 Vanilla JavaScript 编写的动画。

预期结果

当您单击汉堡菜单按钮时,应该发生以下事件:

单击汉堡菜单图标时:

  1. main 旋转 180° 并在 2000ms 上沿高度缩小
  2. 2000ms 通过后,菜单出现,汉堡包图标变为 X

单击退出按钮时:

  1. 将页面再旋转 180° 覆盖菜单
  2. 隐藏菜单:display: none;
  3. 将退出按钮转换回汉堡图标

实际发生的情况

主要问题是由于第 12-14 行的 settimeout 而无法退出按钮。 这是为了更好地理解的代码片段。

var exitButton = document.getElementById("exit-button");


var exitButtonOnClick = function() {
  mobileMenu.classList.add("hidden");
}
var mobileMenuButton = document.getElementById("mobile-menu-enter");
var mobileMenu = document.getElementById("mobile-menu-id");
var mainContent = document.getElementById("main-content")

var mobileMenuButtonOnClick = function() {
  mainContent.classList.toggle("moved-away")
  setTimeout(function() {
    mobileMenu.classList.toggle("hidden");
  }, 2000);




  if (mobileMenu.classList.contains("hidden")) {
    mobileMenuButton.innerHTML = "<div class='line'></div><br><div class='line'></div><br><div class='line'></div>";

  }


};

mobileMenuButton.addEventListener("click", mobileMenuButtonOnClick);
* {
  margin: 0;
  box-sizing: border-box
}

body {
  overflow-x: hidden;
  font-size: large;
  margin: 0;
}

main {
  z-index: 99;
}

.mr-0 {
  margin-right: 0;
}

.ml-auto {
  margin-left: auto;
}

.d-block {
  display: block;
}

.nav-bar {
  z-index: 99;
  background-color: rgba(204, 204, 204, 0.9);
  padding: 10px;
  position: sticky;
  top: 0;
  height: 110px !important;
}

.nav-img {
  height: 150px;
  position: relative;
  bottom: 30px;
}

.nav-options {
  float: right;
  padding-right: 50px;
  position: relative;
  top: 15px;
}

.hidden {
  display: none !important;
  opacity: 0;
  transition: all 3000ms ease-in-out;
}

.line {
  width: 50px;
  background-color: white;
  z-index: 99;
  height: 0.5px;
}

.moved-away {
  transform: rotate(180deg);
  height: 0 !important;
  transition: all 2000ms ease-in-out;
}

.mobile-nav {
  position: sticky;
  top: 0;
}

.hamburger-menu {
  background-color: transparent;
  border: none;
  position: relative;
  left: 50px;
  z-index: 99;
  top: 10px;
}

.mobile-menu {
  display: flex;
  justify-content: center;
  padding-right: 40px !important;
  min-height: fit-content !important;
  line-height: 20vh;
  background-image: url("/resources/img_5.jpg");
  background-repeat: no-repeat;
  background-size: cover;
  background-attachment: fixed;
  width: 100%;
  height: 84vh;
  position: absolute;
  top: 95px;
  right: 0;
}

.mobile-menu li {
  width: 100%;
  display: inline-block;
}

.mobile-options {
  position: relative;
  top: 0;
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
}

.mobile-option {
  width: 90vw;
  height: 30px;
  font-family: 'Montserrat' sans-serif;
  display: inline-block;
  background-color: rgba(204, 204, 204, 0.8);
  color: black;
  border: none;
  border-radius: 15px;
  font-size: large;
  text-align: center;
}

.exit-btn {
  min-width: 50px;
  background-color: transparent;
  border: none;
  font-size: 4rem;
  color: white;
  font-family: 'Montserrat', sans-serif;
  font-weight: lighter;
  position: relative !important;
  bottom: 20px !important;
  z-index: 999999 !important;
}
<div class="nav-bar">
  <nav class="mobile-nav">
    <a href="index.html"><img src="/resources/Copy of The Coders Club.png" class="nav-img"></a>
    <div class="nav-options">
      <button class="d-block mr-0 ml-auto hamburger-menu" id="mobile-menu-enter">
                  <div class="line"></div><br>
                   <div class="line"></div><br>
                  <div class="line"></div>
                </button>
    </div>
  </nav>

  <div class="mobile-menu hidden" id="mobile-menu-id">
    <ul class="mobile-options">
      <a href="/about.html">
        <li><button class="mobile-option">About</button></li>
      </a>
      <a href="/classes.html">
        <li><button class="mobile-option" style="margin-top: 15%; margin-bottom: 15%;">Classes</button></li>
      </a>
      <a href="/contact.html">
        <li><button class="mobile-option">Contact</button></li>
      </a>
    </ul>
  </div>
</div>
<main id="main-content">
  Some content. Lorem ipsum... Hello, World!

</main>

P粉797855790
P粉797855790

全部回复(1)
P粉032900484

如果你的意思是退出点击只是恢复原始状态,没有动画,那是因为你已经在 .move-away 类上定义了 transition 属性,并且在退出点击时立即将其删除。

您应该将此 transition: all 2000ms escape-in​​-out; 移至 main 样式(CSS 文件中的第 14 行)以使动画双向工作

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板