ruby标签本身不触发css vertical-rl排版,其内部rb与rt仍保持水平相对位置;竖排需手动用position: absolute或transform重置rt定位,或改用svg模拟以实现精确控制。

ruby标签本身不触发CSS vertical-rl排版
HTML ruby 是语义化注音标签,用于标注汉字读音(如日文假名、拼音),它生成的是「基础文本流中的内联注解结构」,不是独立排版容器。即使给 ruby 元素设 writing-mode: vertical-rl,浏览器仍按默认横向流解析其内部结构:即 rb(基文)和 rt(注音)仍保持水平相对位置,不会自动转为竖排对齐。常见错误现象是:注音挤在字右侧、换行错乱、rt 被截断或重叠——根本原因是 ruby 的布局逻辑与 writing-mode 不正交。
vertical-rl + ruby 需手动重置 rt 的定位
要让 ruby 在竖排上下文中正确显示(例如古籍中汉字右旁加竖排假名),必须放弃默认渲染,用 CSS 强制干预 rt 的位置:
- 父容器设
writing-mode: vertical-rl,同时确保font-variant-east-asian: ruby已启用(部分字体需此才能正确识别注音宽度) -
rt必须脱离文档流:position: absolute或transform: translateX(),否则它会跟随rb一起被 vertical-rl 拉长,导致高度失控 - 竖排时注音应出现在汉字「上方」而非右侧,所以
rt的top或transform偏移值需基于line-height和字体实际 ascent 计算,不能硬写top: -1em - 避免用
display: block改rt,它会破坏 ruby 的内联语义,导致屏幕阅读器跳过注音
text-combine-upright 对 ruby 内容无效
text-combine-upright: all 只作用于连续的窄字符(如 ASCII 数字、拉丁字母),而 ruby 中的 rb 通常是汉字,rt 是假名或拼音,均不满足“可合并”的字符集条件。开发者工具里看到 text-combine-upright 显示为 none(即使写了),就是因为浏览器判定当前节点内无匹配字符。此时强行包裹 rb 或 rt 并设该属性,只会被忽略——不是 bug,是规范行为。
真正可用的竖排 ruby 方案只有 SVG 模拟
当需要稳定控制竖排注音的位置、间距和旋转角度(比如让假名顺时针转90°贴汉字左侧),唯一可靠路径是放弃原生 ruby,改用 SVG 手动绘制:
- 每个汉字用一个
<text x="20" y="40">漢</text> - 对应假名用独立
<text x="10" y="30" transform="rotate(-90 10,30)">かん</text>,精确控制锚点 - 监听用户选中事件时,需用
getScreenCTM()+inverse()反算坐标,模拟点击穿透 - 若需支持复制,得额外加
aria-label或隐藏的span同步文本内容
复杂点在于:注音和基文字体大小、字重、字距无法自动同步;不同字号下,SVG 中的 y 偏移必须动态重算——这恰恰是原生 ruby 被设计来解决的问题,但它的代价是牺牲对 vertical-rl 的精细控制。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











