HTML / CSS / Javascript:单击按钮时打开/关闭菜单

时间:2017-12-07 00:17:18

标签: javascript html css

我的页面上有一个汉堡包图标,点击后可以打开/关闭下拉菜单。我从Jonathan Suh的github页面中提取了汉堡包图标的代码,并试图用它实现一个打开/关闭下拉菜单(这里是您参考的页面https://github.com/jonsuh/hamburgers)。

问题是,当我点击它时,会出现下拉菜单,但是当我再次点击它时它不会消失。我尝试了一些方法,例如将布尔变量设置为false并在单击时将其设置为true,但代码不会按照我想象的方式执行。这是代码:

//declarations
var hamburger = document.querySelector(".hamburger");

function dropDown() {
  document.querySelector(".dropdown-content").style.display = "block";

}

hamburger.addEventListener("click", function() {
  hamburger.classList.toggle("is-active");
  dropDown();
});
.dropdown {
  position: relative;
  display: inline-block;
}

.dropdown-content {
  display: none;
  position: absolute;
  z-index: 1;
}

.dropdown-content a {
  color: black;
  padding: 12px 16px;
  text-decoration: none;
  display: block;
}

.show {
  display: block;
}


/*!
 * Hamburgers
 * @description Tasty CSS-animated hamburgers
 * @author Jonathan Suh @jonsuh
 * @site https://jonsuh.com/hamburgers
 * @link https://github.com/jonsuh/hamburgers
 */

.hamburger {
  padding: 15px 15px;
  display: inline-block;
  cursor: pointer;
  transition-property: opacity, filter;
  transition-duration: 0.15s;
  transition-timing-function: linear;
  font: inherit;
  color: inherit;
  text-transform: none;
  background-color: transparent;
  border: 0;
  margin: 0;
  overflow: visible;
}

.hamburger:hover {
  opacity: 0.7;
}

.hamburger-box {
  width: 40px;
  height: 24px;
  display: inline-block;
  position: relative;
}

.hamburger-inner {
  display: block;
  top: 50%;
  margin-top: -2px;
}

.hamburger-inner,
.hamburger-inner::before,
.hamburger-inner::after {
  width: 40px;
  height: 4px;
  background-color: #000;
  border-radius: 4px;
  position: absolute;
  transition-property: transform;
  transition-duration: 0.15s;
  transition-timing-function: ease;
}

.hamburger-inner::before,
.hamburger-inner::after {
  content: "";
  display: block;
}

.hamburger-inner::before {
  top: -10px;
}

.hamburger-inner::after {
  bottom: -10px;
}


/*
   * Spring
   */

.hamburger--spring .hamburger-inner {
  top: 2px;
  transition: background-color 0s 0.13s linear;
}

.hamburger--spring .hamburger-inner::before {
  top: 10px;
  transition: top 0.1s 0.2s cubic-bezier(0.33333, 0.66667, 0.66667, 1), transform 0.13s cubic-bezier(0.55, 0.055, 0.675, 0.19);
}

.hamburger--spring .hamburger-inner::after {
  top: 20px;
  transition: top 0.2s 0.2s cubic-bezier(0.33333, 0.66667, 0.66667, 1), transform 0.13s cubic-bezier(0.55, 0.055, 0.675, 0.19);
}

.hamburger--spring.is-active .hamburger-inner {
  transition-delay: 0.22s;
  background-color: transparent;
}

.hamburger--spring.is-active .hamburger-inner::before {
  top: 0;
  transition: top 0.1s 0.15s cubic-bezier(0.33333, 0, 0.66667, 0.33333), transform 0.13s 0.22s cubic-bezier(0.215, 0.61, 0.355, 1);
  transform: translate3d(0, 10px, 0) rotate(45deg);
}

.hamburger--spring.is-active .hamburger-inner::after {
  top: 0;
  transition: top 0.2s cubic-bezier(0.33333, 0, 0.66667, 0.33333), transform 0.13s 0.22s cubic-bezier(0.215, 0.61, 0.355, 1);
  transform: translate3d(0, 10px, 0) rotate(-45deg);
}
  <div class="dropDown">
    <button onclick="dropDown()" class="hamburger hamburger--spring" type="button">
        <span class = "hamburger-box">
            <span class="hamburger-inner"></span>
        </span>
        <div id="myDropDown" class="dropdown-content">
            <a href="home.html">Home</a>
            <a href="work.html">Work</a>
            <a href="resume.html">Resume</a>
            <a href="life.html">Life</a>
        </div>
    </button>
  </div>

虽然我知道可能有一个可以在jQuery中使用的解决方案,但我没有经验。所以,请保持JavaScript。我对它完全陌生,但对它是如何工作有一个基本的了解。

3 个答案:

答案 0 :(得分:1)

试试这个:

function dropDown() {
    var dropDown = document.querySelector(".dropdown-content");
    if (dropDown.style.display === 'block') {
        dropDown.style.display = "none";
    } else {
        dropDown.style.display = 'block'
    }
}

答案 1 :(得分:1)

不需要dropDown()或任何额外的JS。您当前的点击事件处理程序会很好。当dropdown-content的{​​{1}}类(已经通过类切换处理)时,只需在CSS中添加一个以.hamburger为目标的后代选择器:

.is-active

答案 2 :(得分:0)

尝试像website

中的那样做一些css

我使用代码来监控属性。您可以使用JS来更改dropdown-content元素的属性。

所以,将以下内容放入CSS

.dropdown-content[show='true']{
    position: absolute;
    margin-top: 50px;
    display: block;
 }

然后将您的JavaScript函数更改为:

function dropDown(){
    var drop=document.getElementById("myDropdown");
    if(drop.getAttribute("show")=="true"){
        drop.setAttribute("show","false");
    }else{
        drop.setAttribute("show","true");
    }
}

为了安全起见,我建议您将show="false"添加到dropdown-content元素中。您也可以推荐我的website code进一步了解它们。

相关问题