您现在的位置是:网站首页 > 可访问性考虑文章详情

可访问性考虑

可访问性基础概念

可访问性(Accessibility)指网站和应用能够被所有人使用,包括残障人士。HTML作为网页的基础结构,其可访问性直接影响用户体验。屏幕阅读器、键盘导航、放大工具等辅助技术都依赖良好的HTML结构。

<!-- 糟糕的可访问性示例 -->
<div onclick="doSomething()">点击这里</div>

<!-- 改进后的版本 -->
<button onclick="doSomething()">点击这里</button>

语义化HTML的重要性

使用正确的HTML元素是最基础的可访问性实践。语义化标签不仅帮助搜索引擎理解内容,更是辅助技术的导航基础。

<!-- 非语义化结构 -->
<div class="header">
  <div class="nav">
    <div class="item">首页</div>
    <div class="item">产品</div>
  </div>
</div>

<!-- 语义化改进 -->
<header>
  <nav>
    <ul>
      <li><a href="/">首页</a></li>
      <li><a href="/products">产品</a></li>
    </ul>
  </nav>
</header>

ARIA角色与属性

当原生HTML元素无法满足需求时,ARIA(Accessible Rich Internet Applications)提供补充方案。但应优先使用原生HTML元素。

<!-- 自定义标签页组件 -->
<div role="tablist">
  <button role="tab" aria-selected="true" aria-controls="panel1">标签1</button>
  <button role="tab" aria-selected="false" aria-controls="panel2">标签2</button>
</div>
<div role="tabpanel" id="panel1">内容1</div>
<div role="tabpanel" id="panel2" hidden>内容2</div>

键盘导航支持

所有交互元素必须支持键盘操作。测试时尝试仅用Tab、Shift+Tab、Enter和空格键操作页面。

<!-- 自定义下拉菜单 -->
<div class="dropdown">
  <button id="dropdownButton" aria-expanded="false" aria-haspopup="true">
    菜单
  </button>
  <ul role="menu" aria-labelledby="dropdownButton" hidden>
    <li role="none"><a role="menuitem" href="#">选项1</a></li>
    <li role="none"><a role="menuitem" href="#">选项2</a></li>
  </ul>
</div>

<script>
document.getElementById('dropdownButton').addEventListener('keydown', (e) => {
  if (e.key === 'Enter' || e.key === ' ') {
    e.preventDefault();
    toggleMenu();
  }
});
</script>

颜色对比与视觉设计

WCAG 2.1规定文本与背景的对比度至少达到4.5:1(AA级),大号文本可降至3:1。

/* 不符合标准的低对比度 */
.low-contrast {
  color: #999;
  background: #fff;
}

/* 符合AA标准的样式 */
.accessible-text {
  color: #767676;
  background: #fff;
}

表单可访问性

表单是用户交互的重要部分,需要特别关注可访问性。

<!-- 问题表单 -->
<input type="text" name="username">
<button>提交</button>

<!-- 改进后的表单 -->
<div class="form-group">
  <label for="username">用户名</label>
  <input type="text" id="username" name="username" required
         aria-describedby="usernameHelp">
  <small id="usernameHelp">请输入3-20个字符的用户名</small>
</div>
<button type="submit">提交</button>

多媒体内容可访问性

图片、视频等非文本内容需要提供替代方案。

<!-- 装饰性图片 -->
<img src="divider.png" alt="" aria-hidden="true">

<!-- 信息性图片 -->
<img src="chart.png" alt="2023年销售额增长30%的柱状图"
     longdesc="chart-description.html">

<!-- 视频示例 -->
<video controls>
  <source src="tutorial.mp4" type="video/mp4">
  <track src="subtitles.vtt" kind="subtitles" srclang="zh" label="中文">
  <p>您的浏览器不支持HTML5视频,<a href="tutorial.mp4">下载视频</a></p>
</video>

动态内容更新

单页应用中动态加载的内容需要通知辅助技术。

<div id="live-region" aria-live="polite"></div>

<script>
function updateStatus(message) {
  const region = document.getElementById('live-region');
  region.textContent = message;
  
  // 对于复杂更新
  region.setAttribute('aria-atomic', 'false');
}
</script>

移动设备可访问性

触屏设备有独特的可访问性需求。

<!-- 确保触摸目标足够大 -->
<button style="min-width: 48px; min-height: 48px">确定</button>

<!-- 避免悬停交互 -->
<div class="tooltip-container">
  <button aria-describedby="tooltip1">信息</button>
  <div id="tooltip1" role="tooltip" class="tooltip">详细说明...</div>
</div>

测试与验证工具

多种工具可帮助评估和改进可访问性。

// 自动化测试示例(使用axe-core)
import axe from 'axe-core';

axe.run(document, {
  runOnly: {
    type: 'tag',
    values: ['wcag2a', 'wcag2aa']
  }
}, (err, results) => {
  if (err) throw err;
  console.log(results.violations);
});

性能与可访问性

页面加载速度也影响可访问性体验。

<!-- 延迟加载非关键图片 -->
<img src="placeholder.jpg" data-src="content.jpg" 
     alt="产品展示" loading="lazy">

<!-- 关键CSS内联 -->
<style>
  /* 首屏关键样式 */
  .header, .main-nav { ... }
</style>
<link rel="stylesheet" href="non-critical.css" media="print" onload="this.media='all'">

国际化考虑

不同语言和文化背景下的可访问性需求。

<!-- 语言声明 -->
<html lang="zh-Hans">

<!-- 双向文本 -->
<p dir="auto">混合文本 English والعربية</p>

<!-- 日期格式 -->
<time datetime="2023-12-25">2023年12月25日</time>

渐进增强策略

确保核心功能在所有环境下可用。

<!-- 基础HTML结构 -->
<noscript>
  <p>请启用JavaScript以获得完整功能</p>
</noscript>

<!-- 增强的交互组件 -->
<details>
  <summary>更多信息</summary>
  <p>这里是详细内容...</p>
</details>

用户偏好设置

尊重用户的系统偏好设置。

/* 暗色模式支持 */
@media (prefers-color-scheme: dark) {
  body {
    background: #121212;
    color: #e0e0e0;
  }
}

/* 减少动画 */
@media (prefers-reduced-motion: reduce) {
  * {
    animation: none !important;
    transition: none !important;
  }
}

文档结构与大纲

合理的标题层级帮助用户理解内容结构。

<!-- 正确的大纲结构 -->
<main>
  <h1>主标题</h1>
  <section>
    <h2>章节标题</h2>
    <article>
      <h3>文章标题</h3>
    </article>
  </section>
</main>

错误处理与恢复

清晰的错误信息帮助用户纠正问题。

<!-- 表单错误示例 -->
<div class="form-group">
  <label for="email">电子邮箱</label>
  <input type="email" id="email" aria-invalid="true"
         aria-describedby="emailError">
  <div id="emailError" role="alert" class="error-message">
    请输入有效的电子邮箱地址
  </div>
</div>

我的名片

网名:~川~

岗位:console.log 调试员

坐标:重庆市-九龙坡区

邮箱:cc@qdcc.cn

沙漏人生

站点信息

  • 建站时间:2013/03/16
  • 本站运行
  • 文章数量
  • 总访问量
微信公众号
每次关注
都是向财富自由迈进的一步