我正在使用jquery和css3创建响应式菜单。这是我的jQuery
var ico = $('<span class="fa fa-caret-right"></span>');
$('nav#nav li:has(ul)').append(ico);
$('span.fa-caret-right').on('click',function(){
$('nav#nav li:has(ul)').toggleClass('open');
});
$('a#toggle').on('click',function(e){
$('html').toggleClass('open-menu');
return false;
});
$('div#overlay').on('click',function(){
$('html').removeClass('open-menu');
})
正如你在小提琴here中看到的那样,当我点击“我们做什么”的图标时, 两个子菜单都在打开。
我想一次打开一个特定的,并在点击其他子菜单时关闭它。
答案 0 :(得分:1)
这里使用以下代码:
$('span.fa-caret-right').on('click',function(){
// remove existing open class on li
$('li').removeClass('open');
// add class on current element(li)
$(this).closest('li').toggleClass('open');
});
答案 1 :(得分:1)
嘿,这段代码可以帮到你。
$('nav#nav li:has(ul)').append("<span class='fa fa-caret-right'></span>");
var icon = $('span.fa-caret-right');
$('span.fa-caret-right').on('click',function() {
if($(this).parent().hasClass('open')) {
icon.parent().removeClass('open');
} else {
icon.parent().removeClass('open');
$(this).parent().addClass('open');
}
});
$('a#toggle').on('click',function(e){
$('html').toggleClass('open-menu');
return false;
});
$('div#overlay').on('click',function(){
$('html').removeClass('open-menu');
})
&#13;
body {
font-family: 'Open Sans', sans-serif;
}
a { outline:none; cursor:pointer; text-decoration: none; }
nav{
display:block;
}
/*** Navigation Menu :: Start***/
#nav {
margin: 30px 0 0;
float: left;
}
#nav ul li {
float: left;
text-transform: uppercase;
margin-left: 5px;
}
#nav ul li a {
font-size: 14px;
color: #2d2d2d;
padding: 8px 15px;
border-radius: 5px;
display: block;
}
#nav ul li a:hover,
#nav ul li.active a,
#nav ul li.quote a,
#nav ul li:hover a {
background: #EF3E36;
color: #fff;
}
a#toggle {
position: absolute;
top: 10px;
left: 0;
width: 40px;
height: 40px;
background: red;
text-align: center;
color: white;
display: none;
transition: all ease-out 0.3s;
}
a#toggle span {
position: relative;
top: 50%;
transform: translateY(-50%);
}
#nav {
text-align: center;
transition: all ease-out 0.3s;
}
#nav a { color: white; }
#nav ul {
margin: 0;
padding: 0;
background-color: rgba(22,160,133, 0.8);
}
#nav ul li {
display: inline-block;
position: relative;
padding-bottom: 10px;
}
#nav ul li a {
display: block;
padding: 10px;
}
#nav ul li a span {
margin-left: 15px;
transition: all ease-out 0.3s;
-webkit-transition: all ease-out 0.1s;
display: none;
}
#nav ul li ul {
display: none;
position: absolute;
top: 38px;
width: 215px;
text-align: left;
}
#nav ul li ul li { display: block; }
#nav ul li ul li a { display: block; }
#nav ul li:hover a span { transform: rotateZ(90deg); }
#nav ul li:hover ul { display: block; }
#nav ul li ul.sub-menu {
position: absolute;
background: #fff;
border-radius: 5px;
padding: 5px;
box-shadow: 0px 0px 3px rgba(0,0,0,0.3);
display: none;
z-index: 999999;
top: 100%;
}
#nav ul li ul:before {
border-bottom: 10px solid rgba(0, 0, 0, 0.2);
border-left: 11px solid rgba(0, 0, 0, 0);
border-right: 11px solid rgba(0, 0, 0, 0);
content: "";
display: inline-block;
position: absolute;
left: 23px;
top: -10px;
}
#nav ul li ul:after {
border-bottom: 9px solid #ffffff;
border-left: 10px solid rgba(0, 0, 0, 0);
border-right: 10px solid rgba(0, 0, 0, 0);
content: "";
display: inline-block;
position: absolute;
left: 24px;
top: -9px;
}
#nav ul li:hover ul.sub-menu {
display: block;
}
#nav ul li ul.sub-menu li {
float: none;
padding: 0;
}
#nav ul li ul.sub-menu li:first-child {
border-top: none;
}
#nav ul li ul.sub-menu li a {
font-size: 14px;
color: #3a3a3a;
border-radius: 0;
text-transform: capitalize;
padding: 6px 3px;
}
#nav ul li:hover ul.sub-menu li a {
background: none;
}
#nav ul li ul.sub-menu li a:hover,
#nav ul li ul.sub-menu li.active a {
color: #ef3e36;
background: none;
}
/******* Media Queries *******/
@media (max-width: 1366px) {
html, body {
height: 100%;
}
html.open-menu body {
overflow: hidden;
}
#nav ul li ul.sub-menu li {
border-top: 1px solid #5a607c;
border-bottom: none;
}
#nav ul li ul.sub-menu li a {
color: #fff;
padding: 9px 3px;
}
#nav ul li ul.sub-menu li a:hover, #nav ul li ul.sub-menu li.active a {
color: #fff;
}
/* Responsive Nav */
html.open-menu a#toggle {
transform: translateX(0px);
-webkit-transform: translateX(0px);
background: black;
}
html.open-menu #wrapper {
transform: translateX(250px);
-webkit-transform: translateX(250px);
}
#wrapper {
transition: all 0.3s ease-out 0s;
-webkit-transition: all 0.3s ease-out 0s;
height: 100%;
}
a#toggle { display: block; }
#nav {
position: fixed;
width: 250px;
height: 100%;
max-height: 100%;
top: 0;
overflow: hidden;
overflow-y: auto;
background-color: #20222B;
transform: translateX(-250px);
-webkit-transform: translateX(-250px);
box-shadow: -1px -4px 5px rgba(0, 0, 0, 0.5) inset;
-webkit-box-shadow: -1px -4px 5px rgba(0, 0, 0, 0.5) inset;
margin: 0;
left: 0;
transition: all 0.3s ease-out 0s;
-webkit-transition: all 0.3s ease-out 0s;
z-index: -5;
}
#nav ul {
text-align: left;
background-color: transparent;
}
#nav ul li:first-child {
border-top: none;
}
#nav ul li { display: block; width: 100%; margin: 0; padding: 0; border-top: 1px solid #5A607C; }
#nav ul li a { display: block; color: #FFF; border-radius: 0; padding: 13px 10px; }
#nav ul li a span { float: right; }
#nav ul li ul.sub-menu {
position: static;
width: auto;
background: none;
border-radius: 0;
box-shadow: none;
}
#nav ul li:hover ul.sub-menu {
display: none;
}
#nav ul li ul:before,
#nav ul li ul:after {
display: none;
}
#nav ul li:hover a span {
transform: rotateZ(0);
-webkit-transform: rotateZ(0);
}
#nav ul li.open a { }
#nav ul li.open span {
/*transform: rotateZ(90deg);
border-left: none;
border-bottom: 1px solid #5a607c; */
background: url("../images/caret_open.png") center center no-repeat;
}
#nav ul li.open ul.sub-menu { display: block; background: #4D5166; animation-duration: 0s !important; }
#nav ul li a:hover, #nav ul li.active a, #nav ul li.quote a {
background: none;
color: #FFF;
}
#nav ul li span {
background: url("../images/caret_arrow.png") center center no-repeat;
display: block;
color: white;
height: 11px;
margin: 0;
padding: 16px 17px;
position: absolute;
right: 0;
top: 0;
width: 7px;
cursor: pointer;
border-left: 1px solid #5a607c;
z-index: 3;
}
#nav ul li:hover a {
background: none;
color: #fff;
}
html.open-menu { overflow: hidden; max-height: 100%; max-width: 100%; }
html.open-menu div#overlay {
visibility: visible;
opacity: 1;
width: calc(-150%);
left: 250px;
}
html.open-menu nav#nav {
z-index: 5;
}
}
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>
<link href="https://stackpath.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet" integrity="sha384-wvfXpqpZZVQGK6TAh5PVlGOfQNHSoD2xbE+QkPxCAFlNEevoEH3Sl0sibVcOQVnN" crossorigin="anonymous">
<div id="wrapper">
<a id="toggle" href="javascript:void(0)"><span class="fa fa-bars"></span></a>
<nav id="nav">
<ul>
<li><a href="index">home</a></li>
<li><a href="what_we_do">what we do</a>
<ul class="sub-menu">
<li><a href="#">submenu item</a></li>
<li><a href="#">submenu item</a></li>
</ul>
</li>
<li><a href="about">about us</a>
<ul class="sub-menu">
<li><a href="#">submenu item</a></li>
<li><a href="#">submenu item</a></li>
</ul>
</li>
</ul>
</nav>
</div>
&#13;
答案 2 :(得分:0)
这是工作小提琴 - https://jsfiddle.net/464dzhno/4/
$('nav#nav li:has(ul)').toggleClass('open');
替换为
$(this).closest('li:has(ul)').toggleClass('open');
您只需针对其子级是您正在处理的范围点击的li来切换open
类。
答案 3 :(得分:0)
将您的点击功能span.fa-caret-right更改为
$('span.fa-caret-right').on('click',function(){
$('nav#nav li:has(ul)').removeClass('open');
$(this).parent().addClass('open');
});