我有一个全角下拉菜单,显示所有子菜单悬停或获得焦点(使其可通过键盘访问)。这是您经常看到的菜单,但键盘可访问性我还没有找到以模拟悬停行为的方式实现的示例(换句话说:扩展菜单)。
这是菜单的 HTML:
<div id="menu">
<div class="container">
<ul class="row">
<li class="first"><a href="link">Home</a></li>
<li><a href="link">Projects</a>
<ul class="inner">
<li class="first"><a href="link">Project 1</a></li>
<li class="last"><a href="link">Project 2</a></li>
</ul>
</li>
<li class="last"><a href="link">Contact</a>
<ul class="inner">
<li class="first"><a href="link">Visit us</a></li>
<li class="last"><a href="link">Email</a></li>
</ul>
</li>
</ul>
</div>
</div>
我一直在尝试各种方法来使这项工作与 Jquery 一起工作(仍在学习 Jquery),并且它部分工作。悬停功能有点工作,仍然发生了一些奇怪的事情。问题在于焦点/模糊功能。我已经为模糊功能添加了超时,否则每次我切换到另一个链接时它都会触发。但是有了这个超时,模糊效果就不会再发生了。(菜单保持扩展)。
可能使这与其他解决方案不同的是,我希望悬停、聚焦和模糊事件发生在#menu div 上,而不是单个链接上。我希望它以这种方式工作,因为它是一个全宽菜单,当悬停菜单时,您会立即看到所有子菜单。我发现在 div 中添加 'tabindex = 0' 可以使用焦点和模糊。因此,我决定也通过 Jquery 添加它。
我的 Jquery 看起来像这样:
$(document).ready(function() {
/* dropdownmenu */
$("#menu")
.attr("tabindex",0)
// HOVER
.hover
( function ()
{
$(this).addClass('dropdown');
$(this).animate({ height: '20em'});
},
//hover out
function()
{
$(this).animate(
{ height: '6em' },
{ complete: function() { $(this).removeClass('dropdown'); } }
)
}
)
// FOCUS
.focus
( function ()
{
$(this).addClass('dropdown');
$(this).animate({height: '20em'});
}
)
// BLUR
.blur
( function()
{
setTimeout(function()
{
$(this).animate(
{height: '6em'},
{ complete: function() { $(this).removeClass('dropdown'); } }
)
},500);
}
);
我希望有人可以帮助我一点,使这个 Jquery 更好。是不是太长了?为什么悬停功能表现奇怪而模糊功能根本不起作用?我应该以另一种方式解决这个问题吗?
我还在 jsfiddle 中添加了这个:http: //jsfiddle.net/CpdM2/1/ 这里的高度不同以更好地展示行为。
谢谢你的帮助!
编辑
我现在正在尝试使用 Jquery 的不同方法。我越来越近了,唯一的问题仍然是模糊功能。
我的新jQuery:
$.fn.accessibleDropDown = function ()
{
var el = $(this);
$(el).mouseenter(function() {
$("#menu").addClass('dropdown');
$("#menu").animate({ height: '7em'});
}).mouseleave(function() {
$("#menu").animate(
{ height: '1em' },
{ complete: function() { $("#menu").removeClass('dropdown'); } }
);
});
/* Make dropdown menus keyboard accessible */
$("#menu").focus(function() {
//alert("focus");
$("#menu").addClass('dropdown');
$("#menu").animate({ height: '7em'});
}).blur(function() {
setTimeout(function() {
if ($('#menu').find(':focus').length > 0) {
return false;
} else {
alert("menu does not have focus");
$("#menu").animate(
{ height: '1em' },
{ complete: function() { $("#menu").removeClass('dropdown'); } }
);
}
}, 50);
});
};
$("#menu").attr("tabindex",0).accessibleDropDown();
在此处查看实际操作:http: //jsfiddle.net/kBNRv/
查看#menu div 是否失去焦点的代码由于某种原因无法正常工作。我真的希望有人能指出我正确的方向。提前致谢。