【问题标题】:jQuery using tab to go through dropdown menu links (keyboard accessibility)jQuery 使用选项卡浏览下拉菜单链接(键盘可访问性)
【发布时间】:2015-06-04 04:38:18
【问题描述】:

我有一个 css 菜单,我想通过键盘交互来访问它。我希望能够通过每个链接(包括子菜单链接)进行选项卡。

如果下拉焦点移动到下一个父链接下拉菜单,则应隐藏上一个下拉菜单。

Updated Fiddle

HTML

<ul>
    <li class="custom-MainMenu-TopNav-li">
        <div>
            <span><a href="#">Parent link 1</a></span>
            <div>
                <ul class="custom-MainMenu-SubNav-dropdown">
                   <li><a href="#">Sub Link</a></li>
                   <li><a href="#">Sub Link</a></li>
                </ul>
            </div>
        </div>
    </li>
    <li class="custom-MainMenu-TopNav-li">
        <div>
            <span>Parent link 2</span>
            <div>
                <ul class="custom-MainMenu-SubNav-dropdown">
                   <li><a href="#">Sub Link</a></li>
                   <li><a href="#">Sub Link</a></li>
                </ul>
            </div>
        </div>
    </li>
</ul>

JavaScript

accessibleDropdown();
    function accessibleDropdown(){

        jQuery('.custom-MainMenu-TopNav-li a').each(function(){
            jQuery(this).focus(function(){
                jQuery(this).addClass('focused');
                var menuParent = jQuery(this).parent().next().find('ul');
                jQuery(menuParent).css('display','block');
            });

            jQuery(this).blur(function(){
                jQuery(this).removeClass('focused');
            });
        });
    } 

【问题讨论】:

  • 我不清楚你想达到什么目的
  • sn-p 或小提琴会有所帮助
  • @Claudiu 重点是我可以使用键盘来浏览每个链接。如果我通过父链接选项卡。因此,例如,我将使用选项卡并到达“父链接 1”,此时我将看到“自定义主菜单子导航下拉菜单”并能够通过它们进行选项卡。然后,一旦我到达终点,我将继续“父链接 2”,“父链接 1”下拉菜单将隐藏。然后,我将继续浏览“父链接 2”下的每个链接。希望有帮助!小提琴jsfiddle.net/hectooorr/gsgskpgy

标签: javascript jquery drop-down-menu


【解决方案1】:

我不确定您期望的结果和对此结果的需求,但希望这会对您有所帮助。

由于命名约定和方法,我不得不重做您的示例,但我认为这就是您想要的...

这是一个演示,以防万一…… JSFiddle

HTML

<ul class="navbar">
    <li class="navbar-item">
        <a href="javascript:;">Parent Link</a>

        <ul class="navbar-sub">
            <li class="navbar-sub-item">
                <a href="#url_redirect">One</a>
            </li>

            <li class="navbar-sub-item">
                <a href="#url_redirect">Two</a>
            </li>

            <li class="navbar-sub-item">
                <a href="#url_redirect">Three</a>
            </li>
        </ul>
    </li>

    <li class="navbar-item">
        <a href="javascript:;">Parent Link</a>

        <ul class="navbar-sub">
            <li class="navbar-sub-item">
                <a href="#url_redirect">One</a>
            </li>

            <li class="navbar-sub-item">
                <a href="#url_redirect">Two</a>
            </li>

            <li class="navbar-sub-item">
                <a href="#url_redirect">Three</a>
            </li>
        </ul>
    </li>

    <li class="navbar-item">
        <a href="javascript:;">Parent Link</a>

        <ul class="navbar-sub">
            <li class="navbar-sub-item">
                <a href="#url_redirect">One</a>
            </li>

            <li class="navbar-sub-item">
                <a href="#url_redirect">Two</a>
            </li>

            <li class="navbar-sub-item">
                <a href="#url_redirect">Three</a>
            </li>
        </ul>
    </li>

    <li class="navbar-item">
        <a href="javascript:;">Parent Link</a>

        <ul class="navbar-sub">
            <li class="navbar-sub-item">
                <a href="#url_redirect">One</a>
            </li>

            <li class="navbar-sub-item">
                <a href="#url_redirect">Two</a>
            </li>

            <li class="navbar-sub-item">
                <a href="#url_redirect">Three</a>
            </li>
        </ul>
    </li>
</ul>

CSS

body {
    margin: 10px;
}

.navbar,
.navbar .navbar-sub {
    list-style: none;
    margin: 0;
    padding: 0;
}

.navbar > .navbar-item {
    float: left;
}

.navbar > .navbar-item:last-child {
    margin-right: 0;
}

.navbar > .navbar-item.active > .navbar-sub {
    display: block;
}

.navbar > .navbar-item a {
    text-decoration: none;
}

.navbar > .navbar-item > a {
    background-color: #999;
    padding: 10px 20px;
    color: #696969;
    display: block;
}

.navbar > .navbar-item > a:hover,
.navbar > .navbar-item > a:focus,
.navbar > .navbar-item.active > a {
    background-color: #ccc;
}

.navbar .navbar-sub {
    display: none;
}

.navbar .navbar-sub > .navbar-sub-item > a {
    color: #ccc;
    display: block;
    padding: 5px 10px;
    text-align: center;
    background-color: #696969;
}

.navbar .navbar-item.active .navbar-sub-item > a:hover,
.navbar .navbar-item.active .navbar-sub-item > a:focus {
    background-color: #999;
}

jQuery

$('.navbar').on('mouseenter focusin', '.navbar-item > a', function () {
    $(this)
        .parent('.navbar-item')
        .addClass('active')
        .siblings('.navbar-item')
        .removeClass('active')
});

【讨论】:

    【解决方案2】:

    给你,简单的 jquery :)

    // display drop down box when mouse is over
    $(".custom-MainMenu-TopNav-li a").mouseover(function(){
      $(this).find(".custom-MainMenu-SubNav-dropdown").css("display", "block");
    });
    
    // hide drop down box when mouse leaves
    $(".custom-MainMenu-TopNav-li a").mouseleave(function(){
      $(this).find(".custom-MainMenu-SubNav-dropdown").css("display", "none");
    });

    这基本上会在鼠标悬停/离开父 div 时显示/隐藏每个下拉菜单。

    我认为在焦点上显示下拉菜单不是一个好主意,因为我相信您只能关注某些元素,例如输入。

    希望这会有所帮助!

    【讨论】:

    • 我需要集中精力来维护仅使用键盘的用户可以访问的菜单
    猜你喜欢
    • 2015-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多