【问题标题】:HTML/CSS :Focus Selector and Tab Key Not Working in Firefox / Windows 7HTML/CSS:焦点选择器和 Tab 键在 Firefox / Windows 7 中不起作用
【发布时间】:2016-09-20 00:15:28
【问题描述】:

我正在尝试创建一个仅包含 HTML 和 CSS 的下拉菜单,该菜单最初是隐藏的,然后在用户将鼠标悬停在链接上或标签上后出现在屏幕上。

悬停方面工作正常,但我似乎无法让我的菜单仅使用键盘或 Tab 键正常工作。

这里是sn-p:

#menu {display: none;}

a:focus + #menu {display: block;}
<a href="#menu">Drop Down Menu</a>


<div id="menu">
<ul>
<li><a href="#">Test Link 1</a></li>
<li><a href="#">Test Link 2</a></li>
<li><a href="#">Test Link 3</a></li>
<li><a href="#">Test Link 4</a></li>
</ul>
</div>

点击“下拉菜单”链接确实会显示隐藏的链接,但是一旦子链接出现在屏幕上,我就无法点击它们。我尝试将 tabindex="0" 属性添加到所有 div、ul 和 li 元素,但似乎也没有解决问题。

我是网页设计的新手,也许我遗漏了一些东西。任何建议将不胜感激。

【问题讨论】:

    标签: html css firefox focus


    【解决方案1】:

    我相信您遇到了问题,因为当您 display: none 一个元素时,它实际上从用户的角度将其从页面中删除,并且 DOM 仍然记住这些元素不是页面的一部分,即使在您之后动态添加它们。此外,有些人会说使用 display: none 这样会对可访问性产生负面影响: https://css-tricks.com/places-its-tempting-to-use-display-none-but-dont/

    以下是一些 JavaScript,可通过特定代码为您提供所需的效果:

    <style>
    
    .hide {
       position: absolute !important;
       top: -9999px !important;
       left: -9999px !important;
    }
    
    </style>
    
    <a href="#menu">Drop Down Menu</a>
    
    
    <div id="menu">
      <ul>
        <li><a href="#">Test Link 1</a></li>
        <li><a href="#">Test Link 2</a></li>
        <li><a href="#">Test Link 3</a></li>
        <li><a href="#">Test Link 4</a></li>
      </ul>
    </div>
    
    <script>
      (function() {
        var menu = document.getElementById('menu');
    
        //convert list of a elements into an array
        var anchor = Array.prototype.slice.call(document.getElementsByTagName('a'));
    
        menu.classList.add('hide');
    
        //loop through a elements, removing hide class from #menu on focus
        anchor.forEach(function(c) {
          c.addEventListener('focus', function() {
            menu.classList.remove('hide');
          });
          c.addEventListener('blur', function() {
            menu.classList.add('hide');
          });
        });
      })();
    </script>
    

    【讨论】:

    • 感谢您的回答。我这样做的全部原因是专门为了用户可访问性,所以我想尽可能远离 JavaScript,以获得基本功能。在我发布并遇到提到 DOM 不包括显示的信息后,我一直在谷歌搜索:页面加载时没有元素。但是,我能够在 IE8 中通过 display: none、:focus 和 tabindex 获得 tab 键访问。所以我不确定 IE 如何或为什么允许在页面加载后将最初隐藏的元素添加到标签中,而 Firefox 则不允许。
    • 没问题。好吧,如果没有 JavaScript,菜单将永远不会被隐藏,从而使屏幕阅读器等可以访问。性能会受到影响,但在这种情况下没有任何实质性的影响可以产生影响,但我同意,如果可以使用 CSS 来完成,那就是要走的路。如果您找到 CSS 解决方案,请告诉我!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多