CSS縦書き解説|writing-modeとtext-orientationでレイアウトを整える(デモ付き)

CSSで縦書きを実装する機会が以前より身近になっています。writing-mode
の普及とブラウザ対応の安定化により、以前よりもずっと扱いやすくなったことがその背景にあります。
本記事では、writing-mode
を中心に、縦書きに必要なCSSの基本と注意点を整理し、実際のコードを使ったデモ付きでその挙動を確認していきます。
初めて縦書きに触れる方にもわかりやすく、実務でそのまま使える知識として役立てていただければ幸いです。
まず押さえたい writing-mode の使い方
テキストを縦書きにしたいとき、最初に使うべきCSSプロパティが writing-mode
です。このプロパティを指定することで、文字の流れる方向をコントロールできるようになります。
CSSのデフォルトでは、横書きの「左から右、上から下」の流れ(horizontal-tb
)になっていますが、writing-mode
を変更することで、縦書きや右から左といった方向にも対応できます。
主な値とその意味
writing-mode にはいくつかの値がありますが、主要な3つを紹介します。
値 | 意味 |
---|---|
horizontal-tb | 横書き(左→右、上→下)※デフォルト |
vertical-rl | 縦書き(上→下、右→左) |
vertical-lr | 縦書き(上→下、左→右) |
日本語の縦書き表現でよく使われるのは vertical-rl
です。縦方向に文字を並べながら、列は右から左へと並んでいく、いわゆる新聞や書籍のスタイルですね。

日本語の縦書きに必要なのは vertical-rl
。まずはこれさえ押さえておけばOKです!
実際に使ってみよう
以下は、段落を縦書きに変更するシンプルな例です。
HTML
<div class="box">
<p class="text">このテキストは<br>縦書き表示のテスト用です。<br>文章の流れが上から下に変わると、<br>いつもと違った印象になります。</p>
</div>
CSS
.box {
display: flex;
justify-content: center;
border-radius: 8px;
background: #f9e8ed;
}
@media (min-width: 552px) {
.box {
padding: 40px 0;
}
}
@media (max-width: 551px) {
.box {
padding: 30px 0;
}
}
.text {
writing-mode: vertical-rl;
color: #c11a51;
font-weight: 700;
line-height: 1.5;
white-space: nowrap;
}
@media (min-width: 552px) {
.text {
font-size: 30px;
}
}
@media (max-width: 551px) {
.text {
font-size: 22px;
}
}
表示結果
このテキストは
縦書き表示のテスト用です。
文章の流れが上から下に変わると、
いつもと違った印象になります。
この例では、テキストが上から下に向かって表示され、列は右から左に移動していく縦書きになります。
さらに、文字の読みやすさを整えるために、line-height
を指定しています。縦書きにおける line-height
は、列と列の横方向の余白に影響し、文字の密集を防ぐ効果があります。
なお、このデモでは使用していませんが、letter-spacing
を使えば、文字の縦方向の間隔、つまり上下の詰まり具合も細かく調整できます。縦書きのテキストがやや窮屈に見える場合は、letter-spacing
の設定もあわせて検討してみると良いでしょう。
縦書きで気をつけたい高さと折り返し
縦書きにしたテキストは、高さが不足すると列が途中で折り返される場合があります。これは横書きで幅が足りないと改行されるのと同じように、縦書きでは高さが足りないことで発生します。
この「高さが足りない」は、要素の高さが足りない場合はもちろん、画面サイズが小さいことによって起こることもあります。
折り返しを成り行きに任せたい場合は、要素の高さを明示的に指定すると良いでしょう。一方で、「改行は自分で制御したい」「勝手に折り返されてほしくない」といった場合には、white-space: nowrap;
を指定することで、意図しない折り返しを防ぐことができます。
text-orientation で文字の向きを制御する
縦書きに設定しただけでは、すべての文字が自然に表示されるとは限りません。特に、英字や数字、記号などは、向きがそのまま横倒しで表示されてしまいます。
これを制御するのが、text-orientation
プロパティです。文字ごとの回転の有無や、直立表示にするかどうかを指定できます。
主な値とその挙動
代表的な指定値と、それによる文字の見え方の違いは以下の通りです。
値 | 意味・挙動 |
---|---|
mixed | 日本語は直立、英数字は横倒し(デフォルト) |
upright | すべての文字を直立(英数字も縦に並ぶ) |
sideways | すべての文字を横倒し(日本語も英字も) |
コード例と表示比較
以下の例では、3つの異なる text-orientation
の値を比較しています。
HTML
<div class="box">
<div class="column">
<p class="text mixed">MIXEDを適用した<br class="only-pc">縦書き表示のテスト用です。<br>XYZや123の表示にも注目です。</p>
</div>
<div class="column">
<p class="text upright">UPRIGHTを適用した<br class="only-pc">縦書き表示のテスト用です。<br>XYZや123の表示にも注目です。</p>
</div>
<div class="column">
<p class="text sideways">SIDEWAYSを適用した<br class="only-pc">縦書き表示のテスト用です。<br>XYZや123の表示にも注目です。</p>
</div>
</div>
CSS
.box {
display: flex;
flex-direction: row-reverse;
justify-content: center;
border-radius: 8px;
background: #f9e8ed;
}
@media (min-width: 552px) {
.box {
padding: 40px;
}
}
@media (max-width: 551px) {
.box {
padding: 30px;
}
}
@media (max-width: 551px) {
.box br.only-pc {
display: none;
}
}
.column {
flex: 1;
display: flex;
justify-content: center;
}
.text {
writing-mode: vertical-rl;
color: #c11a51;
font-weight: 700;
line-height: 1.5;
white-space: nowrap;
}
@media (min-width: 552px) {
.text {
font-size: 30px;
}
}
@media (max-width: 551px) {
.text {
font-size: 22px;
}
}
.text.mixed {
text-orientation: mixed;
}
.text.upright {
text-orientation: upright;
}
.text.sideways {
text-orientation: sideways;
}
表示結果
MIXEDを適用した
縦書き表示のテスト用です。
XYZや123の表示にも注目です。
UPRIGHTを適用した
縦書き表示のテスト用です。
XYZや123の表示にも注目です。
SIDEWAYSを適用した
縦書き表示のテスト用です。
XYZや123の表示にも注目です。
text-orientation
はデフォルトで mixed
が適用されますが、実務では upright
を明示することが多く、日本語の縦書きとして自然で読みやすくなります。
一方、sideways
はすべての文字が横倒しになるため、特殊な演出用途を除いて一般的な日本語縦書きには不向きです。
縦書きUIの組み方を実例で解説
縦書きのテキストを実際のレイアウトに落とし込むには、少し工夫が必要です。ここでは、よくあるパターンをデモ付きで紹介しながら、組み方のコツを解説します。
実例1:文字量の異なる縦書きを横中央に並べる
まずは、文字量の異なる縦書きテキストを横に並べるレイアウト例を見てみましょう。
HTML
<div class="wrapper">
<div class="box">
<p class="text">このテキストは<br>縦書き表示のテスト用です。<br>いつもと違った印象になります。</p>
</div>
<div class="box">
<p class="text">これは表示サンプル用です。</p>
</div>
<div class="box">
<p class="text">この文章はダミーであり、<br>内容に意味はありません。</p>
</div>
</div>
CSS
.wrapper {
display: flex;
flex-direction: row-reverse;
}
@media (min-width: 552px) {
.wrapper {
gap: 40px;
}
}
@media (max-width: 551px) {
.wrapper {
gap: 20px;
}
}
.box {
flex: 1;
display: flex;
justify-content: center;
border-radius: 8px;
background: #f9e8ed;
}
@media (min-width: 552px) {
.box {
padding: 40px 0;
}
}
@media (max-width: 551px) {
.box {
padding: 30px 0;
}
}
.text {
writing-mode: vertical-rl;
color: #c11a51;
font-weight: 700;
white-space: nowrap;
}
@media (min-width: 552px) {
.text {
font-size: 30px;
line-height: 1.5;
}
}
@media (max-width: 551px) {
.text {
font-size: 22px;
line-height: 1.3;
}
}
表示結果
このテキストは
縦書き表示のテスト用です。
いつもと違った印象になります。
これは表示サンプル用です。
この文章はダミーであり、
内容に意味はありません。
この例では、文字量の異なる縦書きテキストを横に並べて表示しています。それぞれのテキストは、親要素であるボックスに display: flex;
と justify-content: center;
を指定することで、横方向に中央揃えされています。
この設定により、文字数の違いによって縦の長さが異なっていても、各テキストが横方向に整ったバランスで配置され、自然な並びになります。
実例2:短い縦書きを上下左右中央に配置する
短い縦書きのテキストを、中央に配置するレイアウトの例です。
HTML
<div class="wrapper">
<div class="box">
<p class="text">縦書き表示のテスト用</p>
</div>
<div class="box">
<p class="text">表示サンプル用</p>
</div>
<div class="box">
<p class="text">ダミーテキスト</p>
</div>
</div>
CSS
.wrapper {
display: flex;
flex-direction: row-reverse;
}
@media (min-width: 552px) {
.wrapper {
gap: 40px;
height: 500px;
}
}
@media (max-width: 551px) {
.wrapper {
gap: 20px;
height: 400px;
}
}
.box {
flex: 1;
display: flex;
justify-content: center;
align-items: center;
border-radius: 8px;
background: #f9e8ed;
}
.text {
writing-mode: vertical-rl;
color: #c11a51;
font-weight: 700;
line-height: 1.5;
white-space: nowrap;
}
@media (min-width: 552px) {
.text {
font-size: 30px;
letter-spacing: 10px;
}
}
@media (max-width: 551px) {
.text {
font-size: 22px;
letter-spacing: 5px;
}
}
表示結果
縦書き表示のテスト用
表示サンプル用
ダミーテキスト
この例では、短い縦書きのテキストを、上下左右すべて中央に配置しています。親要素の .box
に display: flex;
、justify-content: center;
、align-items: center;
を指定することで、完全な中央揃えが実現できます。
さらに、letter-spacing
を設定することで、縦方向の文字の間隔(=横書きでいう字間)を広げ、空間にゆとりを持たせた印象的な見せ方になっています。
このような構成は、一語・二語の縦書きテキストを強調したい場面で役立ちます。タイトル的に配置したり、キービジュアルとして使う際などに効果的です。
ブラウザ対応とベンダープレフィクスの現在地
縦書きに関連する writing-mode
や text-orientation
といったプロパティは、現在のモダンブラウザで、いずれもベンダープレフィクスなしで問題なく使用できます。
かつては -webkit-
や -ms-
といったベンダープレフィクスを付けて対応する必要がありましたが、現在ではその必要はなく、シンプルな記述で安定して動作する環境が整っています。
実際に、筆者の手元でも主要ブラウザで動作確認を行いました。以下はその結果です。
筆者の確認環境と動作結果(2025年7月現在)
デバイス | OS・ブラウザ | 動作状況 |
---|---|---|
PC | Chrome(バージョン138) | 正常動作 |
Edge(バージョン138) | 正常動作 | |
Firefox(バージョン140) | 正常動作 | |
Safari(バージョン18.1) | 正常動作 | |
スマホ | iPhone 15(iOS 18.5、Safari) | 正常動作 |
Xperia(Android 13、Chrome) | 正常動作 | |
タブレット | iPad(第5世代、iPadOS 16.7、Safari) | 正常動作 |
まとめ:違和感が出たら個別対応を
本記事では、CSSの writing-mode
や text-orientation
を使って縦書きレイアウトを実現する方法と、その具体的な活用例を紹介しました。
現在では、これらのプロパティを活用することで、縦書きでもきれいにレイアウトできるようになってきました。それでも、実際に制作してみると、ときおり思わぬ表示のズレや間の違和感に遭遇することもあります。フォントやブラウザによるレンダリングの違いや、特殊な記号の扱いなどが原因です。
こうした背景から、実務では必要に応じて「個別に対応して整えていく」姿勢も大切です。表示のズレや余白の調整が必要な箇所が出てきたときは、<span>
で問題の文字だけを括って margin
や transform
で微調整するといった、ピンポイントの工夫が完成度を左右することもあります。
ぜひこの記事を参考に、縦書きを使ったデザインに挑戦してみてください。
押していただけると励みになります!