当前位置: 首页 > news >正文

【前端无障碍】ARIA属性详解:提升Web应用的可访问性

【前端无障碍】ARIA属性详解提升Web应用的可访问性前言大家好我是cannonmonster01今天咱们来深入聊聊ARIAAccessible Rich Internet Applications属性。如果你曾经遇到过屏幕阅读器无法正确识别自定义组件的问题那么ARIA就是你的救星什么是ARIAARIA是一组属性用于增强Web内容和应用的可访问性。它允许开发者为辅助技术如屏幕阅读器提供额外的语义信息。ARIA的核心概念角色Roles定义元素的类型!-- 定义角色 -- div rolebutton点击我/div div rolenavigation导航/div div rolealert警告信息/div属性Attributes提供额外的状态和属性信息!-- 状态属性 -- button aria-pressedfalse切换/button input aria-disabledtrue div aria-hiddentrue隐藏内容/div关系Relationships描述元素之间的关系!-- 描述关系 -- input aria-describedbydescription p iddescription输入您的邮箱地址/p !-- 标签关系 -- div rolebutton aria-label关闭X/divARIA角色详解文档结构角色!-- 页面结构 -- div rolebanner页头/div div rolemain主要内容/div div rolecomplementary侧边栏/div div rolecontentinfo页脚/div导航角色!-- 导航区域 -- nav rolenavigation aria-label主导航 ul lia href/首页/a/li lia href/about关于/a/li /ul /nav交互角色!-- 按钮角色 -- div rolebutton tabindex0点击我/div !-- 链接角色 -- span rolelink tabindex0链接文本/span !-- 复选框角色 -- div rolecheckbox aria-checkedfalse选择/div容器角色!-- 对话框 -- div roledialog aria-modaltrue div roledocument对话框内容/div /div !-- 列表 -- div rolelist div rolelistitem列表项1/div div rolelistitem列表项2/div /divARIA属性详解状态属性!-- 禁用状态 -- button aria-disabledtrue禁用按钮/button !-- 隐藏状态 -- div aria-hiddentrue仅装饰性内容/div !-- 选中状态 -- input typecheckbox aria-checkedtrue !-- 扩展状态 -- button aria-expandedfalse展开菜单/button标签属性!-- 标签 -- button aria-label关闭对话框X/button !-- 标签引用 -- input aria-labelledbylabel-id label idlabel-id用户名/label !-- 描述引用 -- input aria-describedbyhelp-text p idhelp-text输入提示.../p关系属性!-- 控制关系 -- button aria-controlsmenu打开菜单/button ul idmenu hidden菜单内容/ul !-- 拥有关系 -- div rolegrid aria-ownspopup表格/div div roledialog idpopup弹出内容/div !-- 活动描述 -- div rolestatus aria-livepolite状态更新/divARIA实时区域Live Regions基本用法!-- 礼貌型在空闲时更新 -- div aria-livepolite 新消息您有3条未读消息 /div !-- 断言型立即更新 -- div aria-liveassertive 警告连接中断 /div !-- 忙碌型静音状态 -- div aria-liveoff不播报/div高级配置!-- 配置实时区域 -- div aria-livepolite aria-atomictrue aria-relevantadditions 动态内容 /div实践案例无障碍导航菜单!-- 导航菜单 -- nav rolenavigation aria-label主导航 ul rolemenubar li rolemenuitem button aria-haspopuptrue aria-expandedfalse aria-controlsmenu-1 产品 /button ul idmenu-1 rolemenu hidden li rolemenuitema href/products全部产品/a/li li rolemenuitema href/new新品上市/a/li /ul /li /ul /nav// 菜单交互 const menuButton document.querySelector(button); const menu document.getElementById(menu-1); menuButton.addEventListener(click, () { const isExpanded menuButton.getAttribute(aria-expanded) true; menuButton.setAttribute(aria-expanded, !isExpanded); menu.hidden isExpanded; });无障碍表单form div label forusername用户名/label input idusername typetext aria-requiredtrue aria-invalidfalse aria-describedbyusername-help p idusername-help用户名长度为3-20个字符/p /div div label forpassword密码/label input idpassword typepassword aria-requiredtrue aria-describedbypassword-help p idpassword-help密码至少8位包含大小写字母/p /div button typesubmit提交/button /form无障碍轮播!-- 轮播组件 -- div roleregion aria-label图片轮播 div classcarousel div roleimg aria-label第一张图片描述 img srcslide1.jpg alt /div /div button aria-label上一张 aria-disabledfalse onClickprevSlide ← /button button aria-label下一张 aria-disabledfalse onClicknextSlide → /button ol roletablist li roletab aria-selectedtrue1/li li roletab aria-selectedfalse2/li li roletab aria-selectedfalse3/li /ol /divARIA最佳实践1. 使用语义化HTML优先!-- 好使用原生按钮 -- button点击我/button !-- 不好使用div模拟按钮 -- div rolebutton tabindex0点击我/div2. 不要重复语义!-- 好按钮已经有button角色 -- button点击我/button !-- 不好重复定义角色 -- button rolebutton点击我/button3. 保持状态同步// 更新状态时同步ARIA属性 const toggleButton document.getElementById(toggle); toggleButton.addEventListener(click, () { const isOn toggleButton.getAttribute(aria-pressed) true; toggleButton.setAttribute(aria-pressed, !isOn); });4. 使用合适的标签!-- 好使用aria-label描述图标按钮 -- button aria-label关闭✕/button !-- 不好没有标签 -- button✕/button常见错误错误1过度使用ARIA!-- 不好语义化标签已有角色 -- a href/ rolelink链接/a !-- 好不需要额外角色 -- a href/链接/a错误2使用错误的角色!-- 不好使用button角色但不是按钮 -- div rolebutton静态文本/div !-- 好使用正确的角色 -- div rolestatus状态文本/div错误3忘记管理状态!-- 不好状态不同步 -- button aria-pressedfalse onclicktoggle()切换/button !-- 好状态同步更新 -- button aria-pressedfalse onclickthis.setAttribute(aria-pressed, true) 切换/button测试ARIA使用axe测试import axe from axe-core; axe.run().then(results { console.log(ARIA问题:, results.violations); });使用屏幕阅读器测试VoiceOvermacOSCommand F5 启用NVDAWindowsInsert N 打开菜单JAWSWindowsInsert F6 切换焦点总结ARIA是提升Web可访问性的强大工具通过今天的学习相信你已经掌握了ARIA的核心概念角色、属性、关系常见ARIA角色和属性的用法实时区域的配置实践案例导航菜单、表单、轮播最佳实践和常见错误测试方法正确使用ARIA可以让你的应用对所有用户更加友好
http://www.gsyq.cn/news/1373663.html

相关文章:

  • 【图像识别】基于计算机实现自然场景下交通标示识别附Matlab代码
  • 告别折腾:实测腾达U9在Ubuntu 22.04上的最佳驱动方案与稳定性对比
  • 芯祥联MQTT BROKER 各服务器平台部署方法培训-1
  • 数据库优化在后端开发中的重要性:提升查询性能的技巧
  • Django 从 0 到 1 打造完整电商平台:商品详情页与图片展示
  • ARM SVE架构WHILE指令原理与应用详解
  • 容器化仿真与API驱动架构在嵌入式系统中的应用
  • [开源] 药房近效期药品消耗速度-库存交叉预警系统:面向药房精细化库存管理的 CLI 工具,用双维度风险建模替代经验式盯盘
  • 【服务网格】Istio入门:从部署到流量管理实战
  • 保姆级教程:在Ubuntu 18.04上从零搭建Carla 0.9.12自动驾驶仿真环境(含Python API配置)
  • 别再死记公式了!用Python手把手复现西瓜书3.0α数据集的对率回归(附完整代码与可视化)
  • 告别默认图表:手把手教你定制VASPKIT的PLOT.In文件,画出符合期刊要求的能带图
  • 不只是好看:为乡镇规划报告制作带蒙版的专业遥感影像地图(附ArcGIS标注与布局技巧)
  • IT简历远程_兼职经验呈现指南:HR直呼“真香”的正确姿势(附反例吐槽)
  • 为内部知识库问答系统接入Taotoken实现智能检索与摘要生成
  • 手把手教你:通过iLO5远程挂载镜像,为HPE Gen10服务器安装Windows Server 2012 R2(含P816i-a SR阵列卡驱动加载避坑指南)
  • CentOS服务器上VNC连接总出问题?这份保姆级排错手册(含端口混乱、服务重启、密码修改)
  • ros2_control 代码架构分析
  • 飞翔的小鸟精灵组
  • AI Agent Harness Engineering 与边缘计算:低延迟场景下的智能体部署与运行
  • [开源] 医联体结算博弈结构可视化系统:用纳什均衡定位多记账与少付出的策略失衡点,面向联盟办和医保结算岗的决策支持工具
  • 源码解读 CrewAI 的 Task 和 Agent 如何影响执行稳定性
  • [开源] 伦理批文与知情同意书版本一致性自动核查系统:面向伦理审查办公室的合规性守门工具
  • 012-java精品项目-淘客系统源码(安卓+IOS+php后端)
  • AArch64缓存架构解析与性能优化实践
  • Win10/Win11高分屏救星:手把手教你调单个软件的DPI兼容性,告别模糊界面
  • 项目实训个人博客(七)
  • 如何将上传至PyPI
  • Linux蓝牙SPP连接老是断?从原理到实战的稳定连接配置指南(BlueZ 5.x+)
  • 工业级大模型学习之路025:问题解决-检索质量全为0