日语HTML竖排需writing-mode: vertical-rl配合text-orientation: upright、font-feature-settings: "vert", "vkrn"及lang="ja",并使用支持字体和无单位line-height。

HTML 做日语竖排,核心就一条:用 writing-mode: vertical-rl,但直接加这行往往不顶用——缺字体、缺标点挤压、缺换行控制,三者少一个,排版就“看起来像日语,读起来很别扭”。
vertical-rl 是基础,但必须配合 text-orientation
单纯设 writing-mode: vertical-rl 只让文字从上到下、右到左排列,汉字和假名能立住,但拉丁字母、数字、标点会横着躺平,破坏视觉节奏。必须加 text-orientation: mixed(默认值)或更严格的 text-orientation: upright:
div.ja-vertical {
writing-mode: vertical-rl;
text-orientation: upright; /* 让英文字母、数字也竖直显示 */
}注意:text-orientation: upright 在 Safari 15.4+ 和 Chrome 101+ 才稳定支持;旧版本 Safari 会忽略它,字母仍横排——这不是 bug,是规范兼容性现实。
日语标点不能“自动避让”,得靠 font-feature-settings
竖排时,句号。、逗号、、括号()等需要自动旋转并贴紧右侧(传统“禁则处理”),但浏览器默认不干这事。得启用 OpenType 特性:
立即学习“前端免费学习笔记(深入)”;
-
font-feature-settings: "vert":启用垂直排版专用字形(如竖排句号) -
font-feature-settings: "vkrn":启用竖排字距调整(比如「。」和前一个字的间距)
实操建议写成:
div.ja-vertical {
font-feature-settings: "vert", "vkrn";
/* 注意:需搭配支持这些特性的日文字体,如 "Hiragino Mincho ProN", "Yu Mincho", 或 Noto Serif JP */
}没配对字体?font-feature-settings 就是摆设。Mac 上 "Hiragino Mincho ProN" 基本可用;Windows 需确认是否装了 "MS Mincho" 或 "Yu Mincho"(Win11 自带 "Yu Mincho")。
生成可在 deepbi 沙箱 iframe 内运行或作为独立文件运行的交互式 HTML 页面,使用 `window.deepbi` JS SDK 实现数据查询、空间管理、文件浏览及用户操作。当用户提出以下需求时启用该能力: - 创建 KPI 仪表盘、数据表格、文件浏览器、成员列表、管理页面; - 明确要求“转成 dhtml”、“转译成 HTML”、“把 XX 页面转成……”、“控制台页面”、“管理后台”、“DeepBI 页面迁移”; - 提及位于 `apps/console/src/featur
换行和禁则处理只能靠 lang + 浏览器原生逻辑
日语竖排有严格禁则:句号后不能换行、括号不能折在开头/结尾、连字符不能孤立在行首……这些不能靠 CSS 手动控制,全依赖浏览器对 lang="ja" 的内置断行算法。
- 务必给根元素或容器加上
lang="ja" - 避免用
<br>强制换行——它会打断浏览器的禁则判断 -
white-space: normal(默认)是唯一可靠模式;white-space: pre-wrap会绕过日语换行规则
示例结构:
<div class="ja-vertical" lang="ja"> <p>これは日本語の文章です。句点の後には改行しません。</p> </div>
如果用了 lang="zh" 或漏掉 lang,Chrome/Firefox 会按中文规则断行(允许句号后断),结果就是标点孤悬行首——这种错误极难排查,因为 HTML 看不出问题。
移动端 iOS Safari 的 line-height 行高必须用无单位数值
iOS Safari 在竖排下对 line-height 解析异常:若写 line-height: 1.6em 或 line-height: 24px,行距会崩坏(过大或塌陷)。唯一稳妥写法是:
div.ja-vertical {
line-height: 1.6; /* 无单位,纯数值 */
}这个坑没有报错,也没有 warning,只在真机上看到行与行粘连或飞散。Android Chrome 和桌面端相对宽容,但为了一致性,所有竖排场景都应统一用无单位值。
真正麻烦的不是写几行 CSS,而是字体加载、lang 属性遗漏、iOS 行高陷阱这三处——它们不报错,却让排版在某个设备上突然“不像日语”。上线前至少要在 iOS Safari 和 Chrome for Mac 各测一遍实际文本渲染效果。


















