CSSで、ルビの位置とそろえ方を変える方法

​​2026年11月14日​CSS​HTML,Playwright,日本語組版

ルビ(ふりがな)は、ブラウザーの初期設定では文字の上に出ます。CSS の ruby-position に under を書くと、ルビを文字の下に移せます。ルビの文字を左に寄せるか、中央に置くか、均等に広げるかは、ruby-align で決めます。

css
ruby {
  ruby-position: under;
  ruby-align: center;
}
補足

検証環境は Ubuntu 24.04、Node.js 22.23.4、Playwright 1.63.0、Chromium 153 です。フォントは Noto Sans CJK JP を入れ、ページを Playwright で開いて、文字の位置を測りました。Chrome 以外のブラウザー、Windows や macOS に入っているフォントでの表示、2段のルビ(<rtc> を使うもの)は試していません。各ブラウザーの対応バージョンは、互換性データ(@mdn/browser-compat-data 8.1.8)の値です。ただし inter-character の行だけは、その後に更新された互換性データ(2026-11-08 時点の GitHub の main ブランチ)の値です。

ruby-position: under で、ルビを文字の下に置く

ruby-position は、ルビを親文字のどちら側に置くかを決めるプロパティです。親文字は、ルビを振る対象の文字(<ruby>紫陽花<rt>あじさい</rt></ruby> なら「紫陽花」)のことです。

ruby-position は子要素に継承されます。そのため、<ruby> に書いても、段落や body に書いても、中の <rt> に効きます。検証環境でも、ruby に under を書くと、rt の計算値は under になりました。

4つの表示を並べた画面。上の2つは横書きの「雨の日に紫陽花を見た」で、ruby-position: over では「あじさい」が紫陽花の上に、under では下に出ている。下の2つは縦書きで、over では「あじさい」が紫陽花の右に、under では左に出ている
ruby-position の over と under を、横書きと縦書きで表示した画面。ピンクの文字がルビ

縦書き(writing-mode: vertical-rl)では、over が右側、under が左側になります。検証環境で縦書きの段落を測ると、over のルビは親文字の右側に、under のルビは左側に出ました。CSS Ruby の仕様でも、over は横書きで上、縦書きで右と決められています。縦書きのページで「右」「左」を指定したいときも、書く値は over と under です。

ルビの分だけ、行の間隔が広がることがある

ルビは、行の上か下に場所をとります。line-height が小さいと、ルビのある行だけ間隔が広がります。

検証環境で、文字サイズ 20px、line-height: 1.5 の3行の段落を作り、2行目にルビを付けて、各行の位置を測りました。数字は、段落の上端から、その行の文字の上端までの距離です。

ルビ 2行目の位置 3行目の位置 段落の高さ
なし 30px 60px 90px
over(上) 32px 62px 92px
under(下) 30px 62px 92px

ルビが上にあると、1行目と2行目のあいだが2px広がりました。ルビが下にあると、2行目は動かず、2行目と3行目のあいだが2px広がりました。

同じ段落を line-height: 2 にすると、ルビが上でも下でも、行の位置は40px おきのままでした。行ごとに間隔がばらつくのを避けたいときは、ルビを付ける文章の line-height を大きめにします。

Chrome で使えるのは over と under だけ

仕様と MDN には、ruby-position の値がほかにもあります。alternate は、ルビを2段にしたときに、1段目を上、2段目を下のように交互に置く値です。inter-character は、台湾などで使われる注音符号のルビを、親文字の右側に縦に並べるための値です。

検証環境の Chromium 153 で CSS.supports() を使って調べると、受け付けたのは over と under だけでした。alternate と inter-character は false です。ruby { ruby-position: alternate; } と書いても無視され、rt の計算値は over のままでした。

何も指定しないときの計算値も over でした。仕様では初期値は alternate ですが、1段目のルビについては、alternate は over と同じ動きになると決められています。ルビが1段なら、どちらでも上に出ます。

互換性データでの対応状況は次のとおりです。

値 Chrome・Edge Firefox Safari
over・under 84 から 38 から 18.2 から
alternate 対応していない 88 から 対応していない
inter-character 対応していない 対応していない 一部(18.2 から)

接頭辞の付いた標準外の書き方の -webkit-ruby-position も、検証環境の Chromium 153 では inter-character を受け付けませんでした。受け付けたのは before と after で、計算値はそれぞれ over と under になりました。

ruby-align で、ルビの文字の並べ方を変える

ルビが親文字より短いとき、余った幅にルビの文字をどう並べるかを決めるのが ruby-align です。値は4つあり、仕様での初期値は space-around です。検証環境でも、何も指定しないときの計算値は space-around でした。

検証環境で、文字サイズ 40px の「紫陽花」(幅 120px)に「あじさい」を付けて、ルビの各文字が描かれた位置を測りました。ルビの文字サイズは、親文字の半分の 20px になりました。「あじさい」の幅は 80px なので、余りは 40px です。表の数字は、start のときの位置から、何px右に動いたかです。

ruby-align あ じ さ い 並び方
start 0 0 0 0 左に詰める
center +20 +20 +20 +20 詰めたまま中央に置く
space-between 0 +13 +27 +40 両端を親文字にそろえ、あいだを均等に空ける
space-around(初期値) +5 +15 +25 +35 あいだを均等に空け、両端にはその半分を空ける

space-between では、40px の余りが文字のあいだの3か所に約13px ずつ入りました。space-around では、余りを4つに分けた 10px が文字のあいだに入り、両端には半分の 5px ずつが入りました。

4段に並べた画面。各段の左は「紫陽花」に「あじさい」、右は「蝸牛」に「かたつむり」を付けたもの。start ではルビも親文字も左に寄り、center では中央に寄り、space-between では両端までいっぱいに広がり、space-around では両端に少し空きを残して広がっている
ruby-align の4つの値の比較。薄い水色の背景が ruby 要素の範囲(ルビはその上に描かれる)、ピンクの文字がルビ

ルビのほうが長いときは、親文字が並び直される

「蝸牛(かたつむり)」のようにルビのほうが長いときは、ruby-align は親文字の並び方を変えます。ルビは5文字で 100px、親文字は2文字で 80px なので、ruby 要素の幅は長いほうの 100px になり、親文字の側に 20px の余りができます。

検証環境で、親文字の2文字が描かれた位置を測りました。数字は、start のときから右に動いた量です。

ruby-align 蝸 牛
start 0 0
center +10 +10
space-between 0 +20
space-around(初期値) +5 +15

このとき、ルビの5文字の位置は、どの値でも変わりませんでした。初期値の space-around では、上の画像の右側のように、「蝸」と「牛」のあいだが少し空いて見えます。親文字を詰めたまま中央に置きたいときは、center を指定します。

英字のルビは、space-between でも中央に置かれる

検証環境で「東京」(80px)に「Tokyo」のルビを付けると、space-around でも space-between でも、文字のあいだは空かず、ルビ全体が中央に置かれました。描かれた位置は、どちらの値でも、左端から 12px〜67px で同じでした。

仕様では、ブラウザーが rt に初期設定で text-justify: ruby を当てることになっています。これにより、文字のあいだを空けてよいのは、漢字やかななどの文字どうしのあいだだけになります。英字どうしのあいだは空けないので、仕様の ruby-align の節にある例のとおり、英字のルビは中央にそろいます。

ruby-align はどこに書いてもよい

ruby-align も継承されます。検証環境では、rt に直接書いても、ruby に書いても、外側の p に書いても、同じ並び方になりました。サイト全体でそろえるなら、body などの外側に1回書けば足ります。

互換性データでの ruby-align の対応状況は、Chrome・Edge が 128 から、Firefox が 38 から、Safari が 18.2 からです。4つの値はどれも、同じバージョンから使えます。

​Posted by 86