aria-placeholder不是w3c标准属性,浏览器不识别、屏幕阅读器不朗读、无障碍工具忽略;正确做法是用placeholder配合aria-label或aria-labelledby提供可访问名称。

aria-placeholder 不是标准 HTML 属性,**浏览器不识别、屏幕阅读器不朗读、无障碍检测工具会忽略它**。试图用它替代 placeholder 或补充语义,只会让占位提示在辅助技术中彻底消失。
为什么不能用 aria-placeholder
W3C ARIA 规范里根本不存在 aria-placeholder 这个属性。它既不是 ARIA 1.1/1.2 定义的 state,也不是 property,更不是 role。所有主流屏幕阅读器(NVDA、JAWS、VoiceOver)都不会解析或播报它。你写上 aria-placeholder="请输入邮箱",效果等同于没写。
- 它不会出现在可访问性树(Accessibility Tree)中
- 它无法被键盘用户或语音控制软件感知
- axe、Lighthouse 等检测工具会直接报“未知 ARIA 属性”警告
正确做法:用 placeholder + aria-label 或 aria-labelledby
占位符文本本身属于内容提示,必须由 HTML 原生承载;而无障碍名称(accessible name)则需通过语义化方式暴露给辅助技术。两者要配合,不能互相替代。
文章转信息图。将文章/笔记转化为手机可读的 HTML 信息图,自动匹配视觉风格。触发场景:文章转图、笔记转图、信息图、转小红书图、做张图、可视化这篇文章、文生图。
- 有可见标签(比如旁边有“邮箱”文字)→ 用
aria-labelledby指向那个id,placeholder只作视觉提示 - 纯图标输入框、筛选框、搜索按钮旁无文字 → 必须用
aria-label提供明确功能描述,placeholder可保留但不作为唯一依据 - 绝对不要只靠
placeholder:它在输入后消失,且部分屏幕阅读器(尤其旧版 JAWS)默认不读 placeholder
示例(带筛选的表格列):
<th scope="col">姓名</th><br><tr class="filter-row"> <br><td><input type="search" placeholder="按姓名筛选…" aria-label="筛选姓名列"></td> <br> </tr>
自定义输入组件(如封装的 <myinput></myinput>)怎么处理
如果你用 Web Components、React、Vue 封装了输入框,关键不是“加什么 ARIA”,而是确保最终渲染出的 <input> 元素具备合法的无障碍属性组合。
- 组件 props 应接受
ariaLabel或labelId,透传到内部<input>的aria-label或aria-labelledby - 禁止在组件根元素(比如
<div class="my-input">)上设 <code>role="textbox"后再忽略原生<input>的语义——这会让焦点和名称分离,导致屏幕阅读器读不到 label - 如果组件内部没有真实
<input>(比如用contenteditable实现),那才需要role="textbox"+aria-label+aria-multiline等完整组合,但这是高阶场景,95% 的“自定义输入”其实不该走这条路
最常被跳过的其实是 aria-describedby 配合错误提示——当输入无效时,仅靠视觉红框不行,必须把错误文案的 id 通过 aria-describedby 关联到输入框,否则屏幕阅读器用户根本不知道哪里错了。这事关表单是否真正可用,不是锦上添花。










