我发表了一篇 的 适当的插件 强> 对于Bootstrap 3下拉悬停功能,您甚至可以在其中定义单击时发生的情况 dropdown-toggle 元素(可以禁用点击):
dropdown-toggle
https://github.com/istvan-ujjmeszaros/bootstrap-dropdown-hover
我遇到了所有以前存在的解决方案的问题。简单的CSS没有使用 .open 上课 .dropdown ,因此当下拉菜单可见时,下拉切换元素将不会有任何反馈。
.open
.dropdown
js正在干扰点击 .dropdown-toggle ,因此下拉列表会显示下拉列表,然后在单击打开的下拉列表时隐藏它,移出鼠标会触发下拉列表再次显示。一些js解决方案破坏了iOS兼容性,一些插件不适用于支持触摸事件的现代桌面浏览器。
.dropdown-toggle
这就是我成功的原因 Bootstrap Dropdown Hover 的 插入 强> 这可以防止所有这些问题 的 仅使用标准的Bootstrap javascript API,没有任何破解 强> 。即使是Aria属性也能正常使用这个插件。
使用此代码在mousehover上打开子菜单(仅限桌面):
$('ul.nav li.dropdown').hover(function () { if ($(window).width() > 767) { $(this).find('.dropdown-menu').show(); } }, function () { if ($(window).width() > 767) { $(this).find('.dropdown-menu').hide().css('display',''); } });
如果您希望第一级菜单可以点击,即使在移动设备上也可以添加:
$('.dropdown-toggle').click(function() { if ($(this).next('.dropdown-menu').is(':visible')) { window.location = $(this).attr('href'); } });
子菜单(下拉菜单)将通过鼠标悬停在桌面上打开,并通过手机和平板电脑上的点击/触摸来打开。 子菜单打开后,第二次单击将允许您打开链接。 感谢 if ($(window).width() > 767) ,子菜单将采用移动设备的全屏宽度。
if ($(window).width() > 767)
使用此脚本覆盖bootstrap.js。
jQuery(document).ready(function ($) { $('.navbar .dropdown').hover(function() { $(this).addClass('extra-nav-class').find('.dropdown-menu').first().stop(true, true).delay(250).slideDown(); }, function() { var na = $(this) na.find('.dropdown-menu').first().stop(true, true).delay(100).slideUp('fast', function(){ na.removeClass('extra-nav-class') }) }); $('.dropdown-submenu').hover(function() { $(this).addClass('extra-nav-class').find('.dropdown-menu').first().stop(true, true).delay(250).slideDown(); }, function() { var na = $(this) na.find('.dropdown-menu').first().stop(true, true).delay(100).slideUp('fast', function(){ na.removeClass('extra-nav-class') }) }); });
加强 Sudharshan的回答 ,我将它包装在媒体查询中以防止在XS显示宽度时悬停...
@media (min-width:768px) { ul.nav li.dropdown:hover > ul.dropdown-menu { display: block; } .nav .dropdown-menu { margin-top: 0; } }
此外,标记中的插入符号不是必需的,只是 的 落下 强> 为了这个班级 的 里 强> 。
这是内置于Bootstrap 3中的。 只需将其添加到您的CSS:
.dropdown:hover .dropdown-menu { display: block; }
对于插入符...我没有看到任何一个指定简单的CSS完全阻止插入符号。
干得好:
.caret { display: none !important; }
如果它们比平板电脑小,它应该隐藏掉落和它们的插入物。
@media (max-width: 768px) { .navbar ul.dropdown-menu, .navbar li.dropdown b.caret { display: none; } }
使用jQuery更好:
jQuery('ul.nav li.dropdown').hover(function() { jQuery(this).find('.dropdown-menu').stop(true, true).show(); jQuery(this).addClass('open'); }, function() { jQuery(this).find('.dropdown-menu').stop(true, true).hide(); jQuery(this).removeClass('open'); });
要使菜单在悬停时自动停止,那么可以使用基本CSS实现。您需要将选择器设置为隐藏菜单选项,然后将其设置为在适当时显示为块 li 标签悬停在上面。以twitter bootstrap页面为例,选择器如下:
li
ul.nav li.dropdown:hover > ul.dropdown-menu { display: block; }
但是,如果您使用的是Bootstrap的响应功能,则在折叠的导航栏上(在较小的屏幕上)不需要此功能。要避免这种情况,请将以上代码包装在媒体查询中:
@media (min-width: 979px) { ul.nav li.dropdown:hover > ul.dropdown-menu { display: block; } }
要隐藏箭头(插入符号),这将以不同的方式完成,具体取决于您使用的是Twitter Bootstrap版本2及更低版本还是版本3:
Bootstrap 3
要删除版本3中的插入符号,只需删除HTML即可 <b class="caret"></b> 来自 .dropdown-toggle 锚元素:
<b class="caret"></b>
<a class="dropdown-toggle" data-toggle="dropdown" href="#"> Dropdown <b class="caret"></b> <-- remove this line </a>
Bootstrap 2&amp;降低
要删除版本2中的插入符号,您需要更多地了解CSS,我建议查看如何 :after 伪元素更详细。为了让您开始理解,定位和删除twitter bootstrap示例中的箭头,您将使用以下CSS选择器和代码:
:after
a.menu:after, .dropdown-toggle:after { content: none; }
如果你进一步研究这些工作的方式而不仅仅是使用我给你的答案,它将对你有利。
的 感谢@CocaAkat指出我们错过了“&gt;”子组合子,以防止父菜单上显示子菜单 强>
$('.dropdown').hover(function(e){$(this).addClass('open')})
这将隐藏上升的
.navbar .dropdown-menu:before { display:none; } .navbar .dropdown-menu:after { display:none; }
这是我的技术,在您停止悬停在菜单或切换按钮上之后,在菜单关闭之前会稍微延迟。该 <button> 您通常会单击以显示导航菜单 #nav_dropdown 。
<button>
#nav_dropdown
$(function() { var delay_close_it, nav_menu_timeout, open_it; nav_menu_timeout = void 0; open_it = function() { if (nav_menu_timeout) { clearTimeout(nav_menu_timeout); nav_menu_timeout = null; } return $('.navbar .dropdown').addClass('open'); }; delay_close_it = function() { var close_it; close_it = function() { return $('.navbar .dropdown').removeClass('open'); }; return nav_menu_timeout = setTimeout(close_it, 500); }; $('body').on('mouseover', '#nav_dropdown, #nav_dropdown *', open_it).on('mouseout', '#nav_dropdown', delay_close_it); return $('body').on('mouseover', '.navbar .dropdown .dropdown-menu', open_it).on('mouseout', '.navbar .dropdown .dropdown-menu', delay_close_it); });
您可以使用默认值 $().dropdown('toggle') 在悬停时切换下拉菜单的方法:
$().dropdown('toggle')
$(".nav .dropdown").hover(function() { $(this).find(".dropdown-toggle").dropdown("toggle"); });
还添加了margin-top:0来重置.dropdown-menu的bootstrap css边距,这样当用户从下拉菜单慢慢地徘徊到菜单列表时,菜单列表不会消失。
ul.nav li.dropdown:hover > ul.dropdown-menu { display: block; } .nav .dropdown-menu { margin-top: 0; }
这里有很多非常好的解决方案。但是我想我会继续把我的作为另一种选择。它只是一个简单的jQuery代码片段,如果它支持将鼠标悬停在下拉菜单而不是单击,那么就像引导程序一样。我只用版本3对它进行了测试,所以我不知道它是否适用于版本2.将它保存为编辑器中的一个片段,然后按一下键。
<script> $(function() { $(".dropdown").hover( function(){ $(this).addClass('open') }, function(){ $(this).removeClass('open') } ); }); </script>
基本上,它只是说当你将鼠标悬停在下拉类时,它会向它添加开放类。然后就行了。当您停止使用下拉类或子ul / li徘徊在父li上时,它将删除打开的类。显然,这只是众多解决方案中的一种,您可以添加它以使其仅适用于.dropdown的特定实例。或者向父级或子级添加转换。