网页语言声明需精准设置:根元素必须用BCP 47标准值(如zh-CN)声明lang,多语言内容须局部覆盖,SPA/i18n切换时同步更新lang属性,并通过工具验证生效。

网页语言声明(lang 属性)是无障碍访问的基础支撑之一,它直接影响屏幕阅读器对发音、断词、语调的处理准确性。优化的关键不是“加上就行”,而是确保声明精准、层级合理、动态一致。
明确设置根元素的 lang 值
必须在 <html> 标签中声明主语言,且使用符合 BCP 47 标准的合法值(如 zh-CN、en-US、ja),不能写成 zh 或 chinese 等非标准形式。
-
<html lang="zh-CN">✅ 正确,地域细化,利于方言语音引擎适配 -
<html lang="zh">⚠️ 可识别但不推荐,缺少地域信息可能导致拼音/声调偏差 -
<html lang="Chinese">❌ 错误,不符合规范,多数屏幕阅读器会忽略或报错
多语言内容需局部覆盖声明
当页面中存在明确切换语言的段落(如外语引文、双语菜单、代码注释中的英文术语),应在对应容器元素上用 lang 显式标注,避免继承根语言导致朗读错误。
- 用
<blockquote lang="en">The only limit is your imagination.</blockquote>—— 屏幕阅读器自动切英语发音规则 - 避免把整页设为
zh-CN后,在英文术语旁加span却不声明lang="en"—— 这会导致“CSS”被读成“西西斯”而非 “C-S-S” - 嵌套时支持继承与覆盖:
<div lang="fr"><p lang="en">Hello</p></div>中,p优先按en解析
动态内容与框架需同步更新语言属性
单页应用(SPA)或国际化(i18n)系统切换语言时,仅改文本不改 lang 是常见疏漏。屏幕阅读器不会主动感知 DOM 文本变化,必须显式更新语言声明。
立即学习“前端免费学习笔记(深入)”;
- 切换语言后执行:
document.documentElement.lang = 'ja' - React/Vue 应用中,确保根节点
lang随 locale store 变化而响应式更新 - 服务端渲染(SSR)页面,务必让模板引擎将当前语言注入
<html lang="{{locale}}">
验证是否生效
不要依赖肉眼检查。可用以下方式确认:
- 浏览器开发者工具中查看
<html>元素是否带正确lang属性 - 用 NVDA + Firefox 或 VoiceOver + Safari 实际朗读含外文的段落,听是否切换语种
- 运行 axe DevTools 扫描,检查 “
page-has-lang” 和 “html-lang-valid” 规则是否通过



















