OK, also was ich brauche, ist ziemlich einfach.
Ich habe eine Navbar mit einigen Dropdown-Menüs eingerichtet (mit class="dropdown-toggle" data-toggle="dropdown"
), und es funktioniert gut.
Die Sache ist, es funktioniert "onClick
", während ich es vorziehen würde, wenn es "onHover
" funktionieren würde.
Gibt es eine integrierte Möglichkeit, dies zu tun?
Die einfachste Lösung wäre in CSS. Etwas hinzufügen wie ...
.dropdown:hover .dropdown-menu {
display: block;
margin-top: 0; // remove the gap so it doesn't close
}
Am besten lassen Sie das Bootstraps-Click-Ereignis mit einem Hover auslösen. Auf diese Weise sollte es berührungslos bleiben
$('.dropdown').hover(function(){
$('.dropdown-toggle', this).trigger('click');
});
Sie können die Hover-Funktion von jQuery verwenden.
Sie müssen nur die Klasse open
hinzufügen, wenn die Maus in die Klasse eintritt, und die Klasse entfernen, wenn die Maus das Dropdown-Menü verlässt.
Hier ist mein Code:
$(function(){
$('.dropdown').hover(function() {
$(this).addClass('open');
},
function() {
$(this).removeClass('open');
});
});
Mit jQuery ist dies ein einfacher Weg:
$(document).ready(function(){
$('ul.nav li.dropdown').hover(function() {
$(this).find('.dropdown-menu').stop(true, true).delay(200).fadeIn(200);
}, function() {
$(this).find('.dropdown-menu').stop(true, true).delay(200).fadeOut(200);
});
});
Für CSS wird es verrückt, wenn Sie auch darauf klicken. Dies ist der Code, den ich verwende, er ändert auch nichts für die mobile Ansicht.
$('.dropdown').mouseenter(function(){
if(!$('.navbar-toggle').is(':visible')) { // disable for mobile view
if(!$(this).hasClass('open')) { // Keeps it open when hover it again
$('.dropdown-toggle', this).trigger('click');
}
}
});
In Twitter Bootstrap ist nicht implementiert aber Sie können das dieses Plugin verwenden
Update 1:
Sames Frage hier
Bewegen Sie den Mauszeiger über die Navigationselemente, um zu sehen, dass sie beim Bewegen aktiviert werden. http://cameronspear.com/demos/Twitter-bootstrap-hover-dropdown/#
Sie haben also diesen Code:
<a class="dropdown-toggle" data-toggle="dropdown">Show menu</a>
<ul class="dropdown-menu" role="menu">
<li>Link 1</li>
<li>Link 2</li>
<li>Link 3</li>
</ul>
Normalerweise funktioniert es für ein Klickereignis und für das Hover-Ereignis. Dies ist sehr einfach, verwenden Sie einfach diesen Javascript/Jquery-Code:
$(document).ready(function () {
$('.dropdown-toggle').mouseover(function() {
$('.dropdown-menu').show();
})
$('.dropdown-toggle').mouseout(function() {
t = setTimeout(function() {
$('.dropdown-menu').hide();
}, 100);
$('.dropdown-menu').on('mouseenter', function() {
$('.dropdown-menu').show();
clearTimeout(t);
}).on('mouseleave', function() {
$('.dropdown-menu').hide();
})
})
})
Das funktioniert sehr gut und hier ist die Erklärung: Wir haben einen Button und ein Menü. Wenn Sie den Mauszeiger über die Schaltfläche bewegen, wird das Menü angezeigt, und wenn Sie die Maus außerhalb der Schaltfläche bewegen, wird das Menü nach 100 ms ausgeblendet. Wenn Sie sich fragen, warum ich das benutze, liegt es daran, dass Sie Zeit benötigen, um den Cursor von der Schaltfläche über das Menü zu ziehen. Wenn Sie sich im Menü befinden, wird die Uhrzeit zurückgesetzt und Sie können so oft dort bleiben, wie Sie möchten. Wenn Sie das Menü verlassen, wird das Menü sofort ohne Zeitüberschreitung ausgeblendet.
Ich habe diesen Code in vielen Projekten verwendet. Wenn Sie Probleme bei der Verwendung haben, können Sie mir gerne Fragen stellen.
Versuchen Sie dies mit der Hover-Funktion mit Fadein-Animationen
$('ul.nav li.dropdown').hover(function() {
$(this).find('.dropdown-menu').stop(true, true).delay(200).fadeIn(500);
}, function() {
$(this).find('.dropdown-menu').stop(true, true).delay(200).fadeOut(500);
});
Dies ist, was ich verwende, um es mit einigen jQuery auf Hover-Dropdown zu machen
$(document).ready(function () {
$('.navbar-default .navbar-nav > li.dropdown').hover(function () {
$('ul.dropdown-menu', this).stop(true, true).slideDown('fast');
$(this).addClass('open');
}, function () {
$('ul.dropdown-menu', this).stop(true, true).slideUp('fast');
$(this).removeClass('open');
});
});
Ich habe ein passendes Plugin für die Dropdown-Hover-Funktion veröffentlicht, in dem Sie sogar definieren können, was passiert, wenn Sie auf das dropdown-toggle
-Element klicken:
https://github.com/istvan-ujjmeszaros/bootstrap-dropdown-hover
Ich hatte Probleme mit allen bisher bestehenden Lösungen. Die einfachen CSS verwenden die Klasse .open
nicht für .dropdown
. Daher wird keine Rückmeldung zum Dropdown-Element angezeigt, wenn die Dropdown-Liste sichtbar ist.
Die js stören das Klicken auf .dropdown-toggle
, so dass das Dropdown-Menü im Hover-Modus erscheint und beim Klicken auf ein geöffnetes Dropdown-Menü ausgeblendet wird. Wenn Sie die Maus herausziehen, wird das Dropdown-Menü erneut geöffnet. Einige der js-Lösungen bremsen iOS-Kompatibilität, einige Plugins funktionieren nicht mit modernen Desktop-Browsern, die Touch-Events unterstützen.
Aus diesem Grund habe ich das Bootstrap Dropdown Hover Plugin erstellt, das alle diese Probleme verhindert, indem nur die standardmäßige Bootstrap-JavaScript-API verwendet wird, ohne dass ein Hack erforderlich ist.
Ich probiere andere Lösungen aus, ich benutze Bootstrap 3, aber das Dropdown-Menü wird zu schnell geschlossen, um darüber zu gelangen
angenommen, dass Sie class = "dropdown" zu li hinzufügen, fügte ich ein Timeout hinzu
var hoverTimeout;
$('.dropdown').hover(function() {
clearTimeout(hoverTimeout);
$(this).addClass('open');
}, function() {
var $self = $(this);
hoverTimeout = setTimeout(function() {
$self.removeClass('open');
}, 150);
});
Dadurch können Sie Ihre eigene Hover-Klasse für Bootstrap erstellen:
CSS:
/* Hover dropdown */
.hover_drop_down.input-group-btn ul.dropdown-menu{margin-top: 0px;}/*To avoid unwanted close*/
.hover_drop_down.btn-group ul.dropdown-menu{margin-top:2px;}/*To avoid unwanted close*/
.hover_drop_down:hover ul.dropdown-menu{
display: block;
}
Ränder werden so eingestellt, dass ein unerwünschtes Schließen vermieden wird, und sie sind optional.
HTML:
<div class="btn-group hover_drop_down">
<button type="button" class="btn btn-default" data-toggle="dropdown"></button>
<ul class="dropdown-menu" role="menu">
...
</ul>
</div>
Vergessen Sie nicht, das Tastenattribut data-toggle = "dropdown" zu entfernen, wenn Sie onclick open entfernen möchten. Dies funktioniert auch, wenn die Eingabe mit dropdown angehängt wird.
Die Navbar wird nur dann angezeigt, wenn Sie sich nicht auf einem mobilen Gerät befinden, da ich finde, dass das Schweben der Navigation auf mobilen Divices nicht gut funktioniert:
$( document ).ready(function() {
$( 'ul.nav li.dropdown' ).hover(function() {
// you could also use this condition: $( window ).width() >= 768
if ($('.navbar-toggle').css('display') === 'none'
&& false === ('ontouchstart' in document)) {
$( '.dropdown-toggle', this ).trigger( 'click' );
}
}, function() {
if ($('.navbar-toggle').css('display') === 'none'
&& false === ('ontouchstart' in document)) {
$( '.dropdown-toggle', this ).trigger( 'click' );
}
});
});
$('.navbar .dropdown').hover(function() {
$(this).find('.dropdown-menu').first().stop(true, true).slideDown(150);
}, function() {
$(this).find('.dropdown-menu').first().stop(true, true).slideUp(105)
});
Das Auslösen eines click
-Ereignisses mit einer hover
hat einen kleinen Fehler. Wenn mouse-in
und dann eine click
den umgekehrten Effekt erzeugt. Es opens
wenn mouse-out
und close
wenn mouse-in
. Eine bessere Lösung:
$('.dropdown').hover(function() {
if (!($(this).hasClass('open'))) {
$('.dropdown-toggle', this).trigger('click');
}
}, function() {
if ($(this).hasClass('open')) {
$('.dropdown-toggle', this).trigger('click');
}
});
html
<div class="dropdown">
<button class="btn btn-primary dropdown-toggle" type="button" data-toggle="dropdown">
Dropdown Example <span class="caret"></span>
</button>
<ul class="dropdown-menu">
<li><a href="#">HTML</a></li>
<li><a href="#">CSS</a></li>
<li><a href="#">JavaScript</a></li>
</ul>
</div>
jquery
$(document).ready( function() {
/* $(selector).hover( inFunction, outFunction ) */
$('.dropdown').hover(
function() {
$(this).find('ul').css({
"display": "block",
"margin-top": 0
});
},
function() {
$(this).find('ul').css({
"display": "none",
"margin-top": 0
});
}
);
});
Die Lösung, die ich vorschlage, stellt fest, ob das Gerät nicht berührungslos ist und der navbar-toggle
(Hamburgermenü) nicht sichtbar ist, und lässt den übergeordneten Menüpunkt aufschlussreiches Untermenü bei hover und und seinem Link bei click folgen.
Macht auch den Rand 0, da die Lücke zwischen der Navigationsleiste und dem Menü in einigen Browsern nicht zu den Unterelementen führt
$(function(){
function is_touch_device() {
return 'ontouchstart' in window // works on most browsers
|| navigator.maxTouchPoints; // works on IE10/11 and Surface
};
if(!is_touch_device() && $('.navbar-toggle:hidden')){
$('.dropdown-menu', this).css('margin-top',0);
$('.dropdown').hover(function(){
$('.dropdown-toggle', this).trigger('click').toggleClass("disabled");
});
}
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/Twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>
<ul id="nav" class="nav nav-pills clearfix right" role="tablist">
<li><a href="#">menuA</a></li>
<li><a href="#">menuB</a></li>
<li class="dropdown"><a href="#" class="dropdown-toggle" data-toggle="dropdown">menuC</a>
<ul id="products-menu" class="dropdown-menu clearfix" role="menu">
<li><a href="">A</a></li>
<li><a href="">B</a></li>
<li><a href="">C</a></li>
<li><a href="">D</a></li>
</ul>
</li>
<li><a href="#">menuD</a></li>
<li><a href="#">menuE</a></li>
</ul>
$(function(){
$("#nav .dropdown").hover(
function() {
$('#products-menu.dropdown-menu', this).stop( true, true ).fadeIn("fast");
$(this).toggleClass('open');
},
function() {
$('#products-menu.dropdown-menu', this).stop( true, true ).fadeOut("fast");
$(this).toggleClass('open');
});
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/Twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>
<ul id="nav" class="nav nav-pills clearfix right" role="tablist">
<li><a href="#">menuA</a></li>
<li><a href="#">menuB</a></li>
<li class="dropdown"><a href="#" class="dropdown-toggle" data-toggle="dropdown">menuC</a>
<ul id="products-menu" class="dropdown-menu clearfix" role="menu">
<li><a href="">A</a></li>
<li><a href="">B</a></li>
<li><a href="">C</a></li>
<li><a href="">D</a></li>
</ul>
</li>
<li><a href="#">menuD</a></li>
<li><a href="#">menuE</a></li>
</ul>
Dropdown-Liste "Bootstrap" Bearbeiten Sie den Hover und bleiben Sie beim Klicken in der Nähe, indem Sie property display: block hinzufügen. in css und Entfernen dieser Attribute data-toggle = "dropdown" role = "button" vom button-Tag
.dropdown:hover .dropdown-menu {
display: block;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.0/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.0/js/bootstrap.min.js"></script>
</head>
<body>
<div class="container">
<div class="dropdown">
<button class="btn btn-primary dropdown-toggle">Dropdown Example
<span class="caret"></span></button>
<ul class="dropdown-menu">
<li><a href="#">HTML</a></li>
<li><a href="#">CSS</a></li>
<li><a href="#">JavaScript</a></li>
</ul>
</div>
</div>
</body>
</html>