在尝试了许多通过 stackoverflow 发布的插件和解决方案后,我想出了相当简单的代码:
- 通过原生 Bootstrap 类在悬停时显示下拉菜单(因此它与按钮单击配合得很好)
- 设置 href 时使按钮链接起作用
- 在移动设备上保持原始行为
简单版
$('ul.nav li.dropdown').hover(function() {
if (!$('.navbar-toggle').is(':visible')) {
$(this).toggleClass('open', true);
}
}, function() {
if (!$('.navbar-toggle').is(':visible')) {
$(this).toggleClass('open', false);
}
});
$('ul.nav li.dropdown a').click(function(){
if (!$('.navbar-toggle').is(':visible') && $(this).attr('href') != '#') {
$(this).toggleClass('open', false);
window.location = $(this).attr('href')
}
});
$('.navbar-toggle').is(':visible') 检查我们当前是否在移动视图中,
$(this).toggleClass('open', true) 添加或删除引导程序使用的 open css 类,
window.location = $(this).attr('href') 将用户发送到链接 href 中设置的位置。
要添加 jQuery 转换,我们必须稍微修改一下脚本。
修改版
visible = false;
function toggleDropdown(dropdown, delay, fade, state) {
if (state === undefined) visible = !visible
else visible = state
dropdown.children('.dropdown-menu').stop(true, true).delay(delay)[visible ? 'fadeIn' : 'fadeOut'](fade, function() {
dropdown.toggleClass('open', visible);
dropdown.children('.dropdown-toggle').attr('aria-expanded', visible);
$(this).css('display', '');
});
}
$('ul.nav li.dropdown').hover(function() {
if ($('.navbar-toggle').is(':visible')) return;
toggleDropdown($(this), 50, 100, true)
}, function() {
if ($('.navbar-toggle').is(':visible')) return;
toggleDropdown($(this), 400, 200, false)
});
$('ul.nav li.dropdown a').click(function(){
if ($('.navbar-toggle').is(':visible')) return;
if ($(this).attr('href') != '#') {
toggleDropdown($(this).parent(), 50, 100, false)
window.location = $(this).attr('href')
}
else {
toggleDropdown($(this).parent(), 50, 100)
}
});
visible 变量可以在动画运行时重新悬停时使一切正常运行。