HTML地图可访问性实现方案
图像地图是HTML中通过单张图片关联多个可点击区域的交互组件,常用于制作导航图、区域选择图等场景。但默认的图像地图对屏幕阅读器用户、键盘导航用户存在访问障碍,需要通过额外的属性配置和语义补充来提升可访问性。
图像地图基础结构回顾
标准图像地图由<img>标签和<map>标签配合实现,<map>标签内部通过<area>标签定义各个可点击区域的形状和坐标。基础结构示例如下:
<img src="region-map.png" alt="中国省份分布图" usemap="#regionMap"> <map name="regionMap"> <area shape="rect" coords="100,50,200,150" href="beijing.html" alt="北京"> <area shape="circle" coords="300,200,50" href="shanghai.html" alt="上海"> <area shape="poly" coords="400,100,450,150,420,200,380,180" href="guangdong.html" alt="广东"> </map>
核心可访问性问题
未优化的图像地图常见可访问性问题包括:
屏幕阅读器无法正确识别图像地图的交互区域,用户不知道图片包含可点击内容
键盘用户无法通过Tab键聚焦到<area>区域,无法使用键盘操作
当图片加载失败时,用户无法获知地图的功能和区域含义
缺少区域的描述信息,视障用户无法理解每个区域对应的内容
可访问性实现方案
1. 完善<img>标签的alt属性
<img>标签的alt属性需要清晰描述图片的整体内容和功能,不能仅写“地图”这类模糊描述。如果图片是装饰性的,也需要设置空的alt属性避免屏幕阅读器读出冗余信息。示例:
<img src="region-map.png" alt="中国省级行政区分布示意图,点击对应区域可查看该省份详情" usemap="#regionMap">
2. 为<area>标签添加必要属性
每个<area>标签需要补充以下属性提升可访问性:
alt属性:必须设置,描述该区域的功能,不能和<img>的alt重复,也不能为空(除非区域无实际功能)
tabindex属性:设置为0,让键盘用户可以通过Tab键聚焦到区域
role属性:设置为link,明确告知辅助技术该区域是链接类型的交互元素
aria-label属性:如果需要更详细的描述,可以补充该属性,优先级高于alt属性
优化后的<area>标签示例:
<area shape="rect" coords="100,50,200,150" href="beijing.html" alt="查看北京市详细信息" tabindex="0" role="link" aria-label="北京市区域,点击可查看北京市的行政区划、人口、经济等详细信息" >
3. 提供替代文本导航方案
对于复杂的图像地图,仅依赖<area>的可访问性属性仍然不够,需要为无法访问图像地图的用户提供纯文本的替代导航。可以在图片下方添加对应区域的文本链接列表,示例:
<p>无法查看地图的用户可通过以下链接访问对应区域:</p> <ul> <li><a href="beijing.html">北京市详情</a></li> <li><a href="shanghai.html">上海市详情</a></li> <li><a href="guangdong.html">广东省详情</a></li> </ul>
4. 处理图片加载失败的场景
当图片加载失败时,需要确保用户仍然能知道地图的功能。可以通过CSS配合<img>的onerror事件,在图片加载失败时显示替代文本,示例:
<img
src="region-map.png"
alt="中国省级行政区分布示意图,点击对应区域可查看该省份详情"
usemap="#regionMap"
onerror="this.style.display='none';document.getElementById('mapFallback').style.display='block';"
>
<div id="mapFallback" style="display:none;">
<p>地图加载失败,请通过以下链接访问对应区域:</p>
<ul>
<li><a href="beijing.html">北京市详情</a></li>
<li><a href="shanghai.html">上海市详情</a></li>
<li><a href="guangdong.html">广东省详情</a></li>
</ul>
</div>可访问性测试验证
完成优化后,需要通过以下方式验证可访问性效果:
使用屏幕阅读器(如NVDA、VoiceOver)访问页面,确认可以正确读出图片描述、各个区域的功能,并且可以通过键盘操作区域链接
关闭浏览器图片加载功能,确认替代文本导航可以正常显示和使用
仅使用键盘Tab键导航,确认可以依次聚焦到所有<area>区域,并且按Enter键可以触发跳转
使用Lighthouse等工具的可访问性审计功能,检查是否存在未通过的可访问性规则
完整优化示例
整合上述所有方案的完整图像地图代码如下:
<!-- 图像地图主体 -->
<img
src="region-map.png"
alt="中国省级行政区分布示意图,点击对应区域可查看该省份详情"
usemap="#regionMap"
onerror="this.style.display='none';document.getElementById('mapFallback').style.display='block';"
>
<map name="regionMap">
<area
shape="rect"
coords="100,50,200,150"
href="beijing.html"
alt="查看北京市详细信息"
tabindex="0"
role="link"
aria-label="北京市区域,点击可查看北京市的行政区划、人口、经济等详细信息"
>
<area
shape="circle"
coords="300,200,50"
href="shanghai.html"
alt="查看上海市详细信息"
tabindex="0"
role="link"
aria-label="上海市区域,点击可查看上海市的行政区划、人口、经济等详细信息"
>
<area
shape="poly"
coords="400,100,450,150,420,200,380,180"
href="guangdong.html"
alt="查看广东省详细信息"
tabindex="0"
role="link"
aria-label="广东省区域,点击可查看广东省的行政区划、人口、经济等详细信息"
>
</map>
<!-- 图片加载失败替代方案 -->
<div id="mapFallback" style="display:none;">
<p>地图加载失败,请通过以下链接访问对应区域:</p>
<ul>
<li><a href="beijing.html">北京市详情</a></li>
<li><ashanghai.html">上海市详情</a></li>
<li><a href="guangdong.html">广东省详情</a></li>
</ul>
</div>
<!-- 常规替代文本导航 -->
<p>如需纯文本导航,可通过以下链接访问对应区域:</p>
<ul>
<li><a href="beijing.html">北京市详情</a></li>
<li><a href="shanghai.html">上海市详情</a></li>
<li><a href="guangdong.html">广东省详情</a></li>
</ul>通过以上方案,可以让图像地图同时满足视觉用户、键盘用户、辅助技术用户的使用需求,符合WCAG(Web内容可访问性指南)的相关要求。