ルビを振るには。

CSSの小技として、CSSを用いてルビを振る方法です。

XHTML 1.1(HTMLの最新の公式規格ですが、現行推奨規格にはなっておりません)にはルビ系要素が追加され、文書中にルビ付きのフレーズを表示させる事が出来るようになりました。

しかし、インターネットエクスプローラ以外ではルビの表示を実装しておらず、わざわざスタイルシートを用いて表示スタイルを指定しなければなりません。

一方、現行推奨規格であるXHTML 1.0以前にはルビ系要素はありませんが、こちらもスタイルシートを活用して擬似的にルビを表示させる事は可能です。

ここでは、その方法を解説します。

ルビを振るには・目次。

実際にルビを付ける方法。

1. HTML側で、ルビをマークアップする。

XHTML 1.1のルビ系要素を用いる場合。

ルビを振りたいのであれば、XHTML 1.1文書型または現在策定中のHTML 5を撰んでルビ系要素としてマークアップするのが、当たり前ですが唯一真っ当なやり方です。

具体例として、XHTML 1.1で堀北(ほりきた)真希の「堀北」に平仮名で「ほりきた」と言うルビを振る場合には、以下のようにマークアップします。

<ruby><rb>堀北</rb><rp>(</rp><rt>ほりきた</rt><rp>)</rp></ruby>真希

つまり、

  1. ルビを振りたいテキストを<rb>要素としてマークアップし、
  2. ルビに対応出来ない環境で、ルビの代わりに使う括弧(二箇所)を<rp>要素としてマークアップし、
  3. ルビを<rt>要素としてマークアップし、
  4. 最後に関連するテキスト全体を<ruby>要素としてマークアップします。

XHTML 1.1以外の文書型を用いる場合(擬似的にルビをマークアップする方法)。

XHTML 1.1以外の文書型の場合、ルビ系要素は定義されておらず、従って擬似的にマークアップする必要があります。

この場合、適切な要素がそもそも存在しないので、<span>要素などを多用する事となるでしょう。

例えば、堀北(ほりきた)真希の「堀北」に平仮名で「ほりきた」と言うルビを振る場合には、以下のようにマークアップします。

<span class="ruby"><span class="rb">堀北</span><small class="rp">(</small><small class="rt">ほりきた</small><small class="rp">)</small></span>真希

ここでは、ルビテキストとルビに対応していない環境で代わりに用いる括弧を<small>要素としてマークアップしております。

  1. ルビを振りたいテキストを<span class="rb">要素としてマークアップし、
  2. ルビに対応出来ない環境で、ルビの代わりに使う括弧(二箇所)を<small class="rp">要素としてマークアップし、
  3. ルビを<small class="rt">要素としてマークアップし、
  4. 最後に関連するテキスト全体を<span class="ruby">要素としてマークアップします。

実は最新のCSS仕様に従ったブラウザなら、もっとスマートなマークアップでもルビを実現出来るのですが、生憎インターネットエクスプローラを含めた大半のブラウザが未対応となっております。これについては別文書に書いておきましたのでご覧下さい。

2. CSS側で、ルビをルビらしく表示するスタイルを当てる。

ここではポジショニングを用いた方法と、インラインテーブルを用いた方法を解説します。

ポジショニングを用いてルビを表示させる方法。

ポジショニングを用いてルビを振る場合、実はルビを振りたいテキストには特にスタイルを指定する必要はありません。

ですから、擬似的にマークアップした場合には<span class="rb">要素としてのマークアップは要らなくなります(XHTML 1.1のルビ系要素では文法上<rb>要素は必須なので省略出来ません)。

また、この方法は、オペラ 6.x〜7.xでもそれなりに表示されると言う利点もあります。

但し、ルビが短すぎる場合にはルビが左に偏ってしまったり、ルビが長過ぎる場合にはルビを振る対象テキストよりはみ出してしまうなど、表示が余り綺麗でないと言う問題もあります。

また、オペラでは最新の9.xでさえ、バグでルビが正しく表示されない場合があります。

ですので、インラインテーブルに対応しているユーザエージェントが増えている今日では、XHTML 1.1が使えない場合以外では余り好ましくはないかも知れません。

具体的には以下のようになるでしょう。

ruby {
    display: inline;
    position: relative;
    top: 0;
    bottom: 0;
    padding: 0;
    line-height: 1em;
    }

rp {
    display: none;
    }

rt {
    display: inline;
    position: absolute;
    top: -1em;
    left: 0;
    font-size: 50%;
    line-height: 1em;
    white-space: nowrap;
    text-indent: 0;
    }

a:link rt,
a:visited rt {
    text-decoration: none;
    }

原理としては、ルビとなる文字列がルビが掛かる文字列の真上に配置されるようにするだけです。

これを実現するには、最上位となる<ruby>要素の左上をポジショニングの基準点とする事で実現させます。

つまり、<ruby>要素に「position: relative;」プロパティを用いて、下位要素のポジショニングの基準点を<span class="ruby">要素の左上に移してしまいます。

後は、以下のように設定して行きます。

ルビの掛かる文字列(<ruby>要素直下の文字列)
特に改めてスタイルを当てる必要は無いでしょう。
ルビとなる文字列(<rt>要素)

また、<a>要素の内容となっている文字列にルビが付いている場合、このままではルビにもアンカーの下線が引かれるので、これを消してしまいます。

ルビ非対応環境向けの囲み記号(<rp>要素)
非表示にします。

インラインテーブルを用いた方法。

インラインテーブルは現在のところ、ファイヤーフォックスなどのもじら系ブラウザ, オペラ 8.x以降及びサファリなどで対応しております。

この方法だとかなり綺麗に表示されます。

また、XHTML 1.1を撰んでルビ関連のテキストをルビ系要素としてマークアップしている場合、インターネットエクスプローラ ウィンドウズ版5.5以降ではCSSのプロパティは対応していないものの、ルビ系要素のサポートに依り問題なくルビが表示されます。

但し、もじら系ブラウザではルビを振った箇所が他の箇所より上に僅かにずれて表示される事があります。

また、オペラでは 8.x以降で対応しているとは言え、8.xでは表示が崩れる事があるようです。

それでも、XHTML 1.1を撰んでいるのであれば、こちらの方が宜しいかと思われます。

具体的には以下のようになるでしょう。

ruby {
    display: inline-table;
    margin: 0;
    padding: 0;
    border: none;
    white-space: nowrap;
    text-indent: 0;
    vertical-align: text-bottom;
    }

rb {
    display: table-row;
    margin: 0;
    padding: 0;
    border: none;
    line-height: 100%;
    text-align: center;
    }

rt, a:link rt, a:visited rt {
    display: table-header-group;
    margin: 0;
    padding: 0;
    border: none;
    font: inherit;
    font-size: 50%;
    line-height: 100%;
    text-decoration: none;
    text-align: center;
    }

rp {
    display: none;
    }

原理としては、ルビの含まれた語句を一つのテーブルに見立てて、上にルビ、下にルビを振られる文字列が来るように配置すると言うものです。

但し、通常、テーブルは上から下に並べるようにしており、ルビテキストが後ろにある場合には上にルビを置く事は普通は出来ません。

ですが、テーブルの表示スタイルにはヘッダ部分, 本体部分及びフッタ部分の行或いは行グループと言う概念があり、ヘッダ部分は常に本体部分より上に配置される事とされております。

そこでちょっとトリッキーですが、

とする事で、上下関係を逆転させていると言う訳です。

具体的には、

与える事で、インラインテーブルを実現します。

後は括弧(<rp>要素)を非表示にするなどの工夫をしているだけです。

尚、インラインテーブルのテキスト中での配置をきちんとしないと、他のテキストと較べて上下にずれて見難くなるため、vertical-align: text-bottomプロパティでテキストの下に揃えるようにしておりますが、ファイヤーフォックスなどではなぜか上にずれてしまいます。

また、text-align: centerプロパティでインラインテーブルの内容(すなわち、ルビを振られるテキストとルビテキスト)を中央寄せに指定する事に依り、ルビの字数に関係なく綺麗に配置されるようになります。

実際にはどちらの方法が良いのか?

さて、ルビを実現するための二通りのスタイル定義方法を書きましたが、実際にはどちらが良いのでしょうか。

結論から言えば、以下のようになると思います。

XHTML 1.1文書型を撰んでルビ系要素としてマークアップしている場合

この場合は、インラインテーブルを用いた方法が綺麗に表示されて良いでしょう。

インラインテーブルをサポートしていないインターネットエクスプローラ ウィンドウズ版 5.5以降でもルビは表示されます。

但し、ファイヤーフォックスやオペラ 8.xなどでまだずれたりする事があるので、その事は考えておいた方が良いかも知れません。

XHTML 1.1以外でルビ系要素を用いていない場合(擬似的にマークアップした場合)

この場合は、インラインテーブルを用いた方法だとインターネットエクスプローラではインラインテーブルが使えない事からルビ表示が出来なくなるため、ポジショニングを用いた方法の方が確実でしょう。

但し、オペラでは最新版でも表示が崩れる場合があります。

しらぎくのウェブサイト作成入門サイトマップ

ページ外へのご案内。

marguerite.site@gmail.com