如何让 javascript 打开和关闭侧边菜单?

How do I get javascript to toggle a side menu on and off?

所以我正在尝试使用同一个按钮来打开和关闭侧边菜单。但是,当我单击按钮时,侧面菜单没有任何反应。代码看起来应该可以工作,但我不知道为什么不行。

菜单的高度应从 0 变为 220 像素,链接的不透明度应从 0 变为 1,从隐藏变为可见,再次计时时则相反。但我唯一能开始工作的是点击时的汉堡包动画。有帮助吗?

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">

    <link rel="stylesheet" href="style.css">

    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>

    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

    <title>Document</title>
</head>

<nav>
    <section id="navbar">
        <!-- Navigation Topper -->
        <div class="container topper-flex">
            <div class="topper-content">
                <i class="fas fa-phone"></i>
                <p class="topper-content">(354) 994-6746</p>
                <i class="fas fa-phone"></i>
                <p class="topper-content">bobbylarrys@icloud.com</p>
                <i class="fas fa-phone"></i>
                <p class="topper-content">117 Southeast 4th Ave Deerfield Beach, FL 33441</p>
            </div>
        </div>

        <!-- Mobile Navigation Header -->
        <div class="mobile-nav container">
            <img id="mobile-logo-1" src="images/maple-logo.png" alt="test" height="50" width="160"> 

            <!-- Hamburger Menu -->
            <div class="open-slide container">
                <div id="wrapper" onclick="toggleNav()">
                    <div class="main-item menu ">
                        <span class="line line01"></span>
                        <span class="line line02"></span>
                        <span class="line line03"></span>
                    </div>
                </div>
            </div>
        </div>

        <!-- Middle navigation -->
        <div id="brand">
            <div class="brand-bar container">
                <img src="images/maple-logo.png" alt="test" height="50" width="160">
                <div class="branding-bar container">
                    <div class="quote">
                        <!-- Icon -->
                        <div class="quote-block">
                            <p>NEED AN ESTIMATE</p>
                            <p>GET A FREE QUOTE</p>
                        </div>
                    </div>
                    <div class="call">
                        <!-- Icon -->
                        <div class="call-block">
                            <p>CALL US NOW</p>
                            <p>(354) 994-6746</p>
                        </div>
                    </div>
                </div>
            </div>
        </div>

        <!-- Desktop Navbar -->
        <div class="navbar-menu">
            <div class="container">
                <ul class="navbar-links">
                    <li><a class="active" href="index.html">HOME</a></li>
                    <li><a href="about.html">ABOUT</a></li>
                    <li><a href="dent.html">DENT REPAIR</a></li>
                    <li><a href="gallery.html">GALLERY</a></li>
                    <li><a href="contact.html">CONTACT US</a></li>
                </ul>
            </div>
        </div>
    </section>

</nav>

<!-- Side menu -->
<div id="side-menu" class="side-nav">
    <ul id="on-top">
        <li class="nav-item"><a class="side-active" href="index.html">HOME</a></li>
        <li class="nav-item"><a href="services.html">ABOUT</a></li>
        <li class="nav-item"><a href="jobs.html">DENT REPAIR</a></li>
        <li class="nav-item"><a href="about.html">GALLERY</a></li>
        <li class="nav-item"><a href="contact.html">CONTACT US</a></li>
    </ul>
</div>

<body>
    <script type="text/javascript" src="nav.js"></script>
    <script type="text/javascript" src="test.js"></script>
</body>
</html>
body {
    margin: 0;
    padding: 0;
}

* {
    font-family: 'Lato', sans-serif;
}

.container {
    padding: 2em 0;
}

/* hidden desktop elements */

.topper-flex,
#brand,
.navbar-menu {
    display: none;
}

/*-- -------------------------- -->
<---         NAVIGATION         -->
<--- -------------------------- -*/

.navbar {
    height: auto;
    display: flex;
    flex-direction: row;
    align-items: center;
}

/* logo and hamburger container */
.mobile-nav {
    display: flex;
    flex-direction: row;
    align-items: center;
    justify-content: center;
    padding: 0;
    height: 100px;
    background: #000;
    position: relative;
}

/* Hamburger Menu */
.open-slide {
    display: inline-block;
    width: auto;
    padding: 0;
    position: absolute;
    right: 2em;
    top: 36px;
}

#wrapper {
    background: transparent;
    display:inline-block;
    margin:0px;
    position: absolute;
    cursor:pointer;
    right: 0;
}

.main-item {
    width:30px;
    height:30px;
    position:relative;
}

.line {
    position: absolute;
    height: 2px;
    width:100%;
    background:white;
    border-radius:1.5px;
    transition: all cubic-bezier(0.25, 0.1, 0.28, 1.54) 0.32s;
}

.line01 {
    top:19%;
}

.line02 {
    top:49%;
}

.line03 {
    top:79%;
}

.menu.close .line01 {
    transform:rotate(45deg);
    top:49%;
}

.menu.close .line02, .menu.close .line03 {
    transform:rotate(-45deg);
    top:49%;
}

/* Hidden Menu */
#side-menu {
    background: #231F20;
}

.side-nav {
    visibility: hidden;
    height: 0;
    transition: 0.3s 
}

.side-active {
    color: #C47625;
}

ul {
    text-align: center;
    padding: 30px 0;
    margin: 0;
}

ul a {
    text-decoration: none;
    color: #999;
    line-height: 2em;
    font-weight: 700;

    transition: 0.3s ease;
}

ul li {
    list-style: none;
}

.menu-center {
    position: absolute;
    top: 9px;
}

.menu-bottom {
    position: absolute;
    bottom: 0;
}

/* jQuery for the navigation animation */

$("#wrapper").click( function() {
    $(".menu").toggleClass("close");
});

/* Code for the toggling of the navbar */

let toggleNavStatus = false;

let toggleNav = function () {
    let getSidebar = document.querySelector(".side-nav");
    let getSidebarUL = document.querySelector(".side-nav ul");
    let getSidebarLinks = document.querySelectorAll(".side-nav a");

    if (toggleNavStatus === false) {
        getSidebarUL.style.visibility = "visible";
        getSidebarLinks.style.opacity = "1";
        getSidebar.style.height = "220px";

        toggleNavStatus = true;
    } 

    else if (toggleNavStatus === true) {
        getSidebarUL.style.visibility = "hidden";
        getSidebarLinks.style.opacity = "0";
        getSidebar.style.height = "0";

        toggleNavStatus = false;
    }
}

代码行:

getSidebarLinks.style.opacity = "1";

导致问题的原因是 getSidebarLinks 是锚标记元素的数组。

/* jQuery for the navigation animation */

$("#wrapper").click( function() {
    $(".menu").toggleClass("close");
});

/* Code for the toggling of the navbar */

let toggleNavStatus = false;

let toggleNav = function () {
    let getSidebar = document.querySelector(".side-nav");
    let getSidebarUL = document.querySelector(".side-nav ul");
    let getSidebarLinks = document.querySelectorAll(".side-nav a");

    if (toggleNavStatus === false) {
        getSidebarUL.style.visibility = "visible";

         getSidebarLinks.forEach((item, index)=>{
          console.log(item);
          item.style.opacity = "1";
         })
        getSidebar.style.height = "220px";

        toggleNavStatus = true;
    } 

    else if (toggleNavStatus === true) {
        getSidebarUL.style.visibility = "hidden";

         getSidebarLinks.forEach((item, index)=>{
          item.style.opacity = "0";
         })
        getSidebar.style.height = "0";

        toggleNavStatus = false;
    }
}

更改 foreach 循环中所有链接的 css。

这些类有什么特殊原因需要用js修改吗?我的意思是,如果菜单由于其高度为 0px 而已经隐藏,则内容应该已经不可见。实际上,你只需要几行js就可以让它工作。

您可以主要使用 CSS 规则来处理菜单的可见性和动画,当然如果应用得当的话。播放一些动画和过渡,您还可以指定外观延迟和其他内容。动画将在元素转动 "visible" 时触发。

// handle click and toggle class
$("#menu_toggler").on("click", function(e){
  e.preventDefault();
  $("#top_menu").toggleClass("open")
})
body {
  background: #20262E;
  padding: 0;
  margin: 0;
}

button {
  background: #0084ff;
  border: none;
  border-radius: 5px;
  padding: 8px 14px;
  font-size: 15px;
  color: #fff;
}
/*  */
#top_menu {
  background: white;
  height: 0;
  width: 100%;
  transition: height 2s;
  overflow: hidden;
}

#top_menu > ul > li {
  animation: FadeIn 2s linear;
  animation-fill-mode: forwards;
}

#top_menu.open {
  height: 200px;
}

#top_menu > ul > li {
  display: none;
}

#top_menu.open > ul > li{
  display: block;
  opacity: 0;
}

@keyframes FadeIn { 
  0% {
    opacity: 0;
  }
  100% {
    opacity: 1;
  }
}

#top_menu > ul > li:nth-child(1) {
  animation-delay: 1.25s;
}

#top_menu > ul > li:nth-child(2) {
  animation-delay: 1.50s;
}

#top_menu > ul > li:nth-child(3) {
  animation-delay: 1.75s;
}

#top_menu > ul > li:nth-child(4) {
  animation-delay: 2s;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<button id="menu_toggler">Menu</button>
<div id="top_menu">
  <ul>
    <li>link 1</li>
    <li>link 2</li>
    <li>link 3</li>
    <li>link 4</li>
  </ul>
</div>

应用于#top_menu css 规则的转换将使您的 div 在 2 秒内扩展其高度。会给你一个流畅的开场动画。 然后,应用其他一些 css 规则并定义动画将为链接提供淡入效果,但您可以自由地对它们进行任何操作。这样你就不会变得疯狂控制循环和东西。

我插入了其他一些 css 规则来扩展这种效果,并向您展示如何在不使用 JS 的情况下管理您的元素

animation-fill-mode: forwards; 确保元素在动画结束后保持最终状态,不透明度确实为 1。 应用于每个 lianimation-delay 指定动画在转动 "visible".

时触发的时间