2016-08-04 2 views
2

Привет там Я пытаюсь создать боковую СЧА, и я не могу управлять, чтобы закрыть меню со второй функцией «OnClick()»Мой Nav значок не закрывает

навигация открывается отлично, но тогда это делает не близко. Вот моя скрипка, я просто надеялся получить помощь в добавлении функции onlick, которая закрывает навигацию при повторном нажатии на значок nav.

function myFunction(x) { 
 
    x.classList.toggle("change"); 
 
    document.getElementById("mySidenav").style.width = "220px"; 
 
    document.getElementById("Content").style.paddingLeft = "0px"; 
 
    document.body.style.opacity = "0.1"; 
 

 
}
/* The side navigation menu */ 
 

 
.sidenav { 
 
    height: 100%; 
 
    width: 0; 
 
    /* 0 width - change this with JavaScript */ 
 
    position: fixed; 
 
    z-index: 400; 
 
    right: 0; 
 
    background-color: #0F0F0F; 
 
    overflow-x: hidden; 
 
    padding-top: 90px; 
 
    transition: 0.5s; 
 
    -webkit-transition: 0.5s; 
 
    -moz-transition: 0.5s; 
 
    opacity: 0.8; 
 
} 
 
/* The navigation menu links */ 
 

 
.sidenav a { 
 
    padding: 8px 8px 8px 10px; 
 
    text-decoration: none; 
 
    font-size: 18px; 
 
    text-align: right; 
 
    vertical-align: middle; 
 
    justify-content: center; 
 
    display: flex; 
 
    line-height: 20px; 
 
    color: #FFFFFF; 
 
    transition: 0.3s; 
 
} 
 
/* When you mouse over the navigation links, change their color */ 
 

 
.sidenav a:hover, 
 
.offcanvas a:focus { 
 
    color: #00CB10; 
 
    text-decoration: underline; 
 
} 
 
.menu-icon { 
 
    display: inline-block; 
 
    position: fixed; 
 
    z-index: 500; 
 
    cursor: pointer; 
 
    margin-right: 15px; 
 
    margin-top: 15px; 
 
    margin-left: 96%; 
 
} 
 
.bar1, 
 
.bar2, 
 
.bar3 { 
 
    width: 30px; 
 
    height: 4px; 
 
    background-color: #0F0F0F; 
 
    border-radius: 10px; 
 
    margin: 6px 0; 
 
    transition: 0.4s; 
 
} 
 
/* Rotate first bar */ 
 

 
.change .bar1 { 
 
    -webkit-transform: rotate(-45deg) translate(-9px, 5px); 
 
    transform: rotate(-45deg) translate(-9px, 5px); 
 
} 
 
/* Fade out the second bar */ 
 

 
.change .bar2 { 
 
    opacity: 0; 
 
} 
 
/* Rotate last bar */ 
 

 
.change .bar3 { 
 
    -webkit-transform: rotate(45deg) translate(-8px, -6px); 
 
    transform: rotate(45deg) translate(-8px, -6px); 
 
}
<div id="Menu" class="menu-icon" onclick="myFunction(this)"> 
 
    <div class="bar1"></div> 
 
    <div class="bar2"></div> 
 
    <div class="bar3"></div> 
 
</div> 
 

 
<div id="mySidenav" class="sidenav"> 
 
    <!--Start Side Nav--> 
 
    <a href="#">Our Story</a> 
 
    <a href="#">Products</a> 
 
    <a href="#">Contact Us</a> 
 
    <a href="#">Login/Sign up</a> 
 
</div> 
 
<!---->

ответ

1

Вам не нужно, чтобы установить ширину в JS. Вы переключаете дополнительный класс, когда меню открыто, вы можете играть с этим.

Другое дело, что вы не должны изменять непрозрачность тела (это также повлияет на меню), но только основной контент div. Или отобразите оверлейный div с фиксированным положением (ширина и высота 100%, фон и непрозрачность), чтобы он создавал эффект отключенного контента.

В моей Exemple я заметил ненужные Js линии, и я добавил Сомма CSS:

function myFunction(x) { 
 
    x.classList.toggle("change"); 
 
    //document.getElementById("mySidenav").style.width = "220px"; 
 
    //document.getElementById("Content").style.paddingLeft = "0px"; 
 
    document.body.style.opacity = "0.1"; 
 

 
}
/* The side navigation menu */ 
 

 
.sidenav { 
 
    height: 100%; 
 
    width: 0; 
 
    /* 0 width - change this with JavaScript */ 
 
    position: fixed; 
 
    z-index: 400; 
 
    right: 0; 
 
    background-color: #0F0F0F; 
 
    overflow-x: hidden; 
 
    padding-top: 90px; 
 
    transition: 0.5s; 
 
    -webkit-transition: 0.5s; 
 
    -moz-transition: 0.5s; 
 
    opacity: 0.8; 
 
} 
 
/* The navigation menu links */ 
 

 
.sidenav a { 
 
    padding: 8px 8px 8px 10px; 
 
    text-decoration: none; 
 
    font-size: 18px; 
 
    text-align: right; 
 
    vertical-align: middle; 
 
    justify-content: center; 
 
    display: flex; 
 
    line-height: 20px; 
 
    color: #FFFFFF; 
 
    transition: 0.3s; 
 
} 
 
/* When you mouse over the navigation links, change their color */ 
 

 
.sidenav a:hover, 
 
.offcanvas a:focus { 
 
    color: #00CB10; 
 
    text-decoration: underline; 
 
} 
 
.menu-icon { 
 
    display: inline-block; 
 
    position: fixed; 
 
    z-index: 500; 
 
    cursor: pointer; 
 
    margin-right: 15px; 
 
    margin-top: 15px; 
 
    margin-left: 96%; 
 
} 
 
.bar1, 
 
.bar2, 
 
.bar3 { 
 
    width: 30px; 
 
    height: 4px; 
 
    background-color: #0F0F0F; 
 
    border-radius: 10px; 
 
    margin: 6px 0; 
 
    transition: 0.4s; 
 
} 
 
/* Rotate first bar */ 
 

 
.change .bar1 { 
 
    -webkit-transform: rotate(-45deg) translate(-9px, 5px); 
 
    transform: rotate(-45deg) translate(-9px, 5px); 
 
} 
 
/* Fade out the second bar */ 
 

 
.change .bar2 { 
 
    opacity: 0; 
 
} 
 
/* Rotate last bar */ 
 

 
.change .bar3 { 
 
    -webkit-transform: rotate(45deg) translate(-8px, -6px); 
 
    transform: rotate(45deg) translate(-8px, -6px); 
 
} 
 
.change + .sidenav { 
 
    width: 220px; 
 
}
<div id="Menu" class="menu-icon" onclick="myFunction(this)"> 
 
    <div class="bar1"></div> 
 
    <div class="bar2"></div> 
 
    <div class="bar3"></div> 
 
</div> 
 

 
<div id="mySidenav" class="sidenav"> 
 
    <!--Start Side Nav--> 
 
    <a href="#">Our Story</a> 
 
    <a href="#">Products</a> 
 
    <a href="#">Contact Us</a> 
 
    <a href="#">Login/Sign up</a> 
 
</div> 
 
<!---->

+0

я не знаю, что это был переключаясь на дополнительный класс. Я действительно думал, что мне нужна дополнительная функция onclick, чтобы закрыть навигацию, но это отлично сработало. Итак, в основном .change + .sidenav переключает ширину, чтобы переключиться? – Frana

+0

'x.classList.toggle (" change ");' переключает изменение класса на элемент 'x' (здесь #Menu). Класс «change» - это тот, который используется для изменения формы кнопки меню. Поэтому я использовал этот класс для изменения ширины меню. – Cladiuss

+0

'.change + .sidenav' в CSS означает, что он будет искать элемент с классом' sidenav' сразу после элемента с классом 'change'.Поскольку «change» будет отображаться только при открытии меню, эффект CSS будет применяться только тогда, когда он должен быть открыт – Cladiuss

0

Если вы пытаетесь установить ширину в JavaScript, то вы можете пойти на проверьте, открыто ли меню.

Однако приведенный выше ответ более уместен в этом случае.

function myFunction(x) { 
 
    x.classList.toggle("change"); 
 
    var width=document.getElementById("mySidenav").style.width; 
 
    if(width!="220px" || width=="") 
 
    { 
 
    document.getElementById("mySidenav").style.width="220px"; 
 
    } 
 
    else 
 
    { 
 
    document.getElementById("mySidenav").style.width="0px"; 
 
    } 
 
    document.getElementById("Content").style.paddingLeft = "0px"; 
 
    document.body.style.opacity = "0.1"; 
 

 
}
/* The side navigation menu */ 
 

 
.sidenav { 
 
    height: 100%; 
 
    width: 0; 
 
    /* 0 width - change this with JavaScript */ 
 
    position: fixed; 
 
    z-index: 400; 
 
    right: 0; 
 
    background-color: #0F0F0F; 
 
    overflow-x: hidden; 
 
    padding-top: 90px; 
 
    transition: 0.5s; 
 
    -webkit-transition: 0.5s; 
 
    -moz-transition: 0.5s; 
 
    opacity: 0.8; 
 
} 
 
/* The navigation menu links */ 
 

 
.sidenav a { 
 
    padding: 8px 8px 8px 10px; 
 
    text-decoration: none; 
 
    font-size: 18px; 
 
    text-align: right; 
 
    vertical-align: middle; 
 
    justify-content: center; 
 
    display: flex; 
 
    line-height: 20px; 
 
    color: #FFFFFF; 
 
    transition: 0.3s; 
 
} 
 
/* When you mouse over the navigation links, change their color */ 
 

 
.sidenav a:hover, 
 
.offcanvas a:focus { 
 
    color: #00CB10; 
 
    text-decoration: underline; 
 
} 
 
.menu-icon { 
 
    display: inline-block; 
 
    position: fixed; 
 
    z-index: 500; 
 
    cursor: pointer; 
 
    margin-right: 15px; 
 
    margin-top: 15px; 
 
    margin-left: 96%; 
 
} 
 
.bar1, 
 
.bar2, 
 
.bar3 { 
 
    width: 30px; 
 
    height: 4px; 
 
    background-color: #0F0F0F; 
 
    border-radius: 10px; 
 
    margin: 6px 0; 
 
    transition: 0.4s; 
 
} 
 
/* Rotate first bar */ 
 

 
.change .bar1 { 
 
    -webkit-transform: rotate(-45deg) translate(-9px, 5px); 
 
    transform: rotate(-45deg) translate(-9px, 5px); 
 
} 
 
/* Fade out the second bar */ 
 

 
.change .bar2 { 
 
    opacity: 0; 
 
} 
 
/* Rotate last bar */ 
 

 
.change .bar3 { 
 
    -webkit-transform: rotate(45deg) translate(-8px, -6px); 
 
    transform: rotate(45deg) translate(-8px, -6px); 
 
}
<div id="Menu" class="menu-icon" onclick="myFunction(this)"> 
 
    <div class="bar1"></div> 
 
    <div class="bar2"></div> 
 
    <div class="bar3"></div> 
 
</div> 
 

 
<div id="mySidenav" class="sidenav"> 
 
    <!--Start Side Nav--> 
 
    <a href="#">Our Story</a> 
 
    <a href="#">Products</a> 
 
    <a href="#">Contact Us</a> 
 
    <a href="#">Login/Sign up</a> 
 
</div> 
 
<!---->

0

Главное отсутствует ваши установки является то, что #mySidenav потребности, чтобы иметь возможность переключаться между состояниями , а также.menu-icon.

Следовательно, вам нужно настроить myFunction() так, что она переключает класс .change на как.menu-iconи#mySidenav.

function myFunction() { 
 
var x = document.getElementsByClassName('menu-icon')[0]; 
 
var mySidenav = document.getElementById('mySidenav'); 
 

 
x.classList.toggle('change'); 
 
mySidenav.classList.toggle('change'); 
 
} 
 

 
var menuIcon = document.getElementsByClassName('menu-icon')[0]; 
 
menuIcon.addEventListener('click',myFunction,false);
/* The side navigation menu */ 
 

 
.sidenav { 
 
height: 100%; 
 
width: 0; 
 
/* 0 width - change this with JavaScript */ 
 
position: fixed; 
 
z-index: 400; 
 
right: 0; 
 
background-color: #0F0F0F; 
 
overflow-x: hidden; 
 
padding-top: 90px; 
 
transition: 0.5s; 
 
-webkit-transition: 0.5s; 
 
-moz-transition: 0.5s; 
 
opacity: 0.8; 
 
} 
 
/* The navigation menu links */ 
 

 
.sidenav a { 
 
padding: 8px 8px 8px 10px; 
 
text-decoration: none; 
 
font-size: 18px; 
 
text-align: right; 
 
vertical-align: middle; 
 
justify-content: center; 
 
display: flex; 
 
line-height: 20px; 
 
color: #FFFFFF; 
 
transition: 0.3s; 
 
} 
 
/* When you mouse over the navigation links, change their color */ 
 

 
.sidenav a:hover, 
 
.offcanvas a:focus { 
 
color: #00CB10; 
 
text-decoration: underline; 
 
} 
 
.menu-icon { 
 
display: inline-block; 
 
position: fixed; 
 
z-index: 500; 
 
cursor: pointer; 
 
margin-right: 15px; 
 
margin-top: 15px; 
 
margin-left: 96%; 
 
} 
 
.bar1, 
 
.bar2, 
 
.bar3 { 
 
width: 30px; 
 
height: 4px; 
 
background-color: #0F0F0F; 
 
border-radius: 10px; 
 
margin: 6px 0; 
 
transition: 0.4s; 
 
} 
 
/* Rotate first bar */ 
 

 
.change .bar1 { 
 
-webkit-transform: rotate(-45deg) translate(-9px, 5px); 
 
transform: rotate(-45deg) translate(-9px, 5px); 
 
background-color: rgb(255,255,255); 
 
} 
 
/* Fade out the second bar */ 
 

 
.change .bar2 { 
 
opacity: 0; 
 
} 
 
/* Rotate last bar */ 
 

 
.change .bar3 { 
 
-webkit-transform: rotate(45deg) translate(-8px, -6px); 
 
transform: rotate(45deg) translate(-8px, -6px); 
 
background-color: rgb(255,255,255); 
 
} 
 

 
#mySidenav.change { 
 
width: 220px; 
 
} 
 

 
#Content.change { 
 
padding-left: 0; 
 
} 
 

 
body.change { 
 
opacity: 0.1; 
 
}
<div id="Menu" class="menu-icon"> 
 
<div class="bar1"></div> 
 
<div class="bar2"></div> 
 
<div class="bar3"></div> 
 
</div> 
 

 
<div id="mySidenav" class="sidenav"> 
 
<!--Start Side Nav--> 
 
<a href="#">Our Story</a> 
 
<a href="#">Products</a> 
 
<a href="#">Contact Us</a> 
 
<a href="#">Login/Sign up</a> 
 
</div>

1

Я добавил новый class называется toggleClass и я предоставил width:220px, и я прокомментировал document.getElementById("mySidenav").style.width = "220px"

working fiddle

Смежные вопросы