我想找到一个通用规则,它将帮助我使用选项卡在菜单中导航。我知道如何捕捉标签事件,但有几个问题:Jquery:使用选项卡在菜单中导航
- 有下拉菜单,我不能只加按Tab键下拉菜单。
- 下拉菜单的结构不是标准的。即隐藏的ul元素可以在其他元素(例如div)内,或者可以是在其他下拉菜单内嵌套的下拉菜单
- 使隐藏菜单可见/不可见的事件变化。点击和悬停事件是最流行的。
有人可以帮助我吗?
我想找到一个通用规则,它将帮助我使用选项卡在菜单中导航。我知道如何捕捉标签事件,但有几个问题:Jquery:使用选项卡在菜单中导航
有人可以帮助我吗?
您可以在列表项上使用触发显示下拉列表的tabindex属性。这将使父母li
通过按下标签进行对焦。然后,您可以使用一些CSS和Javascript将规则应用于儿童,以使其可见。
关于小提琴:
请注意,我用的是opacity
和pointer-events
性质CSS切换下拉的状态。当一个元素应用visibility: hidden
或display: none
时,它根本不会被聚焦。由于Tab键默认将焦点带到下一个可聚焦元素,因此您的目标元素不应该在按Tab键时将这些属性中的任何一个设置为显示的值。
此外,您必须准确地跟踪整个导航中的tabindexes。首先是第一个主要锚点,然后是封闭列表项目,以使下拉菜单可见。然后来到里面的锚。 (这是JS必须从CSS中接管的点)当3个子项被分配了tabindex时,这会带给我们tabindex 5,因此我们将继续从6开始计算下一个主项目的直接<a>
子项,等等。
您必须弄清楚如何使您的多级下拉菜单按预期工作,但这是一个起点。您还可以检查您的脚本中是否有箭头按键,并在回复中提供另一个元素焦点。
小提琴:
$(function() {
$('nav').on('focus', '.dropdown a', function() {
$(this).closest('.mainItem').addClass('focus');
}).on('blur', '.dropdown a', function() {
$(this).closest('.mainItem').removeClass('focus');
});
});
nav > ul {
display: flex;
}
nav ul {
list-style: none;
margin: 0;
padding: 0;
}
nav .mainItem {
position: relative;
margin: 0 5px;
padding: 0.5rem;
background-color: #eee;
}
nav .dropdown {
position: absolute;
width: 100%;
left: 0;
top: 100%;
opacity: 0;
pointer-events: none;
}
nav .mainItem:hover .dropdown,
nav .mainItem:focus .dropdown,
nav .mainItem.focus .dropdown,
nav .mainItem > a:hover .dropdown,
nav .mainItem > a:focus .dropdown
nav .mainItem.focus .dropdown {
opacity: 1;
pointer-events: all;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<nav>
<ul>
<li class="mainItem" tabindex="2"><a href="#" tabindex="1">Parent 1</a>
<ul class="dropdown">
<li><a href="#" tabindex="3">Child 1</a></li>
<li><a href="#" tabindex="4">Child 2</a></li>
<li><a href="#" tabindex="5">Child 3</a></li>
</ul>
</li>
<li class="mainItem" tabindex="7"><a href="#" tabindex="6">Parent 2</a>
<ul class="dropdown">
<li><a href="#" tabindex="8">Child 1</a></li>
<li><a href="#" tabindex="9">Child 2</a></li>
<li><a href="#" tabindex="10">Child 3</a></li>
</ul>
</li>
</ul>
</nav>
非常感谢您的回复!这非常有帮助 – themis93