需要2次点击才能激活按钮

时间:2016-09-21 18:51:12

标签: javascript

我试图获得Javascript,特别是如何添加onclick事件,以及操纵DOM。

我在Codepen上设置了一个真实的例子。

将您的浏览器放下并获得经典的"汉堡包"菜单在顶部。这很好用,除了(刷新页面后)我必须点击汉堡包两次才能激活它。

以下是代码:



var hamburger = document.getElementById("burger"),
menu = document.getElementById("myMenu");


hamburger.addEventListener("click",function(e){ 
  if (menu.style.height==="0px"){
    menu.style.height="480px";
    hamburger.style.transform="rotate(90deg)";
  }else{
    menu.style.height="0px"; 
    hamburger.style.transform="rotate(0deg)";
  }
});

body {
  font: 13pt/130% 'Linden Hill', Times, 'Times New Roman', serif;
  background: #BEDFFC;
  margin: 0;
}

#burger {
  display: none;
  color: #BEDFFC;
  font-size: 2em;
  line-height: 1.25em;
  position: relative;
  transition: all .25s;
  height: 1em;
  width: 1em;
  left:20px;
  top:10px;
  transform: rotate(45deg);
}

nav {
  width: 100%;
  margin: 0 auto;
}

nav ul {
  list-style: none;
}

nav a {
  font: .9em 'Archivo Narrow', "Helvetica Neue", sans-serif;
  display: block;
  float: left;
  text-align:center;
  text-decoration: none;
  width: 12%;
  margin-right: 1%;
  color: rgba(122, 166, 216, 0.87);
  border: 1px solid rgba(220, 247, 253, 0.55);
  border-radius: 0px 10px 0px 0px;
  transition: all .5s ease;
}

nav a.current,
nav a:hover {
  color: #dbebf7;
  text-decoration: none;
  background: #539fd9;
}

@media only screen and (max-width: 800px) {
  nav {
    background: #265980;
    width: 100vw;
    height: 60px;
    transition: all.5s;
  }
  nav a {
    float: none;
    border-radius: 0;
    background: hsla(209, 78%, 93%,.75);
    width:100%;
    height: 40px;
    font-size: 30px;
  }
  
  #myMenu {
    width: 75%;
    height: 0px;
    margin: 18px auto;
    padding: 0;
    transition: all .25s;
    overflow: hidden; 
  }
  #burger {
    display: initial;

  }
  #burger:hover{
    color:white;
  }
}

  
<nav id="myNav">
  <div id="burger">&#9776;</div>
      <ul id="myMenu">
      <li><a href="#" class="current">menu 1</a></li>
      <li><a href="#" >menu 2</a></li>
      <li><a href="#">menu 3</a></li>
      <li><a href="#" title="interactive">menu 4</a></li>
      <li><a href="#">menu 5</a></li>
      <li><a href="#">menu 6</a></li>
	 <li><a href="#">menu 7</a></li>
</ul>
</nav>
&#13;
&#13;
&#13;

现在,如果我在addEventListener块中删除条件,并且只是更改元素的样式,它就可以正常工作。

&#13;
&#13;
var hamburger = document.getElementById("burger"),
menu = document.getElementById("myMenu");

//works, but doesn't toggle, of course...
hamburger.addEventListener("click",function(e){ 
    menu.style.height="480px";
   
});
&#13;
body {
  font: 13pt/130% 'Linden Hill', Times, 'Times New Roman', serif;
  background: #BEDFFC;
  margin: 0;
}

#burger {
  display: none;
  color: #BEDFFC;
  font-size: 2em;
  line-height: 1.25em;
  position: relative;
  transition: all .25s;
  height: 1em;
  width: 1em;
  left:20px;
  top:10px;
  transform: rotate(45deg);
}

nav {
  width: 100%;
  margin: 0 auto;
}

nav ul {
  list-style: none;
}

nav a {
  font: .9em 'Archivo Narrow', "Helvetica Neue", sans-serif;
  display: block;
  float: left;
  text-align:center;
  text-decoration: none;
  width: 12%;
  margin-right: 1%;
  color: rgba(122, 166, 216, 0.87);
  border: 1px solid rgba(220, 247, 253, 0.55);
  border-radius: 0px 10px 0px 0px;
  transition: all .5s ease;
}

nav a.current,
nav a:hover {
  color: #dbebf7;
  text-decoration: none;
  background: #539fd9;
}

@media only screen and (max-width: 800px) {
  nav {
    background: #265980;
    width: 100vw;
    height: 60px;
    transition: all.5s;
  }
  nav a {
    float: none;
    border-radius: 0;
    background: hsla(209, 78%, 93%,.75);
    width:100%;
    height: 40px;
    font-size: 30px;
  }
  
  #myMenu {
    width: 75%;
    height: 0px;
    margin: 18px auto;
    padding: 0;
    transition: all .25s;
    overflow: hidden; 
  }
  #burger {
    display: initial;

  }
  #burger:hover{
    color:white;
  }
}
&#13;
  
<nav id="myNav">
  <div id="burger">&#9776;</div>
      <ul id="myMenu">
      <li><a href="#" class="current">menu 1</a></li>
      <li><a href="#" >menu 2</a></li>
      <li><a href="#">menu 3</a></li>
      <li><a href="#" title="interactive">menu 4</a></li>
      <li><a href="#">menu 5</a></li>
      <li><a href="#">menu 6</a></li>
	 <li><a href="#">menu 7</a></li>
</ul>
</nav>
&#13;
&#13;
&#13;

在这里寻找纯粹的Javascript,非jQuery答案。

我到底做错了什么?提前谢谢。

2 个答案:

答案 0 :(得分:2)

菜单的初始高度计算为零,但内联样式的高度属性的初始值为空字符串(因为您还没有设置它)

所以当你测试时:

if (menu.style.height==="0px"){

第一次点击else并明确将其设置为0px

解决此问题的最简洁方法是测试并添加和删除类名,而不是直接操作内联样式。

答案 1 :(得分:1)

此处的问题是menu.style.height属性未初始化为"0px",而是""。修改逻辑以包含此案例会使切换按预期工作:

&#13;
&#13;
var hamburger = document.getElementById("burger"),
menu = document.getElementById("myMenu");


hamburger.addEventListener("click",function(e){ 
  if (menu.style.height==="0px" || menu.style.height===""){
    menu.style.height="480px";
    hamburger.style.transform="rotate(90deg)";
  }else{
    menu.style.height="0px"; 
    hamburger.style.transform="rotate(0deg)";
  }
});
&#13;
body {
  font: 13pt/130% 'Linden Hill', Times, 'Times New Roman', serif;
  background: #BEDFFC;
  margin: 0;
}

#burger {
  display: none;
  color: #BEDFFC;
  font-size: 2em;
  line-height: 1.25em;
  position: relative;
  transition: all .25s;
  height: 1em;
  width: 1em;
  left:20px;
  top:10px;
  transform: rotate(45deg);
}

nav {
  width: 100%;
  margin: 0 auto;
}

nav ul {
  list-style: none;
}

nav a {
  font: .9em 'Archivo Narrow', "Helvetica Neue", sans-serif;
  display: block;
  float: left;
  text-align:center;
  text-decoration: none;
  width: 12%;
  margin-right: 1%;
  color: rgba(122, 166, 216, 0.87);
  border: 1px solid rgba(220, 247, 253, 0.55);
  border-radius: 0px 10px 0px 0px;
  transition: all .5s ease;
}

nav a.current,
nav a:hover {
  color: #dbebf7;
  text-decoration: none;
  background: #539fd9;
}

@media only screen and (max-width: 800px) {
  nav {
    background: #265980;
    width: 100vw;
    height: 60px;
    transition: all.5s;
  }
  nav a {
    float: none;
    border-radius: 0;
    background: hsla(209, 78%, 93%,.75);
    width:100%;
    height: 40px;
    font-size: 30px;
  }
  
  #myMenu {
    width: 75%;
    height: 0px;
    margin: 18px auto;
    padding: 0;
    transition: all .25s;
    overflow: hidden; 
  }
  #burger {
    display: initial;

  }
  #burger:hover{
    color:white;
  }
}
&#13;
<nav id="myNav">
  <div id="burger">&#9776;</div>
      <ul id="myMenu">
      <li><a href="#" class="current">menu 1</a></li>
      <li><a href="#" >menu 2</a></li>
      <li><a href="#">menu 3</a></li>
      <li><a href="#" title="interactive">menu 4</a></li>
      <li><a href="#">menu 5</a></li>
      <li><a href="#">menu 6</a></li>
	 <li><a href="#">menu 7</a></li>
</ul>
</nav>
&#13;
&#13;
&#13;