」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 建立可存取的 React 應用程式

建立可存取的 React 應用程式

發佈於2024-11-04
瀏覽:688

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]刪除
最新教學 更多>
  • 如何實時捕獲和流媒體以進行聊天機器人命令執行?
    如何實時捕獲和流媒體以進行聊天機器人命令執行?
    在開發能夠執行命令的chatbots的領域中,實時從命令執行實時捕獲Stdout,一個常見的需求是能夠檢索和顯示標準輸出(stdout)在cath cath cant cant cant cant cant cant cant cant interfaces in Chate cant inter...
    程式設計 發佈於2025-05-29
  • 如何克服PHP的功能重新定義限制?
    如何克服PHP的功能重新定義限制?
    克服PHP的函數重新定義限制在PHP中,多次定義一個相同名稱的函數是一個no-no。嘗試這樣做,如提供的代碼段所示,將導致可怕的“不能重新列出”錯誤。 但是,PHP工具腰帶中有一個隱藏的寶石:runkit擴展。它使您能夠靈活地重新定義函數。 runkit_function_renction_...
    程式設計 發佈於2025-05-29
  • 如何簡化PHP中的JSON解析以獲取多維陣列?
    如何簡化PHP中的JSON解析以獲取多維陣列?
    php 試圖在PHP中解析JSON數據的JSON可能具有挑戰性,尤其是在處理多維數組時。 To simplify the process, it's recommended to parse the JSON as an array rather than an object.To do...
    程式設計 發佈於2025-05-29
  • 如何在JavaScript對像中動態設置鍵?
    如何在JavaScript對像中動態設置鍵?
    在嘗試為JavaScript對象創建動態鍵時,如何使用此Syntax jsObj['key' i] = 'example' 1;不工作。正確的方法採用方括號: jsobj ['key''i] ='example'1; 在JavaScript中,數組是一...
    程式設計 發佈於2025-05-29
  • 解決Spring Security 4.1及以上版本CORS問題指南
    解決Spring Security 4.1及以上版本CORS問題指南
    彈簧安全性cors filter:故障排除常見問題 在將Spring Security集成到現有項目中時,您可能會遇到與CORS相關的錯誤,如果像“訪問Control-allo-allow-Origin”之類的標頭,則無法設置在響應中。為了解決此問題,您可以實現自定義過濾器,例如代碼段中的MyFi...
    程式設計 發佈於2025-05-29
  • 如何將來自三個MySQL表的數據組合到新表中?
    如何將來自三個MySQL表的數據組合到新表中?
    mysql:從三個表和列的新表創建新表 答案:為了實現這一目標,您可以利用一個3-way Join。 選擇p。 *,d.content作為年齡 來自人為p的人 加入d.person_id = p.id上的d的詳細信息 加入T.Id = d.detail_id的分類法 其中t.taxonomy ...
    程式設計 發佈於2025-05-29
  • 如何從Python中的字符串中刪除表情符號:固定常見錯誤的初學者指南?
    如何從Python中的字符串中刪除表情符號:固定常見錯誤的初學者指南?
    從python import codecs import codecs import codecs 導入 text = codecs.decode('這狗\ u0001f602'.encode('utf-8'),'utf-8') 印刷(文字)#帶有...
    程式設計 發佈於2025-05-29
  • 為什麼我在Silverlight Linq查詢中獲得“無法找到查詢模式的實現”錯誤?
    為什麼我在Silverlight Linq查詢中獲得“無法找到查詢模式的實現”錯誤?
    查詢模式實現缺失:解決“無法找到”錯誤在Silverlight應用程序中,嘗試使用LINQ建立LINQ連接以錯誤而實現的數據庫”,無法找到查詢模式的實現。”當省略LINQ名稱空間或查詢類型缺少IEnumerable 實現時,通常會發生此錯誤。 解決問題來驗證該類型的質量是至關重要的。在此特定實例...
    程式設計 發佈於2025-05-29
  • 為什麼我會收到MySQL錯誤#1089:錯誤的前綴密鑰?
    為什麼我會收到MySQL錯誤#1089:錯誤的前綴密鑰?
    mySQL錯誤#1089:錯誤的前綴鍵錯誤descript [#1089-不正確的前綴鍵在嘗試在表中創建一個prefix鍵時會出現。前綴鍵旨在索引字符串列的特定前綴長度長度,可以更快地搜索這些前綴。 了解prefix keys `這將在整個Movie_ID列上創建標準主鍵。主密鑰對於唯一識...
    程式設計 發佈於2025-05-29
  • 在Java中使用for-to-loop和迭代器進行收集遍歷之間是否存在性能差異?
    在Java中使用for-to-loop和迭代器進行收集遍歷之間是否存在性能差異?
    For Each Loop vs. Iterator: Efficiency in Collection TraversalIntroductionWhen traversing a collection in Java, the choice arises between using a for-...
    程式設計 發佈於2025-05-29
  • Go語言如何動態發現導出包類型?
    Go語言如何動態發現導出包類型?
    與反射軟件包中的有限類型的發現能力相反,本文探索了替代方法,探索了在Runruntime。 go import( “ FMT” “去/進口商” ) func main(){ pkg,err:= incorter.default()。導入(“ time”) 如果er...
    程式設計 發佈於2025-05-29
  • 如何在php中使用捲髮發送原始帖子請求?
    如何在php中使用捲髮發送原始帖子請求?
    如何使用php 創建請求來發送原始帖子請求,開始使用curl_init()開始初始化curl session。然後,配置以下選項: curlopt_url:請求 [要發送的原始數據指定內容類型,為原始的帖子請求指定身體的內容類型很重要。在這種情況下,它是文本/平原。要執行此操作,請使用包含以下標頭...
    程式設計 發佈於2025-05-29
  • 如何為PostgreSQL中的每個唯一標識符有效地檢索最後一行?
    如何為PostgreSQL中的每個唯一標識符有效地檢索最後一行?
    postgresql:為每個唯一標識符提取最後一行,在Postgresql中,您可能需要遇到與在數據庫中的每個不同標識相關的信息中提取信息的情況。考慮以下數據:[ 1 2014-02-01 kjkj 在數據集中的每個唯一ID中檢索最後一行的信息,您可以在操作員上使用Postgres的有效效率: ...
    程式設計 發佈於2025-05-29
  • 為什麼不使用CSS`content'屬性顯示圖像?
    為什麼不使用CSS`content'屬性顯示圖像?
    在Firefox extemers屬性為某些圖像很大,&& && && &&華倍華倍[華氏華倍華氏度]很少見,卻是某些瀏覽屬性很少,尤其是特定於Firefox的某些瀏覽器未能在使用內容屬性引用時未能顯示圖像的情況。這可以在提供的CSS類中看到:。 googlepic { 內容:url(&...
    程式設計 發佈於2025-05-29
  • 為什麼PHP的DateTime :: Modify('+1個月')會產生意外的結果?
    為什麼PHP的DateTime :: Modify('+1個月')會產生意外的結果?
    使用php dateTime修改月份:發現預期的行為在使用PHP的DateTime類時,添加或減去幾個月可能並不總是會產生預期的結果。正如文檔所警告的那樣,“當心”這些操作的“不像看起來那樣直觀。 考慮文檔中給出的示例:這是內部發生的事情: 現在在3月3日添加另一個月,因為2月在2001年只有2...
    程式設計 發佈於2025-05-29

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3