Reputation: 590
I have a <li>
that when hovered
open a <ul>
.
I would like to be able to also click the <li>
and have the <ul>
open and close but still keep the hover functionality. At the moment once the click occurs I lose the :hover
.
CSS
ul#popup-menu {
display: inline-block;
margin: 0;
cursor: pointer;
}
ul#popup-menu ul {
display: none;
position: absolute;
left: 0;
top: 100%;
margin: 0;
}
ul#popup-menu li {
list-style-type: none;
position: relative;
}
ul#popup-menu li:hover > * {
display: block;
}
HTML
<ul id="popup-menu">
<li>
Click to open
<ul>
<li>
Item 1
</li>
<li>
Item 2
</li>
<li>
Item 2
</li>
</ul>
</li>
</ul>
JavaScript
$(document).ready(function() {
$('#popup-menu').click(function() {
var element = $('ul#popup-menu ul')
if (element.css('display') === 'block') {
$('ul#popup-menu ul').css('display', 'none');
} else {
$('ul#popup-menu ul').css('display', 'block');
}
});
});
Upvotes: 0
Views: 4199
Reputation: 8795
Try this, this keep your hover effect even after click. This even works if you remove :hover from your CSS.
$(document).ready(function() {
$('#popup-menu').click(function(){
$("ul li > ul").show();
$(this).mouseout(function(){
$("ul li > ul").hide();
});
});
});
Upvotes: 0
Reputation: 1712
$(document).ready(function() {
$('#popup-menu').click(function() {
if ($('ul#popup-menu li ul').css('display') === 'block') {
$('ul#popup-menu li ul').css('display', 'none');
} else {
$('ul#popup-menu li ul').css('display', 'block');
}
});
$("ul#popup-menu li").bind
({
mouseover:
function ()
{
$('ul#popup-menu li ul').css('display', 'block');
},
mouseout:
function ()
{
$('ul#popup-menu li ul').css('display', 'none');
}
});
});
Upvotes: 1
Reputation: 1844
Add code that resets style attribute, because inline-style has higher priority that ul#popup-menu li:hover > *
css selector. So when style is set display-block
is always none
;
Try this:
$(document).ready(function() {
$('#popup-menu').click(function() {
if ($('ul#popup-menu ul').css('display') === 'block') {
$('ul#popup-menu ul').css('display', 'none');
} else {
$('ul#popup-menu ul').css('display', 'block');
}
});
$('#popup-menu > li').mouseleave(function() {
$('ul', this).removeAttr('style');
})
});
So when you mouseleave the menu header it goest to nested UL
and remove style
attribute, so hover works again
Upvotes: 2
Reputation: 10207
Just play little with classes and do it with JS
$(document).ready(function() {
$('#popup-menu').hover(
function() {
$('ul#popup-menu ul.hover').css('display', 'block');
},
function() {
$('ul#popup-menu ul.hover').css('display', 'none');
}
);
$('#popup-menu').click(function() {
if ($('ul#popup-menu ul').hasClass('active')) {
$('ul#popup-menu ul').removeClass('active');
$('ul#popup-menu ul').addClass('hover');
} else {
$('ul#popup-menu ul').removeClass('hover');
$('ul#popup-menu ul').addClass('active');
}
});
});
ul#popup-menu {
display: inline-block;
margin: 0;
cursor: pointer;
}
ul#popup-menu ul {
display: none;
position: absolute;
left: 0;
top: 100%;
margin: 0;
}
ul#popup-menu ul.active {
display:block;
}
ul#popup-menu li {
list-style-type: none;
position: relative;
}
/* ul#popup-menu li:hover > * {
display: block;
} */
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div>
<ul id="popup-menu">
<li>
Open menu
<ul class="hover">
<li>
Item
</li>
<li>
Item
</li>
<li>
Item
</li>
</ul>
</li>
</ul>
</div>
Upvotes: 0