网页图片的无障碍实战:alt 到底怎么写,屏幕阅读器里那些图是什么样的
做前端第八年我第一次认真戴上耳机、关掉屏幕、用 VoiceOver 从头到尾听完自己做的页面是被一个客服工单逼的。有个视障用户投诉说我们商品列表页根本没法用每张图都念一串乱码。我打开一看——好家伙产品图的 alt 全是后端拼的文件名altIMG_20240517_093412_v2_final_final.jpg。屏幕阅读器一板一眼地把这串东西读了出来。那一刻我意识到我过去写的无数个alt属性基本都是应付 lint 规则用的从没考虑过它真正被念出来是什么感受。这篇就把我这两年趟出来的图片可访问性经验倒一倒。不讲大道理全是能直接抄进项目的判断和代码。先分清这张图到底是干嘛的所有关于 alt 的纠结本质都是一个问题没想清楚——这张图在页面里承担的是信息还是装饰。这两类的处理方式是相反的混了就出错。信息性图片指的是图片本身携带内容去掉它信息就缺了一块。产品照片、图表、说明性截图、有文字的 banner都算。这类必须写有意义的 alt。装饰性图片指的是它纯粹是视觉点缀去掉它内容一点不少。分隔线、圆角背景纹理、纯氛围的配图、和旁边文字重复的图标都算。这类必须显式声明为空让屏幕阅读器直接跳过。关键的坑在装饰这一侧。很多人以为装饰图不写 alt 就行了错。看这段!-- 灾难写法屏幕阅读器会念出 URL 或文件名 --imgsrc/assets/divider-gold.png!-- 正确空 alt屏幕阅读器完全跳过 --imgsrc/assets/divider-gold.pngaltimg没有 alt 属性时多数屏幕阅读器会退而去读src的文件名当替代文本于是用户听到一串divider-gold-png。而alt注意是空字符串中间不能有空格是一个明确信号这张图无内容价值别念。这俩差了十万八千里我 review 代码现在第一件事就是抓没有 alt 属性的img。如果你更想表达语义上这是个装饰角色也可以用rolepresentation或rolenone效果和空 alt 类似都是把元素从无障碍树里剔掉imgsrc/bg-texture.pngaltrolepresentation不过实测下来alt兼容性最稳能覆盖到就够了role是锦上添花。信息性图片的 alt写内容不写外观好装饰的搞定了难的是信息图 alt 怎么写。我总结的一条准则替代文本要传达图片承载的信息和功能而不是描述像素长什么样。举个例子同一张红色感叹号图标 库存不足的图!-- 描述外观没用 --imgsrc/icon-warning.svgalt红色三角形里有个感叹号!-- 传达信息对了 --imgsrc/icon-warning.svgalt库存不足用户不需要知道那是三角形还是圆形、红色还是橙色——那是给视觉设计看的。他需要知道的是库存不足这件事。再进阶一层alt 要看上下文。同一张爱因斯坦的照片放在人物传记页和放在经典打印海报电商页alt 该完全不同。前者可能是阿尔伯特·爱因斯坦晚年肖像后者更该是爱因斯坦吐舌头黑白海报A2 尺寸因为在购物场景里用户关心的是这个商品是什么。同一张图没有标准答案脱离上下文谈 alt 都是耍流氓。几条我常用的实操细节alt 别加图片“” 一张……的照片这种前缀。屏幕阅读器碰到img本来就会先播报图像你再写图片就成了图像 图片 XXX啰嗦。如果图片是个链接或按钮里唯一的内容alt 必须描述这个操作会去哪/做什么而不是描述图长啥样。比如站标 logo 通常链到首页写alt返回首页比alt公司logo有用得多。图里有文字的话alt 一般要把关键文字抄进去尤其是营销图上的价格、优惠信息。这些文字对视觉用户可见对视障用户就凭空消失了。长度别失控。一句话讲清就行通常别超过一行。真需要长描述的复杂图表用下面讲的aria-describedby。复杂图表和信息图一句 alt 装不下数据可视化是重灾区。一张趋势折线图你 alt 写2024 年销售趋势图等于没写——用户知道有张图但图里说了啥一无所知。处理思路有两层。第一层alt 给个概括结论。第二层用aria-describedby挂一段详细的文字替代把图里的数据讲清楚。figureimgsrc/sales-2024.svgalt2024 年季度销售额呈上升趋势aria-describedbysales-descfigcaptionidsales-descQ1 销售额 120 万元Q2 增至 165 万元Q3 达到 210 万元 Q4 冲到 280 万元。全年环比持续增长Q4 增幅最大 较 Q3 提升约 33%。/figcaption/figure这里我把详细描述放进了可见的figcaption一举两得视觉用户也能看到数据摘要视障用户通过aria-describedby关联读到。aria-describedby的值是目标元素的 id屏幕阅读器读完 alt 会接着读这段。早年有个longdesc属性专门干这事但它是外链一个描述页面的浏览器支持烂、维护也烦现在基本淘汰了。aria-describedby加可见 figcaption 是我现在的默认解法。如果你不想让描述在视觉上显示可以放进一个视觉隐藏但屏幕阅读器可读的容器下面有.sr-only的写法但我更倾向让所有人都看到数据摘要反正对谁都有好处。信息图infographic同理那种一大张塞满流程和数字的图最好在旁边或下方提供等价的结构化文本/列表别指望一个 alt 交代清楚。SVG 图标的可访问性比 img 麻烦内联 SVG 现在满天飞但它不是img没有 alt 属性处理方式单独一套。而且不同屏幕阅读器对 SVG 的支持参差不齐这块坑最多。先分场景。纯装饰的 SVG 图标旁边已经有文字标签的那种直接aria-hiddentrue藏掉buttonsvgaria-hiddentruefocusablefalsewidth16height16usehref#icon-cart/use/svg加入购物车/buttonaria-hiddentrue把 SVG 从无障碍树移除用户只会听到按钮的文字加入购物车。那个focusablefalse是给老 IE/Edge 擦屁股的——某些旧版本里 SVG 会意外可聚焦Tab 键会卡在上面加上这个防患。现在能不能省看你兼容目标我一般还是留着一个属性的事。承载信息的 SVG比如一个只有图标没有文字的图标按钮必须补语义。两种主流写法!-- 方式一aria-label 直接给可访问名 --buttonaria-label搜索svgaria-hiddentruefocusablefalseusehref#icon-search//svg/button!-- 方式二SVG 内部用 title role --svgroleimgaria-labelledbysearch-titlewidth20height20titleidsearch-title搜索/titleusehref#icon-search//svg方式一是我用得最多的图标 SVG 一律aria-hidden把可访问名交给外层的button/a用aria-label提供。逻辑清晰也不受 SVG 屏幕阅读器兼容性折腾。方式二用 SVG 内部的title加roleimg加aria-labelledby。注意光有title不够可靠SafariVoiceOver 有时不认所以要显式roleimg加aria-labelledby指向 title 的 id把三件套配齐兼容性才稳。SVG 里还有个desc可以放更长的描述用得少复杂图形才需要。顺便提一句use href#...引用 symbol 的写法图标本体的 symbol 定义里也别塞 title容易和使用处的语义打架语义统一在使用处给。CSS 背景图无障碍树里根本不存在这个概念很多人没意识到用background-image铺的图屏幕阅读器完全感知不到无障碍树里它不存在。这既是坑也是特性。如果你拿背景图去放装饰性内容——纹理、渐变、氛围图——那太好了天生就被无障碍忽略你啥也不用管这正是我们想要的。但如果你偷懒把信息性内容做成了背景图我见过有人把限时五折的促销文字直接切成背景图铺上去那视障用户就彻底丢失了这个信息因为背景图没有任何替代文本机制。这种情况要么改回img alt要么在那个元素上补 ARIAdivclasshero-bannerroleimgaria-label限时五折促销仅剩 3 天/div给背景图容器加roleimg加aria-label相当于手动把它塞回无障碍树。但说实话这是补救能用真img就用真的语义天然、SEO 也友好。真机实测VoiceOver 和 NVDA 会打架代码写得再漂亮不上真机听一遍都是纸上谈兵。我踩过最多的亏就是看起来 ARIA 都对实际读出来不对。几个实测经验macOS VoiceOverCmdF5 开启CtrlOption右方向键逐项走对 SVGtitle的支持时好时坏尤其配 Safari。前面说的roleimg加aria-labelledby三件套就是为了绕它。VoiceOver 读img会先播图像再读 alt。Windows NVDA免费配 Firefox 或 Chrome 测整体对 ARIA 支持更规矩但它和浏览器的组合会影响结果——NVDAFirefox 和 NVDAChrome 对同一段aria-describedby的播报时机能不一样。所以我至少测 VoiceOver/Safari NVDA/Firefox 两组。一个特别容易翻车的点aria-label和元素内的可见文字同时存在时aria-label会覆盖掉可见文字屏幕阅读器只念 aria-label。我见过有人给一个加入购物车按钮加了aria-label购物车结果视障用户听到的是购物车把动作词加入给吞了。所以按钮如果本身有文字多半根本不需要 aria-label别画蛇添足。还有个免费的低成本自查手段装个 axe DevTools 或用 Lighthouse 的 accessibility 审计跑一遍能自动抓出缺 alt、对比度不足这类硬伤。但记住自动化工具只能查约 30%-40% 的问题alt 写得对不对、有没有意义这种它判断不了最后还得靠人戴上耳机真听。一段能到处用的视觉隐藏工具类最后送个高频工具。有时你想给屏幕阅读器提供额外文字比如图标按钮的说明又不想视觉上显示别用display:none或visibility:hidden——那俩会把内容从无障碍树也一起干掉屏幕阅读器读不到。要用这个经典的.sr-only.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0;}ahref/cartsvgaria-hiddentrueusehref#icon-cart//svgspanclasssr-only购物车3 件商品/span/a它把元素缩到 1px 挤出视口外、裁剪掉视觉上不可见但仍留在无障碍树里屏幕阅读器照读。这一个类能解决大半想补语义又不想动视觉的场景。说点诚实的边界写到这儿得泼点冷水。图片可访问性没有银弹alt的正确高度依赖上下文和业务判断很多时候没有唯一答案只有更合适的答案——这活儿本质上是内容工作不是纯技术活指望某个规则或工具帮你自动生成好 alt目前都不现实。自动生成的描述往往只描述像素、抓不住页面语境还得人来兜底改。另外我这套经验主要覆盖屏幕阅读器这一类用户可访问性远不止于此——低视力放大、色盲对比度、键盘导航、认知障碍每一块都是深水区我也还在学。SVG 那部分的兼容性尤其是流沙浏览器和读屏软件版本一变可能就有出入别把我上面写的当成永久真理上你自己的目标环境实测才算数。真要开始改我的建议是别追求一步到位。先跑个 axe 把没有 alt 的图全揪出来堵上这是最低标准也是收益最高的一步再逐步区分装饰与信息、给关键图表补文字替代。哪怕只做到第一步对那些戴着耳机听你页面的用户来说已经是天壤之别了。图片是网页里最容易被无障碍遗忘的角落但它其实是最好补的一块——很多时候就差一个认真写的alt。

相关新闻

【Springboot毕设全套源码+文档】基于springboot考研学生在线学习与交流系统的设计与实现(丰富项目+远程调试+讲解+定制)

【Springboot毕设全套源码+文档】基于springboot考研学生在线学习与交流系统的设计与实现(丰富项目+远程调试+讲解+定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/14 18:10:51阅读更多 →
开源OCR引擎Tesseract实战:从环境搭建到多语言识别

开源OCR引擎Tesseract实战:从环境搭建到多语言识别

1. Tesseract OCR引擎入门指南 第一次接触Tesseract时,我完全被这个开源OCR引擎的能力震撼到了。想象一下,你随手拍下一张报纸照片,几秒钟后就能得到可编辑的文字内容——这就是Tesseract带给我们的魔法。作为Google长期维护的开源项目&…

2026/7/14 18:10:51阅读更多 →
时间序列模型(四):ARIMA模型实战——从理论到Python代码实现

时间序列模型(四):ARIMA模型实战——从理论到Python代码实现

1. ARIMA模型基础概念 我第一次接触ARIMA模型是在分析电商平台的日销售额数据时。当时发现传统线性回归完全无法捕捉数据的波动规律,这才意识到时间序列数据的特殊性。ARIMA(Autoregressive Integrated Moving Average)作为时间序列分析的经典…

2026/7/14 18:10:51阅读更多 →
计算机毕业设计之基于springboot框架的中医养生小程序设计与实现

计算机毕业设计之基于springboot框架的中医养生小程序设计与实现

随着“互联网”思维的成功实践,各种领域也逐渐由传统的严格按流程、靠人力的制作方式进而转向智能化生产,显著提高了工作的效率与便捷性。然而,网络时代的快速增长同样带来了“信息过载”的问题,堆积如山等,成为用户筛…

2026/7/14 21:11:06阅读更多 →
计算机毕业设计之基于SpringBoot框架和javascrip技术的私人厨师预约网站

计算机毕业设计之基于SpringBoot框架和javascrip技术的私人厨师预约网站

随着大数据、人工智能的快速发展,传统的手工管理方式已难以满足现代用户的需求。为了提升工作效率、优化用户体验并降低运营成本,本研究设计并实现了一套基于Spring Boot的私人厨师预约网站。该系统充分利用Spring Boot框架的简洁性、高效性和易用性&…

2026/7/14 21:11:06阅读更多 →
我犯了六次错,才学会怎么用AI调试

我犯了六次错,才学会怎么用AI调试

我犯了六次错,才学会怎么用AI调试 引子 “AI最大的问题是什么?” 很多人会说:看不懂代码。 但真正的答案是——它看得太快,还没看懂就动手了。“你再检查一下,这个逻辑在其他平台都验证过了,没有这个问题。…

2026/7/14 21:11:06阅读更多 →
压电蜂鸣器EPT-14A4005P特性与TM4C1299KCZAD驱动方案

压电蜂鸣器EPT-14A4005P特性与TM4C1299KCZAD驱动方案

1. 压电蜂鸣器EPT-14A4005P的硬件特性解析EPT-14A4005P是Sanco Electronics推出的一款工业级压电蜂鸣器模块,其核心采用锆钛酸铅(PZT)压电陶瓷片。当施加交变电压时,陶瓷片会产生逆压电效应——即在电场作用下发生机械形变,通过振动膜片推动空…

2026/7/14 21:11:06阅读更多 →
计算机毕业设计之jsp玩具租赁管理系统

计算机毕业设计之jsp玩具租赁管理系统

随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,各行各业相继进入信息管理时代&#xf…

2026/7/14 21:11:06阅读更多 →
SAM 图像分割实战:自动 Mask、框提示、点提示与 COCO 对比

SAM 图像分割实战:自动 Mask、框提示、点提示与 COCO 对比

SAM 图像分割实战:自动 Mask、框提示、点提示与 COCO 对比 这篇教程根据我复现 SAM 图像分割流程时整理,重点演示自动 mask 生成、框提示分割、点提示分割,以及把 SAM 结果和真实 COCO 标注做对比。 SAM 是很多分割工作流的基础模块。本文更…

2026/7/14 21:06:06阅读更多 →
VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异当你在VSCode中启动一个新的TypeScript项目时,第一个技术决策往往从安装方式开始。这个看似简单的选择——全局安装还是项目本地安装——实际上会深刻影响你的开发流程、团队协作和…

2026/7/14 4:56:14阅读更多 →
智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手 【免费下载链接】zhihuishu 智慧树刷课插件,自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 智慧树刷课插件是一款专为智慧树在线教育平台设计的Chrome浏…

2026/7/14 2:55:05阅读更多 →
Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 你是否在GOG或Epic Games Store购买了心仪的游戏…

2026/7/14 6:17:41阅读更多 →
【Cursor数据库安全红线】:自动执行SQL前必须校验的6项权限策略,金融级项目已强制落地

【Cursor数据库安全红线】:自动执行SQL前必须校验的6项权限策略,金融级项目已强制落地

更多请点击: https://intelliparadigm.com 第一章:Cursor数据库安全红线概览 Cursor 作为一款基于 AI 的智能编程助手,其本地数据库(SQLite 存储)承载着用户代码片段、会话历史、自定义规则及敏感上下文信息。理解其安…

2026/7/14 0:03:18阅读更多 →
【Notion AI写作避坑白皮书】:基于127份真实用户失败案例,总结6大致命误用陷阱

【Notion AI写作避坑白皮书】:基于127份真实用户失败案例,总结6大致命误用陷阱

更多请点击: https://codechina.net 第一章:Notion AI写作辅助的底层能力边界认知 Notion AI 并非通用大语言模型的直接封装,而是基于 Llama 系列与自研微调模型构建的轻量化推理服务,其输入上下文窗口严格限制在 8192 token&…

2026/7/14 0:03:18阅读更多 →
AI Agent数据越界行为如何被精准溯源?——基于GDPR/CCPA双合规的5层审计框架实战指南

AI Agent数据越界行为如何被精准溯源?——基于GDPR/CCPA双合规的5层审计框架实战指南

更多请点击: https://kaifayun.com 第一章:AI Agent数据越界行为的合规性挑战与溯源必要性 AI Agent在自主执行任务过程中,可能因提示注入、上下文污染或权限配置缺陷,无意或有意访问、缓存、传输受保护数据(如PII、G…

2026/7/14 0:03:18阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/14 15:07:30阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/14 4:45:36阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/14 2:42:17阅读更多 →