縦書き(writing-mode)の深淵:インライン要素と「論理的」レイアウトの正解
Webフロントエンドの世界で、`writing-mode: vertical-rl` を触ったことはあるだろうか?
「ああ、日本語の縦書きね。簡単でしょ」と高を括っていると、いざ実装した瞬間にレイアウトが崩壊し、``や``、あるいは``タグの挙動が予想外の方向に跳ねて、冷や汗をかいた経験を持つ人は少なくないはずだ。
今日は、インライン要素が縦書き環境下でブラウザ内部でどう扱われ、我々エンジニアがどう「論理的な」制御を行うべきか、その勘所を紐解いていこう。
—
なぜインライン要素は「横」から「縦」へ回転するのか
まず前提として、ブラウザが `writing-mode` をどう解釈しているかを理解する必要がある。
CSSのレイアウトエンジンは、かつて「物理的(Physical)」な指定(`width`, `height`, `margin-top` など)が支配的だった。しかし、縦書きが登場したことで、Webは「論理的(Logical)」な指定へとシフトした。
`vertical-rl` が適用されると、ブラウザは座標軸を回転させる。
- Inline-axis (インライン軸): 文字が流れる方向(上から下へ)
- Block-axis (ブロック軸): 改行される方向(右から左へ)
ここで重要になるのが、`` や `` などのインライン要素が、この「回転した軸」に対してどう振る舞うかだ。物理的な `margin-top` は、縦書きの世界では「行の進行方向」に対する余白になってしまう。つまり、意図しない場所に隙間が空くのは、我々が「物理的な箱」として要素を捉え続けているからに他ならない。
実践:縦書き環境で「崩れない」インライン装飾
現場でよくあるミスは、`display: inline-block` を多用しすぎることだ。インライン要素を無理やりブロック化すると、縦書きの自然な文字の流れ(グリフの並び)を阻害する。
まずは、最も標準的でクリーンな実装パターンを見てほしい。
/ 縦書きのコンテナ設定 /
.vertical-container {
writing-mode: vertical-rl;
text-orientation: upright; / 数字や英字を縦書きにする場合は必須 /
font-family: serif;
line-height: 2;
}
/ インライン装飾のベストプラクティス /
.vertical-container strong {
/ 物理的な margin を避け、padding で調整する /
padding: 0 0.2em;
/ 縦書きでの強調は下線(text-underline-offset等)が美しい /
text-decoration: underline wavy #e67e22;
text-underline-offset: 4px;
}
/ aタグの挙動を安定させる /
.vertical-container a {
/ インラインのまま、リンク領域を確保する /
display: inline;
color: #3498db;
text-decoration: none;
border-bottom: 1px solid currentColor;
}
縦書きのデザインにおいて、強調したい箇所には、
無理な余白設定を避け、論理的なプロパティで
アプローチするのが正攻法だ。
知っておくべき「沼」ポイント
実務で私が後輩によく警告するのは、以下の2点だ。
1. `text-orientation: upright` の罠
デフォルトの `mixed` では、半角英数字は横向きに寝たまま表示される。縦書きで統一感を出したいなら `upright` が必須だが、これを使うと英単語が「一文字ずつ縦に積まれる」ことになる。英文が混在するテキストでは、可読性が著しく落ちる点に注意してほしい。
2. `margin` の論理プロパティへの置換
もしあなたがまだ `margin-top` や `margin-bottom` でインライン要素の調整をしているなら、今日から `margin-block` や `margin-inline` に書き換えてほしい。
- `margin-block` = 縦書き時の「行の進行方向」の余白
- `margin-inline` = 縦書き時の「行間」の余白
この書き方に慣れるだけで、縦書き・横書きの切り替えが一行の変更で済むようになる。
最後に:泥臭い検証の重要性
ブラウザのレンダリングエンジンは、縦書きに対して非常に慎重だ。特に `code` タグや `time` タグをインラインで使う際、フォントのベースラインが縦書き環境下でどうズレるかは、ChromeとSafariで微妙に異なることがある。
綺麗なコードを書くことは前提だが、最終的には「実機でのフォントレンダリングの確認」こそが、シニアエンジニアとしての最後の砦だ。
理論武装した上で、コードを書き、そして泥臭くブラウザの挙動を追う。このサイクルを回せるエンジニアこそが、複雑なレイアウト要件を涼しい顔でこなせる「真のスペシャリスト」だと私は信じている。
さて、次はどのプロパティの深淵を覗いてみようか? 現場からは以上だ。

コメント