縦書き Web の実装(writing-mode・ルビ・圏点・縦中横・禁則)
一言まとめ
writing-mode: vertical-rl は 97% 対応だが、ルビ・圏点・縦中横・ぶら下げ組はブラウザ差が大きい。hanging-punctuation は Safari のみ、text-combine-upright の digits は未実装、iOS Safari は scroll-snap で慣性スクロールが止まる。
調査時点: 2026-04。フォントのライセンスとサブセット化は 日本語 Web フォントのライセンスとサブセット化 に分けた。
writing-mode: vertical-rl
- グローバルサポート率 97%(Chrome 8+、Safari 5.1+、Firefox 41+、Edge 12+)。
text-orientation:mixed(CJK 直立・ラテン 90 度回転、既定)とuprightは Chrome 48+ / Firefox 41+。sidewaysは Firefox 44+ のみ。sideways-rl/sideways-lrは Safari 18.4 から。writing-modeは<html>ではなくコンテンツコンテナ(<main>や<div>)に付ける。Astro の View Transitions が<html>属性をリセットする問題を避けられる。
| ブラウザ | 既知の問題(2026-04) | 状態 |
|---|---|---|
| Firefox | 縦書き要素を margin: auto で中央寄せすると左に寄る | 未修正。Flexbox ラッパーで回避 |
| Chrome | vertical-rl + Flex アイテム内でビューポートの x 軸リサイズに追従しない | 既知バグ |
| Safari(旧) | <td> に vertical-rl を当ててもセルが縦にならない(WebKit #65917) | 新版で修正済み |
| Safari 18.4+ | vertical-rl + SVG のバウンディングボックス計算、ネスト縦書き内の水平モード | 2025 に修正 |
ルビ(ruby)
- Safari 18.2(2024-12)で
ruby-positionがプレフィックスなしになり、over/under/inter-character、ruby-align、ruby-overhangが追加された。 - Safari 18.4 で縦書きの inter-character ルビが極端に小さくなるバグを修正。Safari 26.0 で
sideways-lrのルビ位置を修正。 - 実務: iOS Safari 18.4 以上なら
ruby-position: overで縦書きルビは安定。inter-characterは 18.4 未満で縮小するのでoverにフォールバックする。Android Chrome の縦書きルビ品質は実機確認が要る。
圏点(text-emphasis)
- 縦書きでは文字の右側に出る(横書きは上)。
lang="ja"の既定は胡麻点(sesame、U+FE45 / U+FE46)。 text-emphasis-positionのleft/rightは Safari 18.2 で追加。Safari 18.4 で句読点に圏点が付くバグを修正。- 胡麻点グリフを持たないフォントでは UA のフォールバックグリフになり見た目が変わる。収録は
fonttoolsで確認する。
縦中横(text-combine-upright)
text-combine-upright: allは 2022-03 以降 Baseline Widely Available。digits <integer>(2〜4 桁の ASCII 数字を自動で縦中横にする値)はどのブラウザも未実装。<span>でマークアップし、Markdown 変換なら remark / rehype プラグインで自動挿入する。組んだ幅が 1em を超えると UA が自動縮小する。
ぶら下げ組(hanging-punctuation)と禁則
hanging-punctuationは Safari のみ実装で Baseline 未達。CSS 単体での全ブラウザ対応はできない。- 代替:
budoux(Google、MIT)やvivliostyle(CSS 組版エンジン)。最低限の禁則はoverflow-wrap: break-word+word-break: normal+line-break: strict。
iOS Safari の横スクロール
- WebKit Bug #243582:
scroll-snap-typeを設定すると iOS Safari の慣性スクロールが無効になる。P2・未修正(2026-04-16 にテストケース追加)。 - 章・記事単位のスナップに
scroll-snap-type: x mandatoryは使わない。overflow-x: scrollに留めるか JS で代替する。-webkit-overflow-scrolling: touchは廃止済みで不要。重なる要素には明示的にz-indexを付ける(未設定だとスクロールイベントを横取りする)。
ライブラリ(2026-04 時点)
- Astro 公式テーマギャラリーに縦書き専用テーマはない。既存テンプレート(astro-paper、fuwari など)は横書き前提。
tategaki(Denkiame、MIT、TypeScript):writing-modeの付与、CJK / Latin のスパン分割、Punctuation Squeeze、text-combine-upright、OpenType のvhal/fwidを扱う。DOM 操作ライブラリなので、SSG ではclient:loadか remark / rehype プラグイン化の検証が要る。vivliostyle(Apache 2.0)は電子書籍向け CSS 組版エンジンとして活発。jQuery.tategakiなどは事実上停止。
関連
更新履歴
- 2026-04-19: 初版(ローカル調査ノート)
- 2026-10-17: Wiki へ移植、概念ページとして再構成
出典
- https://caniuse.com/css-writing-mode
- https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Properties/text-orientation
- https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Properties/text-combine-upright
- https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Properties/hanging-punctuation
- https://webkit.org/blog/16301/webkit-features-in-safari-18-2/
- https://webkit.org/blog/16574/webkit-features-in-safari-18-4/
- https://webkit.org/blog/17333/webkit-features-in-safari-26-0/
- https://bugs.webkit.org/show_bug.cgi?id=243582
- https://github.com/Denkiame/Tategaki
同じトピック — Web
- 単一画面の Canvas ツールのスタック選定(vanilla TS / Svelte / Preact と PWA ツーリング)
- DAM カラオケ検索(clubdam)の挙動と制約
- Core Web Vitals と画像最適化
- favicon の最小構成(SVG + ICO + apple-touch-icon + manifest)
- フロントエンドのフレームワークとツールの動き(2025)
- HTML-in-Canvas API
- HTML-in-Canvas の実現性(a11y・性能・セットアップ・シェーダー)
- iOS Safari で canvas の画像を保存させる(download 属性 / Web Share / 長押し)
- 日本語 Web フォントのライセンスとサブセット化
- 個人サイトのライブウィジェットと外部 API の制限
- モダン CSS / Web API の対応状況(2025-2026)
- OPFS(Origin Private File System)
- Google Places API のキーの守り方(ブラウザ露出 vs サーバ中継)
- iOS の PWA 制限
- 機能別 React / TS ライブラリ対応表(2026-04 時点)
- URL 長の上限と日本語の URL エンコード膨張
- 書き出すテキストファイルの UTF-8 BOM と Markdown 継続行
- PWA の Web Share Target(Android)の実測と落とし穴
- WebAssembly(Wasm)
- YouTube oEmbed で動画タイトルとチャンネル名を取る