增强网络可访问性:在模态和菜单中锁定选项卡按钮
#javascript #网络开发人员 #教程 #a11y

这是您网站上使用的非常重要的可访问性功能。

您可能不知道这一点,但是许多用户使用键盘导航。其中一些患有运动障碍,有些可能会因为偏好或效率而使用键盘进行导航。

重点是您的网站必须仅使用键盘就可以访问。

首先,我希望您已经知道您应该在关注焦点时突出显示网站上的所有聚焦元素(例如链接和按钮)。至少当它们通过键盘选项卡按钮将它们聚焦时。

在CSS中,有一个非常有用的伪级,称为:focus-visible。简而言之,当它通过选项卡按钮焦点时,它适用于元素。您可以在MDN Web Docs上阅读有关它的更多信息。

,但让我们回到案件中。

因此,您有一个带有全屏菜单的网站或其他部分可以打开全屏尺寸的网站。这样的东西:


一个带有全屏菜单的网站

然后,用户使用键盘导航(选项卡按钮)到达该部分,并点击“ Enter”按钮:

用户到达本节中的最后一个链接后应该会发生什么?

不幸的是,当用户继续导航到下一个链接 外部 时,这是一个非常常见的情况。

因此,用户在您的网站上完全迷失了方向。他们不再看到重点链接(因为它们隐藏在全屏部分下方),但是他们一直在页面上导航。

应该 工作的一个很好的例子是the Fancybox JS plugin。转到其examples section,单击任何图片,然后仅使用键盘浏览打开的模式。您将不在那种模态之前。


锁定选项卡中的fancybox

那么解决方案是什么?

当打开全屏部分时,用户应该只能通过键盘在该部分内导航。

这就是我们期望得到的:

为了实现这一目标,让S编写一些JavaScript代码以将选项卡锁定在全屏菜单中:

// Get the menu button element
const menuBtn = document.querySelector(".menu-btn");

// Get the close menu button element
const closeMenuBtn = document.querySelector(".close-btn");

// Get the fullscreen menu element
const fullscreenMenu = document.getElementById("fullscreenMenu");

// Function to toggle the menu
function toggleMenu() {
  fullscreenMenu.classList.toggle("active");
  menuBtn.classList.toggle("active");
}

// Add event listener to the menu button for the 'click' event
menuBtn.addEventListener("click", toggleMenu);
closeMenuBtn.addEventListener("click", toggleMenu);

// Add event listener to the 'keydown' event on the document
document.addEventListener("keydown", function (e) {
  const target = e.target;
  const shiftPressed = e.shiftKey;

  // If TAB key pressed
  if (e.keyCode === 9) {
    // If inside a fullscreen menu (determined by attribute role="dialog")
    if (target.closest('[role="dialog"]')) {
      // Find the first or the last input element in the dialog parent (depending on whether Shift was pressed).
      // Get the focusable elements (links and buttons)
      let focusElements = target
        .closest('[role="dialog"]')
        .querySelectorAll("a[href], button");
      let borderElem = shiftPressed
        ? focusElements[0]
        : focusElements[focusElements.length - 1];

      if (borderElem) {
        // If the current target element is the first or last focusable element in the dialog, prevent the default behaviour.
        if (target === borderElem) {
          e.preventDefault();

          // move focus to the first element when the last one is reached and vice versa
          borderElem === focusElements[0]
            ? focusElements[focusElements.length - 1].focus()
            : focusElements[0].focus();
        }
      }
    }
  }
});

这是演示:

因此,我们可以防止元素在打开时将全屏菜单或模态弹出窗口聚焦。


检查我有关Web优化的其他文章:


如果您觉得这篇文章有所帮助 - 不愿意喜欢,订阅和留下您的想法。


Read more posts on my Medium blog


感谢您的阅读!

保持安全,和平与您同在!