无障碍开发实践之多级菜单实现

在前端开发中,无障碍设计是必不可少的一项工作。随着越来越多的人习惯使用屏幕阅读器,多级菜单的实现也需要考虑无障碍方案以保证屏幕阅读器的正常使用。

为什么要考虑屏幕阅读器的使用?

屏幕阅读器是一种辅助技术,是为了让视力障碍人群能够访问 Web 站点而设计的。该设备是一种将 Web 内容转换为语音,文本或 Braille 等其他可理解的形式的软件或硬件。

当我们使用屏幕阅读器时,它可以根据 HTML 元素的语义化结构对 Web 站点进行有声或无声阅读,以达到用户可使用的效果。因此,无论你的站点面向什么人群,都应该考虑无障碍开发,尊重每一个用户的需求。

多级菜单的无障碍实现

多级菜单实现需要围绕着语义化和键盘可访问性展开,因为在使用屏幕阅读器时,很少使用鼠标进行导航。以下是一个示例多级菜单的 HTML 结构:

---- ------------------
  ----
    ----
      -- -------------- -----
      ----
        ------ -------------- ----------
        ------ -------------- ----------
      -----
    -----
    ----
      -- -------------- -----
      ----
        ------ -------------- ----------
        ------ -------------- ----------
        ------ -------------- ----------
      -----
    -----
  -----
------

在这个例子中,我们使用<nav>元素来定义导航,<ul><li>元素用于定义列表和列表项。在菜单项中,我们将链接包装在<a>元素中。如果菜单项有下级菜单,我们可以使用嵌套的<ul><li>元素包含它。

由于这个 HTML 标记语言本身支持无障碍,对于多级菜单的实现,我们需要遵循以下注意事项:

语义化结构

语义化的 HTML 在实现无障碍设计时起着关键作用。使用正确的元素和属性,可以让屏幕阅读器正确地转换为可以理解的内容。例如,使用 <nav> 元素来表示导航栏,使用 role="navigation"属性来进一步指定其用途。

标题与描述

对于较大的 Web 站点,分层式结构和导航菜单可能非常复杂。在这种情况下,代码要求额外的辅助尽可能汇总和记录内容。所以,我们需要提供明确的标题和描述,帮助屏幕阅读器正确识别我们所欲表达的内容。比如,对于每一个二级菜单,我们都需要在<a>元素中创建一个对应的title属性,来帮助用户理解该菜单项的内容。

键盘可访问性

在使用屏幕阅读器时,很少使用鼠标,因此我们需要通过键盘访问菜单项。在多级菜单实现中,常常需要使用箭头或 Tab 键来导航。在菜单中可以通过 js 实现键盘事件,以支持该功能。

修复方案

当屏幕阅读器失效时,多级菜单的访问和导航面临无法使用的情况。在这种情况下,我们可以通过以下方法尝试修复多级菜单的实现:

创建备用菜单

我们可以创建备用菜单,以备屏幕阅读器无法使用时使用。这种方法适用于只需要进行简单导航的站点。对于更复杂的站点,需要更详细的访问方式,因此我们应该根据不同的用户、浏览器和设备类型注册多个备用菜单。

提供文本提示

在无法使用屏幕阅读器的情况下,我们可以为每个菜单项提供一个文本提示。这种方法通常是在无法使用鼠标时使用,可能会有一些不便,但仍然要考虑某些情况下的用户需求。

CSS 动画特效

CSS 动画特效通常可实现用鼠标和键盘导航菜单。这种方法通常适用于需要复杂导航的站点,如商店和购物网站。

示例代码

为演示多级菜单实现的无障碍问题和解决方案,我们为您提供以下示例代码:

-----
  --- ------------------- -------------
    --- ---------------- -------------------------------
      -- -------------- -----
      --- -----------------
        ------ -------------- ----------
        ------ -------------- ----------
      -----
    -----
    --- ---------------- -------------------------------
      -- -------------- -----
      --- -----------------
        ------ -------------- ----------
        ------ -------------- ----------
        ------ -------------- ----------
      -----
    -----
  -----
------

--------
  ----- ---- - ------------------------------------------
  ----- --------- - -------------------------------------------------- - ----
  ----- -------- - ---------------------------------------

  -- --------------------------------------
  -------------------------- ---------- ------ -
    ----- ------- - ----------------
    ----- ------------ - --------------- - ---

    -------------------------------------- ------

    -- --------- -
      ----- -- - ----------------- - ----
      -------------------------------------- ----
      -------------------------- ----
      ------------------------------------- ---------
      -------------------------------- ----
    -
  ---

  -- ------------
  -------- -------------------- -
    ----- -------- - --------------------
    ----- ------- - ----------------------------

    -- --------- -
      -----------------------

      -- -
        ------------------------------------- --- ------- --
        --------------------- --- ------
      - -
        ------------------------------------- --------
        --------------------- - --------
      - ---- -
        ------------------------------------- ---------
        --------------------- - -------
      -
    -
  -

  -- --------------------
  ------------------------- --------- -
    ----- ------------ - ------------------------------
    ----- ---------------- - ----------------
    ----- --------------- - -------------------------------- - ---

    -- ----- --------------
    -------------------------------------------- -------- ------- -
      -- ----------- --- ----- -- ---------------- -
        -----------------------
        ---------------------
      -
    ---

    ------------------------------------------- -------- ------- -
      -- ----------- --- ----- -- --------------- -
        -----------------------
        ---------------------
      -
    ---

    -- -------------
    ----------------------------- ------------- -
      --------------------------------------- -------- ------- -
        -- ----------- --- ------------ -
          -----------------------

          -- -------------------------------- -
            ---------------------------------------
          - ---- -
            -------------------------
          -
        -

        -- ----------- --- ---------- -
          -----------------------

          -- ------------------------------------ -
            -------------------------------------------
          - ---- -
            ------------------------
          -
        -

        -- ----------- --- ------- -- ---------- --- -------- -
          ---------------------
        -
      ---

      ------------------------------------- ---------------
    ---
  ---
---------

在该示例代码中,我们首先通过 JavaScript 获取到了 HTML 的相关元素,然后为每个菜单项添加计数器和“aria”属性,其中包括:

  • aria-haspopup:指示该元素所关联的控件是否具有嵌套的下拉菜单;
  • aria-controls:指示该元素所关联的控件的 ID;
  • aria-expanded: 指示该元素所关联控件是否已展开,并相应地设置用于相应控件的属性值,如 "true" 或 "false";
  • tabIndex: 指示元素是否可获取焦点,设置为 -1 表示无法获取。

接下来,我们注册了展开和关闭子菜单事件,基于键盘事件实现了使用 Tab 和方向键来导航菜单的功能,注册了鼠标事件,以选择菜单并展开或关闭下级菜单。

最后,记得在菜单的根元素上添加role=”navigation“属性以表示其导航栏角色。

总结

在本文中,我们讨论了多级菜单实现中的无障碍问题和解决方案。语义化和键盘可访问性是无障碍设计的关键,因此在实现多级菜单时,我们需要遵循这些最佳实践。我们为您提供了示例代码,以帮助您了解如何为无障碍特性编写网站。如果你有任何问题,请在评论区分享你的想法和建议。

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/64f9d521f6b2d6eab31329ba


猜你喜欢

  • 创建和部署 RESTful API 的最佳实践

    RESTful API 是现代 Web 应用程序中非常重要的一部分,它们使得客户端可以与服务器进行交互。RESTful API 具有灵活性和可扩展性,因此它们对于前端开发人员非常重要。

    1 年前
  • Deno 如何使用 Redis 进行缓存操作

    在前端开发中,经常需要进行数据的缓存和管理。而 Redis 是一款高性能、多模型数据存储系统,被广泛应用于缓存、队列、计数器等。本文将介绍如何使用 Deno 进行 Redis 缓存操作,并提供示例代码...

    1 年前
  • 在 babel 编译时如何快速缓存已经处理过的文件?

    在前端开发中,使用 babel 进行代码转换以支持 ES6+ 语法已经成为非常普遍的做法。然而,随着项目规模的增大,babel 编译时间也逐渐变长,这对开发效率产生了不小的影响。

    1 年前
  • SASS 中常见的问题及解决方式

    SASS 是一种基于 CSS 的预处理器,它使得编写高效的、易于维护的 CSS 变得更加简单。然而,在实践过程中,我们可能会遇到一些问题。本篇文章将介绍 SASS 中常见的问题及相应的解决方式,希望能...

    1 年前
  • 在设计中考虑无障碍性:如何为您的 UI/UX 添加适应

    在过去,设计师通常只关注UI/UX的外观和功能。然而,现今世界变得越来越注重无障碍性问题,设计师们需要更加注意UI/UX的普适性问题以确保应用程序可以被任何人使用,无论他们是否患有身体或认知障碍。

    1 年前
  • 使用 RxJS 简化异步回调嵌套

    在 Web 前端开发中,处理异步请求是必不可少的。而处理异步请求最常见的方法就是使用回调函数。但是在嵌套多层回调函数的情况下,会造成代码难以维护和阅读的情况。而 RxJS 可以解决这个问题。

    1 年前
  • JavaScript ES9:异步迭代器

    JavaScript ES9:异步迭代器 JavaScript ES9 异步迭代器是 ES6 迭代器和 ES7 异步迭代器的结合,它可以帮助我们在执行异步任务的过程中进行迭代。

    1 年前
  • Next.js 中如何配置 Less 预处理器

    1. 什么是 Less 预处理器 在介绍如何在 Next.js 中配置 Less 预处理器之前,我们需要先了解 Less 。 Less 是一种 CSS 预处理器,它扩展了 CSS 语言,增加了变量、函...

    1 年前
  • 学习 Custom Elements 技术需要注意的陷阱和错误

    什么是 Custom Elements Custom Elements 是 Web Components 中的重要技术之一,它允许开发者创建自定义的 HTML 元素,从而可以使开发者可以更加自由、灵活...

    1 年前
  • 初学者指南:何时使用 Headless CMS

    随着互联网技术的迅猛发展和人们对移动互联网的需求,越来越多的企业或个人开始构建自己的网站、APP或其他互联网产品。而随之而来的是对内容管理的迫切需求。传统的 CMS 系统在某些场景下已经不能满足需求,...

    1 年前
  • 如何使用 Chai 和 Sinon 在 NodeJS 项目中对 REST API 进行测试

    NodeJS 作为一种流行的服务器端运行环境,其广泛的应用与快速增长的社区开发了许多有用的工具和库。测试是项目开发过程中必不可少的一步,它可以帮助我们发现和修复潜在的错误、提高代码的质量和可靠性。

    1 年前
  • 在 ECMAScript 2017 (ES8) 中使用 BigInt

    简介 在 Javascript 中,Number 类型只能精确地表示最大值为 2^53-1 的数字,而在现实中,有时会遇到需要处理更大的整数的情况。ES8 新增了 BigInt 类型,支持任意大的整数...

    1 年前
  • Vue.js 中的拖放上传图片实现

    作为前端开发者,时常需要实现拖动上传的功能。今天我们来学习如何在 Vue.js 中实现这个功能,让用户拖动图片上传到网站。 准备工作 在开始之前,需要提前安装 Vue.js 和 axios。

    1 年前
  • 解决 Socket.io 多次连接导致内存泄漏的方法

    在使用 Socket.io 进行多次连接时,会发现随着连接数量的增加,内存占用也会随之增加。这是因为每个连接都会创建一个新的 Socket 实例,而这些实例并不会被及时清理,从而导致内存泄漏。

    1 年前
  • Kubernetes 中容器的启动顺序

    在 Kubernetes 中,我们常常需要在一个 Pod 中运行多个容器,这些容器之间可能有启动顺序的需求。那么,在 Kubernetes 中,如何保证容器的启动顺序呢? 容器的启动顺序 Kubern...

    1 年前
  • Enzyme 如何测试 React 组件中的动画效果

    Enzyme 如何测试 React 组件中的动画效果 React 是一个非常流行的前端框架,它使得构建交互式的 Web 应用程序更加容易和高效。随着对动画的需求不断增长,React 组件中的动画也日益...

    1 年前
  • MongoDB 数据库索引实践总结

    前言 MongoDB 是一款流行的 NoSQL 数据库,在处理非结构化数据和大数据量方面具有很多优势。在使用 MongoDB 进行数据存储时,索引是一个非常重要的概念。

    1 年前
  • PWA 缓存是否长期有效的解决方案

    前言 在前端开发中,提高 Web 应用程序的性能是一个重要的议题。让你的 Web 应用程序更快、更接近原生应用体验是前端开发者常常思考的问题,而 PWA 的出现正是一个很好的解决方案。

    1 年前
  • Node.js 实例:如何构建视频流应用程序

    视频流应用程序在现今的互联网娱乐领域中变得越来越流行。在这样的应用程序中,通过网络传输实时视频数据,并在客户端进行播放,使用户可以即时观看视频内容。在这篇文章中,我们将使用 Node.js 来构建一个...

    1 年前
  • 如何解决 CSS Reset 对表单元素宽度的影响?

    什么是 CSS Reset? 在我们开始讲解如何解决 CSS Reset 对表单元素宽度的影响之前,首先需要了解什么是 CSS Reset。 CSS Reset 是一种常见的 CSS 技术,目的是在网...

    1 年前

相关推荐

    暂无文章