必须将 lang 属性写在 标签上且值为符合 bcp 47 标准的 zh-cn,否则屏幕阅读器、搜索引擎和浏览器翻译功能将无法正确识别语言;局部多语言内容需用语义标签显式声明 lang,不可依赖猜测或 js 动态补全。

lang 属性写在 上,且值为 zh-CN 这类标准格式,是改善辅助技术体验最直接、最不可跳过的一步。 其他位置写、写错格式、或只靠 JS 动态补,基本等于没做。
必须写在 标签上, 或其他元素上无效
屏幕阅读器(如 NVDA、VoiceOver)、搜索引擎、浏览器翻译按钮,全部只读取 这个声明。写在 里,它们就当没看见。
- 常见错误现象:
document.body.lang = "zh-CN"后 VoiceOver 仍用英文朗读;Chrome 地址栏不出现翻译按钮;Google Search Console 报“未指定语言” - SSR 框架(如 Next.js)需在根布局中硬编码:
,不能等 JS 加载完再 patch - 动态切换语言时,仅改
document.documentElement.lang不够,还需触发重读(例如document.title = document.title),但首屏已失效的部分无法挽回
lang 值必须符合 BCP 47 标准,zh-CN 是中文首选
写成 zh、zh_cn、ZH-CN、Chinese 都会被浏览器和辅助技术静默忽略——不是报错,而是彻底不认。
-
zh-CN是事实标准:兼容所有主流 AT,触发简体中文 TTS 引擎,支持拼音标注、字体 fallback、连字符(hyphens: auto) - 别用
zh:iOS VoiceOver 可能跳过中文语音合成,降级为逐字拉丁拼读(如“北京”读作 “B-e-i-j-i-n-g”) - 繁体场景用
zh-TW或zh-HK,不用zh-Hant(部分旧版 JAWS 不识别)
局部多语言内容要显式包裹,不能靠猜测
浏览器不会自动判断哪段是英文引文、哪行是代码术语。不加 lang,就全按根语言处理,后果是语音错、拼写检查关、连字符断错。
- 外文引文用语义标签 +
lang:<blockquote lang="en">The term “accessibility”</blockquote> - 代码块/术语可加
lang:<code lang="en">useState、<pre class="brush:php;toolbar:false;" lang="bash">curl -X POST</pre> - 避免滥用:
<span lang="en">API</span>没问题,但不要给每个英文单词都套一层——DOM 膨胀,可访问性树构建变慢 -
translate="no"和aria-label是补充,不是替代:lang解决“是什么语言”,aria-label解决“该怎么读”
容易被忽略的性能与工程细节
看似只是加个属性,实际影响解析时机、AT 初始化、甚至 SSR 渲染链路。
- 辅助技术在 HTML 解析早期就读取
document.documentElement.lang,JS 后期修改对已激活的朗读会话基本无效 - 第三方脚本插入的内容(如评论框、广告位)若没带
lang,会继承根语言,导致混排文本语音错乱 - CI 工具(如 htmlhint)应配置
attr-req-lang规则,强制检查是否含合法lang - 服务端输出时务必做 XSS 过滤:
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











