ruby标签是严格遵循语义与DOM顺序的注音机制,rb与rt必须一一对应、不可交叉或倒置;混入普通文本、rt前置、多rb共用rt均会导致标注错乱;rp为兼容旧版Safari的必要降级安全带。

ruby 标签不是“加个拼音就能用”的装饰性标签,它是一套有严格语义和 DOM 顺序要求的注音机制。不按规范写,轻则拼音错位、漏标,重则被读屏软件跳过或整段失效。
rb 和 rt 的顺序与数量必须严格一一对应
浏览器按 DOM 节点顺序匹配:rb 是基字,rt 是对应注音,第一个 rb 绑定第一个 rt,第二个绑定第二个……不能交叉、不能省略、不能倒置。
-
ruby内混写普通文本(如<ruby>中<rb>国</rb><rt>guó</rt></ruby>)→ “中” 不参与标注,只有 “国” 被标 -
<rt>写在<rb>前面 → 拼音大概率贴到前一个ruby块的末尾字上 - 两个字共用一个
<rt>(如<rb>中</rb><rb>国</rb><rt>zhōng guó</rt>)→ 多数浏览器只给 “国” 标音,“中” 无注音
rp 标签不是可选项,而是降级安全带
现代浏览器(Chrome/Firefox/Edge/Safari 15.4+)即使没 rp 也能渲染拼音,但旧版 Safari(rt 内容裸露出来——比如显示成 “汉hàn” 而非带括号的 “汉(hàn)”。rp 就是为此兜底的空标签。
- 正确结构必须是:
<rb>字</rb><rp>(</rp><rt>pīnyīn</rt><rp>)</rp> -
rp本身不渲染内容,只在不支持ruby时触发括号包裹逻辑 - 不要用
span或 CSS 伪元素模拟rp,它需要原生语义才能被辅助技术识别
多音字和词组必须分字独立包裹
中文拼音标注是字级行为,不是词级。强行合并会导致 TTS 朗读错误、CSS 无法单独控制某字注音样式、也无法被语义化工具准确解析。
立即学习“前端免费学习笔记(深入)”;
- 错误写法:
<ruby><rb>长安</rb><rt>cháng ān</rt></ruby>→ 只有 “安” 被标,且 “cháng” 语义丢失 - 正确写法:连续两个
ruby块:<ruby><rb>长</rb><rp>(</rp><rt>cháng</rt><rp>)</rp></ruby><ruby><rb>安</rb><rp>(</rp><rt>ān</rt><rp>)</rp></ruby> - 如果某字有多个读音(如 “行”),需由业务逻辑决定用哪层
ruby,不能靠 JS 动态切换rt内容——那会破坏静态语义
最常被忽略的其实是语义完整性:一个 ruby 块必须完整包含 rb + rp + rt + rp,缺一不可;跨字合并、DOM 顺序错乱、省略 rp 这三类问题,在真实项目里几乎占了所有 ruby 渲染异常的 90% 以上。



















