我试图获得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">☰</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;
现在,如果我在addEventListener块中删除条件,并且只是更改元素的样式,它就可以正常工作。
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">☰</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;
在这里寻找纯粹的Javascript,非jQuery答案。
我到底做错了什么?提前谢谢。
答案 0 :(得分:2)
菜单的初始高度计算为零,但内联样式的高度属性的初始值为空字符串(因为您还没有设置它)
所以当你测试时:
if (menu.style.height==="0px"){
第一次点击else
并明确将其设置为0px
。
解决此问题的最简洁方法是测试并添加和删除类名,而不是直接操作内联样式。
答案 1 :(得分:1)
此处的问题是menu.style.height
属性未初始化为"0px"
,而是""
。修改逻辑以包含此案例会使切换按预期工作:
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">☰</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;