Web Accessibility基础:构建无障碍的前端应用

Web Accessibility(网络无障碍)是确保所有人都能平等访问和使用网站和应用程序的关键。这包括视觉、听觉、运动和认知能力有限的用户。以下是一些构建无障碍前端应用的基础原则和代码示例:

2500G计算机入门到高级架构师开发资料超级大礼包免费送!

1. 文本替代(alt属性)

确保所有非文本内容(如图片)都有描述性的alt属性,以便屏幕阅读器用户理解图片内容。

<img src="hero.jpg" alt="A smiling person holding a cup of coffee">

2. 标签和角色(ARIA roles)

使用ARIA(Accessible Rich Internet Applications)角色和属性来增强可访问性,尤其是对于复杂交互元素。

<button role="button" aria-label="Close">X</button>

3. 表单元素

确保表单元素有清晰的标签,使用

<label for="email">Email:</label>
<input type="email" id="email" required>

4. 键盘导航

所有交互元素都应可以通过键盘导航,并遵循自然的焦点顺序。

<nav>
  <ul>
    <li><a href="#home" tabindex="0">Home</a></li>
    <li><a href="#about" tabindex="0">About</a></li>
    <li><a href="#contact" tabindex="0">Contact</a></li>
  </ul>
</nav>

5. 颜色对比

确保文本和背景之间有足够的颜色对比,避免颜色作为唯一的信息传递方式。

/* 使用颜色对比检查工具,如WCAG Color Contrast Checker */
body {
  color: #000; /* dark text */
  background-color: #f8f8f8; /* light background, good contrast */
}

6. 视觉隐藏

使用visually-hidden类隐藏内容,使其仅对屏幕阅读器可见。

.visually-hidden {
  position: absolute !important;
  clip: rect(0 0 0 0) !important;
  width: 1px !important;
  height: 1px !important;
  padding: 0 !important;
  margin: -1px !important;
  overflow: hidden !important;
  border: 0 !important;
}
<button>
  <span class="visually-hidden">Skip to main content</span>
  Skip
</button>

7. ARIA live区域

使用aria-live属性通知屏幕阅读器用户关于页面动态更新的信息。

<div aria-live="polite" aria-atomic="true" class="notification">
  <!-- Dynamic content will be inserted here -->
</div>

8. 时间敏感内容

为时间敏感的内容提供截止日期或计时器。

<p>
  This offer expires in:
  <span id="countdown"></span>
</p>

<script>
  // 更新countdown元素的内容
</script>

9. 考虑触控设备

确保触摸目标足够大,至少44x44像素,避免过于紧密的布局。

.button {
  min-width: 44px;
  min-height: 44px;
  padding: 10px;
}

10. 编码语义化

使用语义化的HTML元素,如<header>, <nav>, <main>, <article>, <section>, <footer>等。

<body>
  <header>
    <!-- Header content -->
  </header>
  <main>
    <!-- Main content -->
  </main>
  <footer>
    <!-- Footer content -->
  </footer>
</body>

11. 视觉指示器

为交互元素添加视觉反馈,如悬停、聚焦和激活状态。

.button {
  transition: all 0.3s;
}

.button:hover,
.button:focus,
.button:active {
  background-color: #333;
  color: #fff;
}

12. 语音命令和语音输入

考虑到语音控制设备,如Siri、Google Assistant等,确保界面可以通过语音命令操作。

<form action="/search">
  <label for="search">Search:</label>
  <input type="search" id="search" name="q" placeholder="Voice command: Search...">
  <button type="submit">Go</button>
</form>

13. 字体和文本可读性

选择易读的字体,保持足够的行高、字间距和字号。确保文本缩放不影响布局。

body {
  font-family: Arial, sans-serif;
  font-size: 16px;
  line-height: 1.5;
  letter-spacing: 0.05em;
  text-rendering: optimizeLegibility;
  -ms-text-size-adjust: 100%;
  -webkit-text-size-adjust: 100%;
}

14. 交互元素的清晰状态

确保用户清楚知道何时可以与元素交互,以及交互的状态。

input[type="checkbox"]:checked + label::before {
  content: '\2713'; /* checkmark character */
}
html
<input type="checkbox" id="accept" />
<label for="accept">I accept the terms and conditions</label>

15. 考虑色盲用户

使用色彩对比度检查工具,确保颜色组合对色盲用户友好。

.colorblind-friendly {
  background-color: #008080;
  color: #fff;
}

16. 视觉辅助

提供视觉辅助,如放大镜、高对比度模式、色盲模拟器等。

<button id="toggle-high-contrast">Toggle High Contrast</button>

<script>
  document.getElementById('toggle-high-contrast').addEventListener('click', function() {
    document.body.classList.toggle('high-contrast');
  });
</script>

<style>
  .high-contrast {
    background-color: #000;
    color: #fff;
  }
</style>

17. 适配屏幕阅读器

确保所有重要信息都能被屏幕阅读器读取,例如表格的标题和摘要。

<table>
  <caption>Employee List</caption>
  <thead>
    <tr>
      <th>Name</th>
      <th>Position</th>
      <th>Office</th>
    </tr>
  </thead>
  <!-- Table rows -->
</table>

18. 响应式设计

确保网站在不同设备和屏幕尺寸上表现良好,适应不同访问方式。

@media (max-width: 768px) {
  /* Mobile-specific styles */
}

19. 视频和音频内容

为视频提供字幕,为音频提供文字转录。

<video controls>
  <source src="movie.mp4" type="video/mp4">
  <track kind="captions" src="movie.vtt" srclang="en" label="English">
</video>

20. 定期测试

使用自动化和人工测试工具(如axe,Pa11y,Lighthouse等)定期检查可访问性,并根据反馈进行改进。

21. 图像地图(Image Maps)

对于包含多个交互区域的图像,使用图像地图提供可点击的区域。

<img src="worldmap.png" usemap="#worldmap" alt="World Map">
<map name="worldmap">
  <area shape="rect" coords="0,0,82,126" alt="North America" href="#na">
  <area shape="circle" coords="200,100,30" alt="Europe" href="#eu">
  <area shape="poly" coords="330,50,380,0,450,50,400,100" alt="Asia" href="#as">
</map>

22. 语音合成(Text-to-Speech)

为用户提供语音合成选项,让他们能够听到页面内容。

<button id="tts">Read Aloud</button>

<script>
  document.getElementById('tts').addEventListener('click', function() {
    const textToRead = document.querySelector('main').innerText;
    const speech = new SpeechSynthesisUtterance(textToRead);
    window.speechSynthesis.speak(speech);
  });
</script>

23. 错误提示和反馈

提供清晰的错误消息和反馈,使用户了解如何解决问题。

<form>
  <label for="email">Email:</label>
  <input type="email" id="email" required>
  <span id="email-error" class="error"></span>
  <button type="submit">Submit</button>
</form>

<script>
  document.querySelector('form').addEventListener('submit', function(event) {
    event.preventDefault();
    const emailInput = document.getElementById('email');
    const errorSpan = document.getElementById('email-error');

    if (!emailInput.checkValidity()) {
      errorSpan.textContent = 'Please enter a valid email address.';
    } else {
      errorSpan.textContent = '';
      // Submit form or perform other actions
    }
  });
</script>

24. 交互元素的焦点管理

确保键盘焦点在页面元素之间正确流动,避免跳过或重复。

const focusableElements = 'a[href], button, input:not([type="hidden"]), textarea, select, iframe, object, embed, [tabindex="0"], [contenteditable]';
const firstFocusableElement = document.querySelector(focusableElements);

document.addEventListener('DOMContentLoaded', function() {
  if (firstFocusableElement) {
    firstFocusableElement.focus();
  }
});

document.addEventListener('keydown', function(event) {
  if (event.key === 'Tab') {
    const lastFocusableElement = document.querySelector(`${focusableElements}:last-of-type`);
    if (event.shiftKey && document.activeElement === document.body) {
      lastFocusableElement.focus();
      event.preventDefault();
    } else if (!event.shiftKey && document.activeElement === lastFocusableElement) {
      firstFocusableElement.focus();
      event.preventDefault();
    }
  }
});

2500G计算机入门到高级架构师开发资料超级大礼包免费送!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/635092.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python TCP编程简单实例

客户端&#xff1a;创建TCP链接时&#xff0c;主动发起连接的叫做客户端 服务端&#xff1a;接收客户端的连接 连接其他服务器 可以通过tcp连接其他服务器。 示例&#xff1a; import socket# 1.创建一个socket # 参数1&#xff1a;指定协议 AF_INET&#xff08;ipv4&#…

ftp是什么,ftp能做什么,ftp有什么用 -----在Windows搭建ftp服务器

大家好&#xff0c;我是风屿&#xff0c;今天教大家如何从零开始搭建一台属于自己的ftp&#xff0c;本期教大家搭建Windows客户端的&#xff0c;后面是linux的 首先第一步要有一台联网的Windows电脑 1打开控制面板&#xff0c;找到程序&#xff0c;点击打开或关闭Windows功能…

MQTT 5.0 报文解析 05:DISCONNECT

欢迎阅读 MQTT 5.0 报文系列 的第五篇文章。在上一篇中&#xff0c;我们已经介绍了 MQTT 5.0 的 PINGREQ 和 PINGRESP 报文。现在&#xff0c;我们将介绍下一个控制报文&#xff1a;DISCONNECT。 在 MQTT 中&#xff0c;客户端和服务端可以在断开网络连接前向对端发送一个 DIS…

QT项目-欢乐斗地主游戏

QT项目-欢乐斗地主游戏 游戏概述游戏规则牌型牌型的大小游戏角色游戏规则游戏的胜负游戏计分规则 游戏相关的类介绍卡牌类玩家类窗口类游戏控制类游戏策略类线程类音频类 游戏主要组件卡牌玩家窗口 游戏控制源码 游戏概述 游戏规则 不同地域游戏规则可能有些许差异&#xff0c…

CCF20220601——归一化处理

CCF20220601——归一化处理 代码如下&#xff1a; #include<bits/stdc.h> using namespace std; int main() {int n,a[1000],sum0;scanf("%d",&n);for(int i1;i<n;i){scanf("%d",&a[i]);suma[i];}double aver1.0,b0.0,d1.0;aversum/(n*1…

vue3使用mitt.js进行各种组件间通信

我们在vue工程中&#xff0c;除开vue自带的什么父子间&#xff0c;祖孙间通信&#xff0c;还有一个非常方便的通信方式&#xff0c;类似Vue2.x 使用 EventBus 进行组件通信&#xff0c;而 Vue3.x 推荐使用 mitt.js。可以实现各个组件间的通信 优点&#xff1a;首先它足够小&…

0406 组合放大电路

组合放大电路 共射-共基放大电路共集-共集放大电路 4.6.1 共射—共基放大电路 4.6.2 共集—共集放大电路 共射-共基放大电路 共集-共集放大电路 (a) 原理图 (b)交流通路 T1、T2构成复合管&#xff0c;可等效为一个NPN管

c#点击listview控件获取内容

构造函数添加&#xff1a; 点击事件&#xff1a; &#xff08;listview控件确保有内容&#xff0c;比如已查询到数据添加到了listview&#xff09; if (listView_data_base.Items.Count > 0){listView_data_base.FullRowSelect true;listView_data_base.Items[listView_da…

【C语言】VS编译器的scanf

我们在写代码的时候通常需要用到输入函数&#xff1a;scanf&#xff0c;但在vs编译环境下却必须写为&#xff1a;scanf_s&#xff0c;这是为什么呢&#xff1f;这里就是vs规定的了&#xff0c;VS认为这样写更安全&#xff0c;但如果我们非要写成scanf形式也是有办法的。 # 看我…

服务器c盘爆满了,这几种方法可以帮助C盘“瘦身”

我们在使用服务器的时候基本不会在C盘安装软件&#xff0c;那么用久了发现C盘满了&#xff0c;提示空间不足&#xff1f;那么这是怎么回事&#xff0c;为什么空间会占用这么快呢&#xff1f; 原因一&#xff1a; C盘满了&#xff0c;很可能是因为电脑里的垃圾文件过多。操作系…

从业务角度来看,DevOps 是什么?

如果您在我们的应用程序名称中看到“DevOps”&#xff0c;这意味着我们必须正确解释该术语&#xff0c;我们会这样做&#xff0c;但角度会有所不同。让我们从业务角度看看 DevOps 是什么。 通用名称 首先你应该知道&#xff0c;DevOps 没有明确的定义。是的。 大多数情况下&a…

TypeScript-类型断言

类型断言 当开发者比TS本身更清楚当前的类型是什么&#xff0c;可以使用断言(as)让类型更加精确和具体 const _link document.getElementById(link) console.log(_link.href) // 出错了&#xff0c;如下图 const _link document.getElementById(link) as HTMLAnchorElement…

K8S认证|CKA题库+答案| 14. 排查故障节点

14、排查集群中的故障节点 您必须在以下Cluster/Node上完成此考题&#xff1a; Cluster Master node Worker node wk8s master …

iptablese防火墙【SNAT和DNAT】

目录 1.SNAT策略及应用 1.1SNAT原理与应用 1.2 SNAT策略的工作原理 1.3 实验操练 2.DNAT策略 2.1 DNAT策略的概述 2.2 DNAT原理与应用 2.3 实验操练 1.SNAT策略及应用 1.1SNAT原理与应用 SNAT 应用环境&#xff1a;局域网主机共享单个公网IP地址接入Internet&#xf…

AJAX、

文章目录 AJAX1. AJAX简介AJAX特点 2. XML简介3. AJAX发送get请求4. post请求设置体参数5. 设置请求头信息6. AJAX请求服务端响应json数据7. ie缓存问题8. 请求超时问题和网络异常9. 取消请求10. 请求重复取消11. jQuery中的AJAX请求12. axios函数发送AJAX使用fetch函数发送AJA…

PostgreSQL学习:关于PostgreSQL以及认证

1、关于PostgreSQL PostgreSQL&#xff08;简称PG&#xff09;是强大的企业级开源关系数据库&#xff0c;世界排名第四&#xff0c;前三位Oracle 、SQLServer、MySQL都是商业数据库或受商业主体的控制&#xff0c;PG是学术社区开源数据库&#xff0c;开源协议自由度非常高&…

【oracle的安装记录】

oracle安装记录 一、下载以后&#xff0c;解压到同一路径下面 二、双击可执行安装文件&#xff0c;等待文件加载 三、双击以后&#xff0c;弹出信息 四、提示该窗口&#xff0c;点击【是】即可 五、未填写配置安全更新信息 六、弹出小窗口&#xff0c;选择【是】 七、安装选项…

机器学习之决策树算法

使用决策树训练红酒数据集 完整代码&#xff1a; import numpy as np import matplotlib.pyplot as plt from matplotlib.colors import ListedColormap from sklearn import tree, datasets from sklearn.model_selection import train_test_split# 准备数据&#xff0c;这里…

一个通过ADC采集NTC热敏电阻的温度传感器

前言: 如何设计一个电路,使用具有逐次逼近寄存器(SAR)模数转换器(ADC)的热敏电阻直接监测温度呢?温度传感电路需要使用负温度系数(NTC)热敏电阻与电阻器串联形成分压器,监测-25C至100C的温度范围。分压器具有产生与监测的温度成反比的输出电压的效果。电阻器分压器的…

面试准备-项目【面试准备】

面试准备-项目【面试准备】 前言面试准备自我介绍&#xff1a;项目介绍&#xff1a; 论坛项目功能总结简介数据库表设计注册功能登录功能显示登录信息功能发布帖子评论私信点赞功能关注功能通知搜索网站数据统计热帖排行缓存 论坛项目技术总结Http的无状态cookie和session的区别…