我正在尝试制作一个键盘可访问的菜单,但我不知道如何让它显示焦点下拉菜单。
我有
.main-menu li:hover ul,
.main-menu li:focus ul {
display: block;
}
问题在于,当它专注于嵌套在 li 中的 a 而没有显示 ul 时。Tabbing 专注于 a 标签。
这是我的完整代码:http: //jsfiddle.net/bxpe4/
我正在尝试制作一个键盘可访问的菜单,但我不知道如何让它显示焦点下拉菜单。
我有
.main-menu li:hover ul,
.main-menu li:focus ul {
display: block;
}
问题在于,当它专注于嵌套在 li 中的 a 而没有显示 ul 时。Tabbing 专注于 a 标签。
这是我的完整代码:http: //jsfiddle.net/bxpe4/
此处可能使用的另一个属性是:focus-within
. 因此,如果您执行以下操作,它也应该可以工作。
.main-menu li:hover ul,
.main-menu li:focus-within ul {
display: block;
}
focus-within
伪类不仅关心当前元素,还关心它的所有子元素。我认为这是一个非常干净的解决方案,它适用于我的问题。
切换时,您关注的是anchor
内部.main-menu li
,而不是list-item
本身。
有两种解决方法:
a) 使用+
选择器
.main-menu li a:focus + ul {
display: block;
}
但是,这使得标签到其他锚点变得有问题(在标签按下时,它应该转到子菜单中的第一个锚点,但它没有显示,所以什么也没有发生)。
b) 使用tabindex
属性
这将需要您将tabindex
菜单锚点设置为负值(将它们从选项卡中删除)并将选项卡设置为列表项。
您需要更改锚点和列表项的样式以显示红色背景,添加一个新的选择器:
.main-menu li a:hover,
.main-menu li a:focus,
.main-menu li.dropped > a,
.main-menu li:focus > a /* this one was added */ {
/* your styles */
}
然而,这并不是一个真正的好习惯,因为焦点列表项意味着您无法使用键盘访问锚点。您可以使用 JavaScript 来模拟事件(绑定列表项的按键以单击锚点),在 jQuery 中它将是这样的:
$('li[tabindex]').on('keypress', function() {
$(this).find('a').click();
});
如果顶级锚点没有任何操作(仅用于下拉目的),这不是问题,在这种情况下您根本不需要它们。