我正在尝试用推送菜单替换下拉菜单。最初,下拉菜单嵌套在主导航链接旁边。在键盘上使用 Tab 时,它按预期工作。例子:
<li>
<a href="#" name="#women">WOMEN</a> <!-- *Main Navigation -->
<ul id="women"> <!-- *Submenu -->
<li><a href="#">Women</a></li>
<li><a href="#">Women's Plus</a></li>
<li><a href="#">Petites</a></li>
</ul>
</li>
对于推送菜单,HTML 的结构不同。例子:
<ul> <!-- *Main Navigation -->
<li><a href="#" name="#women">Women</a></li>
<li><a href="#" name="#accessories">Accessories</a></li>
</ul>
<div> <!-- *Submenus -->
<ul id="women">
<li><a href="#">Women</a></li>
<li><a href="#">Women's Plus</a></li>
<li><a href="#">Petites</a></li>
</ul>
<ul id="accessories">
<li><a href="#">Women</a></li>
<li><a href="#">Men</a></li>
</ul>
</div>
我遇到的问题是键盘上的 Tab 完全错过了子菜单。我尝试使用focus()
with$(ahrefname).find('a').first().focus();
但我必须遗漏一些东西,因为它不起作用。
$(document).ready(function() {
$('.lp-sub-menu ul').each(function () {
height = $(this).height();
$(this).transition({
y: +-+height + 'px'
});
});
var heights = $('.lp-sub-menu > ul').map(function () {
return $(this).height();
}).get(),
maxHeight = Math.max.apply(null, heights);
$('#top').on('click focus', 'a', function (e) {
"use strict";
e.preventDefault();
var ahrefname = this.name,
eLeft = $(this).offset().left,
percent = 100 / $(window).width() * eLeft,
submenuHeight = $(ahrefname).height();
if ($(ahrefname).siblings().hasClass('active-sub-menu')) {
$(this).parents('ul').find('a').removeClass('active-menu').find('span').css({
'visibility': ''
});
$(ahrefname).siblings().transition({
y: +-+maxHeight + 'px'
}).delay(10).queue(function (next) {
$(ahrefname).siblings().removeClass('active-sub-menu').css({
'margin-left': ''
});
next();
});
$('.lp-sub-menu').transition({
height: +submenuHeight + 'px'
});
$(ahrefname).css({
'margin-left': percent + '%'
}).delay(4).queue(function (next) {
$(ahrefname).addClass('active-sub-menu').transition({
y: +0 + 'px'
});
next();
});
$(this).addClass('active-menu').find('span').css({
'visibility': 'visible'
});
} else if ($(ahrefname).hasClass('active-sub-menu')) {
$('.lp-sub-menu').transition({
height: +-+submenuHeight + 'px'
});
$(ahrefname).removeClass('active-sub-menu').transition({
y: +0 + 'px'
}).css({
'margin-left': ''
});
$(this).removeClass('active-menu').find('span').css({
'visibility': ''
});;
} else {
$('.lp-sub-menu').transition({
height: +submenuHeight + 'px'
});
$(ahrefname).find('a').first().focus();
});
});
我有一个JS Fiddle正在使用它。任何帮助,将不胜感激!
更新:
谢谢@hyunkeln!专注于子菜单有效,但下一个菜单项出现问题 - 子菜单当时没有打开。我将功能更新为以下...
$('.lp-sub-menu ul').each(function(){
var height = $(this).height(),
oid = $(this).attr('id');
$(this).transition({ y: + - + height + 'px' });
$(this).find('a:last').focusout(function(){
$( "[name|='#"+oid+"']" ).focus();
});
});
它导致子菜单关闭。再次 Tab 并打开下一个子菜单。也许这是件好事?没有把握。这是最新的JS Fiddle。(我很好奇为什么制表符在 jsFiddle 中不能很好地工作?我必须在本地测试才能看到结果。)