为什么导航菜单只能点击一次?
Why navigation menu is clickable only one time?
我正在尝试使用一个教程构建一个全屏导航菜单,但在教程结束时我不明白为什么我的导航菜单只能点击一次。所以你点击它一次,菜单就会显示出来,然后你就可以关闭它,但如果我想再次打开它,我必须刷新页面才能再次使用它?任何想法为什么代码不能正常工作?
这是 JSFIDDLE
上的示例
<!-- Navigation Menu -->
<p><button id="trigger-overlay" type="button">menu</button></p>
<div class="overlay overlay-slidedown">
<button type="button" class="overlay-close"></button>
<nav>
<ul>
<li><a href="#">Home</a></li>
<li><a href="#">About us</a></li>
<li><a href="#">Categories</a></li>
<li><a href="#">Gallery</a></li>
<li><a href="#">Events</a></li>
<li><a href="#">Blog</a></li>
<li><a href="#">Contact us</a></li>
</ul>
</nav>
</div>
/* Overlay closing cross */
.overlay .overlay-close {
width: 80px;
height: 80px;
position: absolute;
right: 20px;
top: 20px;
overflow: hidden;
border: none;
background: url(../img/cross.png) no-repeat center center;
text-indent: 200%;
color: transparent;
outline: none;
z-index: 100;
}
/* Menu style */
.overlay nav {
text-align: center;
position: relative;
top: 50%;
height: 60%;
-webkit-transform: translateY(-50%);
transform: translateY(-50%);
letter-spacing: 10px;
}
.overlay ul {
text-transform: uppercase;
list-style: none;
padding: 0;
margin: 0 auto;
display: inline-block;
height: 50%;
position: relative;
}
.overlay ul li {
display: block;
height: 30%;
height: calc(100% / 5);
min-height: 54px;
-webkit-backface-visibility: hidden;
backface-visibility: hidden;
}
.overlay ul li a {
font-size: 3rem;
font-weight: 300;
display: block;
color: #626264;
-webkit-transition: color 0.2s;
transition: color 0.2s;
margin-top: -30px;
float: left;
font-weight: 700;
}
.overlay ul li a:hover,
.overlay ul li a:focus {
color: #FFF;
text-decoration: underline;
}
/* Effects */
.overlay-slidedown {
visibility: hidden;
-webkit-transform: translateY(-100%);
transform: translateY(-100%);
-webkit-transition: -webkit-transform 0.4s ease-in-out, visibility 0s 0.4s;
transition: transform 0.4s ease-in-out, visibility 0s 0.4s;
}
.overlay-slidedown.open {
visibility: visible;
-webkit-transform: translateY(0%);
transform: translateY(0%);
-webkit-transition: -webkit-transform 0.4s ease-in-out;
transition: transform 0.4s ease-in-out;
}
#trigger-overlay{
margin-top: 50px;
padding: 5px 0 5px 0;
float: right;
color: #FFF;
text-transform: uppercase;
border-top: 2px solid #FFF;
border-bottom: 2px solid #FFF;
}
@media screen and (max-height: 30.5em) {
.overlay nav {
height: 70%;
font-size: 34px;
}
.overlay ul li {
min-height: 34px;
}
}
function shuffle(array) {
var currentIndex = array.length
, temporaryValue
, randomIndex
;
// While there remain elements to shuffle...
while (0 !== currentIndex) {
// Pick a remaining element...
randomIndex = Math.floor(Math.random() * currentIndex);
currentIndex -= 1;
// And swap it with the current element.
temporaryValue = array[currentIndex];
array[currentIndex] = array[randomIndex];
array[randomIndex] = temporaryValue;
}
return array;
}
var triggerBttn = document.getElementById( 'trigger-overlay' ),
overlay = document.querySelector( 'div.overlay' ),
closeBttn = overlay.querySelector( 'button.overlay-close' ),
paths = [].slice.call( overlay.querySelectorAll( 'svg > path' ) ),
pathsTotal = paths.length;
function toggleOverlay() {
var cnt = 0;
shuffle( paths );
if( classie.has( overlay, 'open' ) ) {
classie.remove( overlay, 'open' );
classie.add( overlay, 'close' );
paths.forEach( function( p, i ) {
setTimeout( function() {
++cnt;
p.style.display = 'none';
if( cnt === pathsTotal ) {
classie.remove( overlay, 'close' );
}
}, i * 30 );
});
}
else if( !classie.has( overlay, 'close' ) ) {
classie.add( overlay, 'open' );
paths.forEach( function( p, i ) {
setTimeout( function() {
p.style.display = 'block';
}, i * 30 );
});
}
}
triggerBttn.addEventListener( 'click', toggleOverlay );
closeBttn.addEventListener( 'click', toggleOverlay );
您的 else 语句有问题 - 将其更改为 -
else {
if (classie.has(overlay, 'close')) {
classie.remove( overlay, 'close' );
}
classie.add( overlay, 'open' );
... continue of the else statement
}
我已经对您的 jsfiddle 进行了更改。
您最初应该添加 close 到您的 class 并在 else 中进行更改,如下所示:
HTML 变化:
<div class="overlay overlay-slidedown close">
Javascript 变化:
else if( classie.has( overlay, 'close' ) ) {
classie.add( overlay, 'open' );
paths.forEach( function( p, i ) {
setTimeout( function() {
p.style.display = 'block';
}, i * 30 );
});
}
JS Fiddle working link
我正在尝试使用一个教程构建一个全屏导航菜单,但在教程结束时我不明白为什么我的导航菜单只能点击一次。所以你点击它一次,菜单就会显示出来,然后你就可以关闭它,但如果我想再次打开它,我必须刷新页面才能再次使用它?任何想法为什么代码不能正常工作?
这是 JSFIDDLE
上的示例 <!-- Navigation Menu -->
<p><button id="trigger-overlay" type="button">menu</button></p>
<div class="overlay overlay-slidedown">
<button type="button" class="overlay-close"></button>
<nav>
<ul>
<li><a href="#">Home</a></li>
<li><a href="#">About us</a></li>
<li><a href="#">Categories</a></li>
<li><a href="#">Gallery</a></li>
<li><a href="#">Events</a></li>
<li><a href="#">Blog</a></li>
<li><a href="#">Contact us</a></li>
</ul>
</nav>
</div>
/* Overlay closing cross */
.overlay .overlay-close {
width: 80px;
height: 80px;
position: absolute;
right: 20px;
top: 20px;
overflow: hidden;
border: none;
background: url(../img/cross.png) no-repeat center center;
text-indent: 200%;
color: transparent;
outline: none;
z-index: 100;
}
/* Menu style */
.overlay nav {
text-align: center;
position: relative;
top: 50%;
height: 60%;
-webkit-transform: translateY(-50%);
transform: translateY(-50%);
letter-spacing: 10px;
}
.overlay ul {
text-transform: uppercase;
list-style: none;
padding: 0;
margin: 0 auto;
display: inline-block;
height: 50%;
position: relative;
}
.overlay ul li {
display: block;
height: 30%;
height: calc(100% / 5);
min-height: 54px;
-webkit-backface-visibility: hidden;
backface-visibility: hidden;
}
.overlay ul li a {
font-size: 3rem;
font-weight: 300;
display: block;
color: #626264;
-webkit-transition: color 0.2s;
transition: color 0.2s;
margin-top: -30px;
float: left;
font-weight: 700;
}
.overlay ul li a:hover,
.overlay ul li a:focus {
color: #FFF;
text-decoration: underline;
}
/* Effects */
.overlay-slidedown {
visibility: hidden;
-webkit-transform: translateY(-100%);
transform: translateY(-100%);
-webkit-transition: -webkit-transform 0.4s ease-in-out, visibility 0s 0.4s;
transition: transform 0.4s ease-in-out, visibility 0s 0.4s;
}
.overlay-slidedown.open {
visibility: visible;
-webkit-transform: translateY(0%);
transform: translateY(0%);
-webkit-transition: -webkit-transform 0.4s ease-in-out;
transition: transform 0.4s ease-in-out;
}
#trigger-overlay{
margin-top: 50px;
padding: 5px 0 5px 0;
float: right;
color: #FFF;
text-transform: uppercase;
border-top: 2px solid #FFF;
border-bottom: 2px solid #FFF;
}
@media screen and (max-height: 30.5em) {
.overlay nav {
height: 70%;
font-size: 34px;
}
.overlay ul li {
min-height: 34px;
}
}
function shuffle(array) {
var currentIndex = array.length
, temporaryValue
, randomIndex
;
// While there remain elements to shuffle...
while (0 !== currentIndex) {
// Pick a remaining element...
randomIndex = Math.floor(Math.random() * currentIndex);
currentIndex -= 1;
// And swap it with the current element.
temporaryValue = array[currentIndex];
array[currentIndex] = array[randomIndex];
array[randomIndex] = temporaryValue;
}
return array;
}
var triggerBttn = document.getElementById( 'trigger-overlay' ),
overlay = document.querySelector( 'div.overlay' ),
closeBttn = overlay.querySelector( 'button.overlay-close' ),
paths = [].slice.call( overlay.querySelectorAll( 'svg > path' ) ),
pathsTotal = paths.length;
function toggleOverlay() {
var cnt = 0;
shuffle( paths );
if( classie.has( overlay, 'open' ) ) {
classie.remove( overlay, 'open' );
classie.add( overlay, 'close' );
paths.forEach( function( p, i ) {
setTimeout( function() {
++cnt;
p.style.display = 'none';
if( cnt === pathsTotal ) {
classie.remove( overlay, 'close' );
}
}, i * 30 );
});
}
else if( !classie.has( overlay, 'close' ) ) {
classie.add( overlay, 'open' );
paths.forEach( function( p, i ) {
setTimeout( function() {
p.style.display = 'block';
}, i * 30 );
});
}
}
triggerBttn.addEventListener( 'click', toggleOverlay );
closeBttn.addEventListener( 'click', toggleOverlay );
您的 else 语句有问题 - 将其更改为 -
else {
if (classie.has(overlay, 'close')) {
classie.remove( overlay, 'close' );
}
classie.add( overlay, 'open' );
... continue of the else statement
}
我已经对您的 jsfiddle 进行了更改。
您最初应该添加 close 到您的 class 并在 else 中进行更改,如下所示:
HTML 变化:
<div class="overlay overlay-slidedown close">
Javascript 变化:
else if( classie.has( overlay, 'close' ) ) {
classie.add( overlay, 'open' );
paths.forEach( function( p, i ) {
setTimeout( function() {
p.style.display = 'block';
}, i * 30 );
});
}
JS Fiddle working link