Monday, June 3, 2024
 Popular · Latest · Hot · Upcoming
110
rated 0 times [  116] [ 6]  / answers: 1 / hits: 5288  / 10 Years ago, mon, may 26, 2014, 12:00:00

I have a dropdown menu that I have created using CSS and jQuery that I am trying to make dropdown either on on hover and on click.



By default I want the dropdown to be displayed on click, but given the class .dropdown-hover I want it to be displayed when hovered over.



Here is a JSFiddle of what I currently have: http://jsfiddle.net/dR8hL/1/



Right now, no matter what class is applied to the dropdown it is displayed on hover and I am unsure of how to fix that.



HTML



<div class=dropdown dropdown-hover>Dropdown on hover                
<ul class=dropdown-menu>
<li><a href=#>Profile</a></li>
<li><a href=#>Settings</a></li>
<li><a href=#>Log out</a></li>
</ul>
</div>

<div class=dropdown>Dropdown on click
<ul class=dropdown-menu>
<li><a href=#>Profile</a></li>
<li><a href=#>Settings</a></li>
<li><a href=#>Log out</a></li>
</ul>
</div>


CSS



.dropdown {
cursor: pointer;
outline: none;
position: relative;
width: auto;
}

.dropdown .dropdown-menu {
background-color: #fff;
border: 1px solid #eee;
border-radius: inherit;
font-weight: inherit;
left: 0;
margin-left: 0px;
opacity: 0;
pointer-events: none;
position: absolute;
right: 0;
text-transform: none;
width: 200px;
z-index: 99999;

-webkit-transition: all 0.3s ease-in;
-moz-transition: all 0.3s ease-in;
-ms-transition: all 0.3s ease-in;
-o-transition: all 0.3s ease-in;
transition: all 0.3s ease-in;
}

.dropdown .dropdown-menu a { text-decoration: none; }

.dropdown .dropdown-menu p {
margin: 0;
padding: 10px 15px;
}

.dropdown .dropdown-menu span { line-height: inherit; }

.dropdown ul.dropdown-menu { list-style-type: none; }

.dropdown .dropdown-menu li {
display: block;
padding: 5px 10px;
}

.dropdown .dropdown-menu li:hover { background-color: #f3f8f8; }

.dropdown.dropdown-active .dropdown-menu {
opacity: 1;
pointer-events: auto;
}


jQuery



function DropDown(el) {
this.dd = el;
this.initEvents();
}

DropDown.prototype = {
initEvents: function () {
var obj = this;

// Determine if dropdown is on hover or on click
if ($(.dropdown).hasClass(dropdown-hover)) {
// Toggle .dropdown-active on hover
$(.dropdown).mouseenter(function (event) {
$(this).addClass(dropdown-active);
event.stopPropagation();
});

$(.dropdown-menu).mouseleave(function () {
$(.dropdown).removeClass(dropdown-active);
});
} else {
// Toggle .dropdown-active on click
obj.dd.on('click', function (event) {
$(this).toggleClass('dropdown-active');
event.stopPropagation();
});
}
}
}

$(function () {
var dd = new DropDown($('.dropdown'));

$(document).click(function () {

// Remove class from all dropdowns
$('.dropdown').removeClass('dropdown-active');
});
});

More From » jquery

 Answers
5

Could you not just target the .dropdown-hover class. You shouldn't need the if statement



        $(.dropdown-hover).mouseenter(function (event) {
event.stopPropagation();
$(this).addClass(dropdown-active);
});
$(.dropdown-hover).mouseleave(function () {
$(.dropdown).removeClass(dropdown-active);
});

// Toggle .dropdown-active on click
obj.dd.on('click', function (event) {
event.stopPropagation();
$(this).toggleClass('dropdown-active');
});


Updated JSFiddle http://jsfiddle.net/47mSS/


[#45027] Sunday, May 25, 2014, 10 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
zachary

Total Points: 175
Total Questions: 89
Total Answers: 108

Location: Fiji
Member since Wed, Jul 14, 2021
3 Years ago
zachary questions
;