”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 构建可访问的 React 应用程序

构建可访问的 React 应用程序

发布于2024-11-04
浏览:410

Building Accessible React Applications

在当今的数字环境中,可访问性不仅仅是一个流行词,而且是必需品。构建可访问的 Web 应用程序可确保所有用户(包括残障人士)都可以有效地与您的内容进行交互。 React 是用于构建用户界面的最流行的 JavaScript 库之一,它提供了多种工具和最佳实践来帮助开发人员创建可访问的应用程序。本文探讨了构建可访问的 React 应用程序的关键策略和技术。

1. 了解网络可访问性

网络可访问性是指设计和开发可供各种残障人士(包括视觉、听觉、运动和认知障碍)使用的网站和应用程序。 Web 内容可访问性指南 (WCAG) 提供了一组开发人员应遵循的标准,以确保所有用户都可以访问其内容。

2. 使用语义 HTML

任何可访问的 Web 应用程序的基础都是语义 HTML。

在 React 中,您应该始终努力使用语义元素而不是通用的

和标签。例如,用于可点击操作而不是与 onClick 事件一起使用。
return 
    
Click me
{/* More accessible */} >

3.正确管理注意力

正确的焦点管理对于键盘导航和屏幕阅读器用户至关重要。 React 提供了多种管理焦点的方法,例如 autoFocus 属性和用于手动设置焦点的 useRef 钩子。

import { useRef, useEffect } from 'react';

function AccessibleForm() {
  const inputRef = useRef(null);

  useEffect(() => {
    inputRef.current.focus(); // Set focus when component mounts
  }, []);

  return ;
}

确保在导航期间将焦点移动到适当的元素,尤其是在实现模式对话框、动态内容或路线更改时。

4. 使用 ARIA 属性

ARIA(可访问的富互联网应用程序)属性可以增强非语义 HTML 元素的可访问性。 React 支持所有 ARIA 属性,允许您在不改变视觉设计的情况下提高可访问性。

例如,使用 role="alert" 向屏幕阅读器宣布重要消息,或使用 aria-live="polite" 更新实时区域。

function Alert({ message }) {
  return 
{message}
; }

但是,ARIA 不应该用作语义 HTML 的替代品。它最适合填补原生元素无法提供必要的辅助功​​能的空白。

5. 无障碍表格

表单是 Web 应用程序的关键部分,使它们易于访问至关重要。确保每个表单控件都有相应的标签。标签元素应使用 htmlFor 属性与其控件显式关联,或者您可以将控件嵌套在标签内。



使用 aria-scribedby 获取与表单控件相关的附加上下文或说明。


We'll never share your email.

6. 处理动态内容

React 应用程序通常涉及动态内容更新。确保所有用户都可以访问这些更新非常重要。使用 aria-live 区域来宣布不会自动聚焦的更改,例如加载指示器或通知区域的更新。

{isLoading ? 'Loading...' : 'Content loaded'}

对于更复杂的状态管理,请考虑与 Redux 或 Context API 等工具集成,以有效地管理和传达状态更改。

7. 辅助功能测试

测试是确保可访问性的重要组成部分。使用 axe-core、Lighthouse 或 React 测试库等工具来自动进行可访问性检查。这些工具可以识别常见的可访问性问题,例如标签丢失、颜色对比度问题和 ARIA 使用不当。

此外,使用键盘导航和屏幕阅读器(例如 NVDA、JAWS 或 VoiceOver)手动测试您的应用程序。这可以帮助您发现自动化工具可能遗漏的问题。

8.色彩对比与视觉设计

确保您的配色方案符合 WCAG 颜色对比度标准。使用颜色对比度检查器或无障碍颜色等工具来验证您的文本在背景下是否可读。

在React中,您可以通过实现CSS变量或使用像styled-components这样的库来动态调整颜色对比度。

const Button = styled.button`
  background-color: var(--primary-color);
  color: var(--text-color);
  &:hover {
    background-color: var(--primary-hover);
  }
`;

9. 无障碍路由

当使用React Router或其他路由库时,确保当路由改变时焦点得到适当的管理。这可以通过在导航事件后将焦点设置到主要内容区域来实现。

import { useEffect } from 'react';
import { useLocation } from 'react-router-dom';

function useFocusOnRouteChange() {
  const location = useLocation();

  useEffect(() => {
    document.getElementById('main-content').focus();
  }, [location]);
}

这可确保屏幕阅读器用户了解上下文更改,并可以轻松导航新内容。

10. 文档和协作

最后,构建可访问的应用程序需要团队的努力。确保所有团队成员,包括设计师、开发人员和 QA 测试人员,都了解可访问性最佳实践。记录您的可访问性标准并将其包含在代码审查中以确保持续合规性。

如何测试 React 可访问性

在检查和测试 React 应用程序中的可访问性时,可以使用推荐的工具。

  • 在文本编辑器中,您可以安装 eslint-plugin-jsx-a11y 等 linter,以在编写 React 应用程序的 JSX 组件时捕获任何可访问性问题。
  • 在开发后期,浏览器中的开发人员控制台与 WAVE Web 可访问性评估工具或 ax DevTools 项目相结合可以帮助诊断和修复任何问题。
  • 您还可以使用屏幕阅读器(例如 NVDA 和 JAWS 屏幕阅读器)分阶段手动测试您的应用程序。

注意:本质上,通过使用 linter 尽早发现可访问性问题,并使用浏览器中的开发控制台和 ax DevTools 验证已修复的可访问性问题,以实现更快、更高效的调试过程。

结论

构建可访问的 React 应用程序需要仔细考虑代码和设计。通过遵循这些最佳实践(使用语义 HTML、管理焦点、利用 ARIA 属性以及彻底测试),您可以创建可供每个人使用的应用程序。请记住,可访问性不仅仅是一个功能,而且是 Web 开发的一个基本方面,可以使所有用户受益。

将可访问性作为优先事项不仅可以改善用户体验,还可以将应用程序的覆盖范围扩展到更广泛的受众。从小事做起,实施这些策略,并不断完善 React 中的可访问性方法。

参考:

  1. React 的辅助功能
  2. MDN 文档
版本声明 本文转载于:https://dev.to/manjushsh/building-accessible-react-applications-3obm?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 为什么在我的Linux服务器上安装Archive_Zip后,我找不到“ class \” class \'ziparchive \'错误?
    为什么在我的Linux服务器上安装Archive_Zip后,我找不到“ class \” class \'ziparchive \'错误?
    Class 'ZipArchive' Not Found Error While Installing Archive_Zip on Linux ServerSymptom:When attempting to run a script that utilizes the ZipAr...
    编程 发布于2025-04-07
  • 版本5.6.5之前,使用current_timestamp与时间戳列的current_timestamp与时间戳列有什么限制?
    版本5.6.5之前,使用current_timestamp与时间戳列的current_timestamp与时间戳列有什么限制?
    在时间戳列上使用current_timestamp或MySQL版本中的current_timestamp或在5.6.5 此限制源于遗留实现的关注,这些限制需要对当前的_timestamp功能进行特定的实现。 创建表`foo`( `Productid` int(10)unsigned not n...
    编程 发布于2025-04-07
  • 如何使用替换指令在GO MOD中解析模块路径差异?
    如何使用替换指令在GO MOD中解析模块路径差异?
    在使用GO MOD时,在GO MOD 中克服模块路径差异时,可能会遇到冲突,其中3个Party Package将另一个PAXPANCE带有导入式套件之间的另一个软件包,并在导入式套件之间导入另一个软件包。如回声消息所证明的那样: go.etcd.io/bbolt [&&&&&&&&&&&&&&&&...
    编程 发布于2025-04-07
  • 如何处理PHP文件系统功能中的UTF-8文件名?
    如何处理PHP文件系统功能中的UTF-8文件名?
    在PHP的Filesystem functions中处理UTF-8 FileNames 在使用PHP的MKDIR函数中含有UTF-8字符的文件很多flusf-8字符时,您可能会在Windows Explorer中遇到comploreer grounder grounder grounder gro...
    编程 发布于2025-04-07
  • eval()vs. ast.literal_eval():对于用户输入,哪个Python函数更安全?
    eval()vs. ast.literal_eval():对于用户输入,哪个Python函数更安全?
    称量()和ast.literal_eval()中的Python Security 在使用用户输入时,必须优先确保安全性。强大的python功能eval()通常是作为潜在解决方案而出现的,但担心其潜在风险。 This article delves into the differences betwee...
    编程 发布于2025-04-07
  • HTML格式标签
    HTML格式标签
    HTML 格式化元素 **HTML Formatting is a process of formatting text for better look and feel. HTML provides us ability to format text without us...
    编程 发布于2025-04-07
  • 哪种在JavaScript中声明多个变量的方法更可维护?
    哪种在JavaScript中声明多个变量的方法更可维护?
    在JavaScript中声明多个变量:探索两个方法在JavaScript中,开发人员经常遇到需要声明多个变量的需要。对此的两种常见方法是:在单独的行上声明每个变量: 当涉及性能时,这两种方法本质上都是等效的。但是,可维护性可能会有所不同。 第一个方法被认为更易于维护。每个声明都是其自己的语句,使其...
    编程 发布于2025-04-07
  • 为什么使用Firefox后退按钮时JavaScript执行停止?
    为什么使用Firefox后退按钮时JavaScript执行停止?
    导航历史记录问题:JavaScript使用Firefox Back Back 此行为是由浏览器缓存JavaScript资源引起的。要解决此问题并确保在后续页面访问中执行脚本,Firefox用户应设置一个空功能。 警报'); }; alert('inline Alert')...
    编程 发布于2025-04-07
  • Java是否允许多种返回类型:仔细研究通用方法?
    Java是否允许多种返回类型:仔细研究通用方法?
    在Java中的多个返回类型:一种误解类型:在Java编程中揭示,在Java编程中,Peculiar方法签名可能会出现,可能会出现,使开发人员陷入困境,使开发人员陷入困境。 getResult(string s); ,其中foo是自定义类。该方法声明似乎拥有两种返回类型:列表和E。但这确实是如此吗...
    编程 发布于2025-04-07
  • Python读取CSV文件UnicodeDecodeError终极解决方法
    Python读取CSV文件UnicodeDecodeError终极解决方法
    在试图使用已内置的CSV模块读取Python中时,CSV文件中的Unicode Decode Decode Decode Decode decode Error读取,您可能会遇到错误的错误:无法解码字节 在位置2-3中:截断\ uxxxxxxxx逃脱当CSV文件包含特殊字符或Unicode的路径逃...
    编程 发布于2025-04-07
  • 如何同步迭代并从PHP中的两个等级阵列打印值?
    如何同步迭代并从PHP中的两个等级阵列打印值?
    同步的迭代和打印值来自相同大小的两个数组使用两个数组相等大小的selectbox时,一个包含country代码的数组,另一个包含乡村代码,另一个包含其相应名称的数组,可能会因不当提供了exply for for for the uncore for the forsion for for ytry...
    编程 发布于2025-04-07
  • 如何干净地删除匿名JavaScript事件处理程序?
    如何干净地删除匿名JavaScript事件处理程序?
    删除匿名事件侦听器将匿名事件侦听器添加到元素中会提供灵活性和简单性,但是当要删除它们时,可以构成挑战,而无需替换元素本身就可以替换一个问题。 element? element.addeventlistener(event,function(){/在这里工作/},false); 要解决此问题,请考虑...
    编程 发布于2025-04-07
  • 找到最大计数时,如何解决mySQL中的“组函数\”错误的“无效使用”?
    找到最大计数时,如何解决mySQL中的“组函数\”错误的“无效使用”?
    如何在mySQL中使用mySql 检索最大计数,您可能会遇到一个问题,您可能会在尝试使用以下命令:理解错误正确找到由名称列分组的值的最大计数,请使用以下修改后的查询: 计数(*)为c 来自EMP1 按名称组 c desc订购 限制1 查询说明 select语句提取名称列和每个名称...
    编程 发布于2025-04-07
  • 如何在GO编译器中自定义编译优化?
    如何在GO编译器中自定义编译优化?
    在GO编译器中自定义编译优化 GO中的默认编译过程遵循特定的优化策略。 However, users may need to adjust these optimizations for specific requirements.Optimization Control in Go Compi...
    编程 发布于2025-04-07
  • 为什么我会收到MySQL错误#1089:错误的前缀密钥?
    为什么我会收到MySQL错误#1089:错误的前缀密钥?
    mySQL错误#1089:错误的前缀键错误descript [#1089-不正确的前缀键在尝试在表中创建一个prefix键时会出现。前缀键旨在索引字符串列的特定前缀长度长度,可以更快地搜索这些前缀。了解prefix keys `这将在整个Movie_ID列上创建标准主键。主密钥对于唯一识别...
    编程 发布于2025-04-07

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3