2017-01-25 50 views
1

我看到了一些解决方案,但我无法弄清楚如何将这些解决方案放在我的代码中,或者某些解决方案使用了某些我无法在我的项目中使用的解决方案。我怎样才能使CSS下拉菜单可以访问键盘导航?

让我们进入正题:

我需要为键盘导航已经存在的CSS下拉菜单访问。我用[Tab]打开下拉菜单取得了一些进展,但我无法导航到里面的选项。

这里是我的代码:

.menu .options-menu-dropdown{ 
 
     display: inline-block; 
 
     font-family: 'OpenSans Bold'; 
 
     font-size: 16px; 
 
     color: #646464;   
 
     text-decoration: none; 
 
     cursor: pointer; 
 
     position: relative; 
 
    } 
 
    .menu .menu-dropdown{ 
 
     z-index: -1; 
 
     visibility: hidden; 
 
     opacity: 0; 
 
     position: absolute; 
 
     top: 0; 
 
     right: 0; 
 
     min-width: 180px; 
 
     text-align: right; 
 
     overflow: hidden; 
 
     margin-top: -6px; 
 
     margin-right: -6px; 
 

 
     -webkit-transition: all 200ms ease-in-out; 
 
     -moz-transition: all 200ms ease-in-out; 
 
     -ms-transition: all 200ms ease-in-out; 
 
     -o-transition: all 200ms ease-in-out; 
 
     transition: all 200ms ease-in-out;  
 
    } 
 
.menu .options-menu-dropdown:focus .menu-dropdown, 
 
    .menu .options-menu-dropdown:hover .menu-dropdown{ 
 
     z-index: 100; 
 
     visibility: visible; 
 
     opacity: 1; 
 
    } 
 
    .menu .title-dropdown{ 
 
     background-color: #005e8b; 
 
     font-size: 16px; 
 
     padding: 8px 6px; 
 
     white-space: nowrap; 
 
     border-bottom: 1px solid #b4b4b4; 
 
     color: #FFF; 
 
    } 
 
    .menu .menu-dropdown-item{ 
 
     display: block; 
 
     background-color: white;   
 
     padding: 12px 32px 12px 12px; 
 
     text-decoration: none; 
 
     cursor: pointer; 
 
     font-size: 16px; 
 
     color: #323232; 
 
     -webkit-transition: all 200ms ease-in-out; 
 
     -moz-transition: all 200ms ease-in-out; 
 
     -ms-transition: all 200ms ease-in-out; 
 
     -o-transition: all 200ms ease-in-out; 
 
     transition: all 200ms ease-in-out; 
 
     border-top: #b4b4b4 1px solid; 
 
     border-left: #b4b4b4 1px solid; 
 
     border-right: #b4b4b4 1px solid; 
 
    } 
 
    .menu .menu-dropdown-item:last-child{ 
 
     border-bottom: #b4b4b4 1px solid; 
 
    } 
 
    .menu .menu-dropdown-item:focus, 
 
    .menu .menu-dropdown-item:hover{ 
 
     background-color: #b4b4b4; 
 
     color: #fff; 
 
    }
<div class="menu" align="center" > 
 
    <div class="options-menu-dropdown" tabindex="0"> 
 
    <div>Test Menu</div> 
 
    <div class="menu-dropdown"> 
 
     <div class="title-dropdown">Opened Test Menu</div> 
 
     <a href="#" class="menu-dropdown-item" tabindex="1">Menu Item 1</a> 
 
     <a href="#" class="menu-dropdown-item" tabindex="1">Menu Item 2</a> 
 
     <a href="#" class="menu-dropdown-item" tabindex="1">Menu Item 3</a> 
 
    </div> 
 
    </div> 
 
</div>

代码http://codepen.io/WillCodebit/pen/XpaqqJ

注:我试图避免任何JavaScript的解决方案,因为在这个项目中我需要使用GWT对于任何JavaScript,这是一种我无法违反的模式。

在此先感谢。

编辑 此菜单应该具有与Google的帐户菜单类似的行为。内部的选项也必须通过键盘访问。

Menu example

+0

你可以通过查看启动在[W3C WAI-ARIA授权实践](https://www.w3.org/TR/wai-aria-practices/#kbd_general_between)草案中。这将为您提供有趣的阅读,并帮助您指导您制定合理的解决方案。 –

+0

很好用,就是把你的源码放在这里。链接源可以稍后消失。所以这对于具有相同请求的其他人无用。 –

+0

你也应该避免使用'tabindex' - 从我上面发布的链接: _tabindex =“X”其中X是1 <= X <= 32767的整数 强烈建议作者不要使用这些值。该元素根据tabindex的值放入选项卡序列中。 tabindex值为0的元素和默认可聚焦的元素将在tabindex值为1或更大的元素之后的序列中._ –

回答

0

感谢香Youg谁试图帮助。

我找到了一个解决方案,但我不得不放一些Javascript来使它工作。

HTML:

<div class="my-menu"> 
    <a id="menuUser" href="javascript:showHideMenu()" class=""> 
    <div> 
     Test 
    </div> 
    </a> 
    <ul id="menuUserDropdown" class="menu-dropdown"> 
    <li> 
     <a href="#" class="menu-dropdown-item"> 
     Option 1 
     </a> 
    </li> 
    <li> 
     <a href="#" class="menu-dropdown-item"> 
     Option 2 
     </a> 
    </li> 
    <li> 
     <a href="#" class="menu-dropdown-item"> 
     Option 3 
     </a> 
    </li> 
    </ul> 
</div> 

CSS:

.my-menu a{ 
    display: inline-block; 
    font-family: 'OpenSans Bold'; 
    font-size: 16px; 
    color: #646464; 
    text-decoration: none; 
    cursor: pointer; 
    position: relative; 
} 
.my-menu a div{ 
    padding: 4px 5px 4px 0; 
} 
.my-menu a.opened div, 
.my-menu a:hover div{ 
    background-color: #c9252b; 
    color: #fff; 
} 
.my-menu .menu-dropdown.opened{ 
    display: block; 
} 
.my-menu div{ 
    display: inline-block; 
    vertical-align: middle; 
} 
.my-menu .menu-dropdown{ 
    display: none; 
    margin: 0; 
    position: absolute; 
    z-index: 30; 
    background-color: #FFF; 
    list-style: none; 
    padding: 0; 
    border: 1px solid #b4b4b4; 
} 
.my-menu .menu-dropdown-item{ 
    display: block; 
    background-color: white; 
    padding: 12px; 
    text-decoration: none; 
    width: 162px; 
    cursor: pointer; 
    font-size: 16px; 
    color: #323232; 
} 
.my-menu .menu-dropdown-item:focus, 
.my-menu .menu-dropdown-item:hover{ 
    background-color: #b4b4b4; 
    color: #fff; 
} 

的Javascript,好,我与GWT做,但逻辑很简单:

/* Just add or remove the class "opened" from "menuUser" and "menuUserDropdown". 
    You can put a "blur()" and "mouseLeave()" functions 
    to close the menu when the user moves away the cursor or 
    move the focus out of the menu too. */ 
0

From Heydon Pickering - Practical ARIA examples

<nav role="navigation" aria-label="example with dropdowns"> 
<ul class="with-dropdowns"> 
    <li><a href="#">Home</a></li> 
    <li> 
     <a href="/about" aria-haspopup="true">About</a> 
     <ul aria-hidden="true" aria-label="submenu"> 
      <li><a href="/about/#who-we-are">Who we are</a></li> 
      <li><a href="/about/#what-we-do">What we do</a></li> 
      <li><a href="/about/#why">Why</a></li> 
     </ul> 
    </li> 
    <li><a href="#">Blog</a></li> 
    <li><a href="#">Contact</a></li> 
</ul> 

+0

感谢您的回答。在这个例子中,我试图用键盘导航,下拉菜单中的itens不能通过键盘访问,在我的情况下,itens内部必须可以通过键盘访问。 – Will

+0

不可访问或仅仅不可视显示?此代码默认情况下是键盘友好的。但是,CSS必须使用适当的'hover' *和*'focus'样式来支持它。 – aardrian

+0

@我想你可能会将_accessibility_和_functionality_混淆。 –