ruby表示を改善する JavaScript。
前回の記事で積み残された改善希望点、
を、JavaScript を使って解決してみます。
順序が逆になるけれど、まずふたつめの問題。
表示サンプルページを見ていただければ判るように、Firefox / Opera 以外のブラウザでは、HTML5形式の記述(rb,rbc,rtc要素なし)であれば、思ったようなルビ表示が実現できますね。
ということで、
という処理でよかろう。
次にひとつめの問題。こちらは
という感じで上手くいくのではなかろうか。
適用するスタイル、というのは前の記事でも引用させていただいた、
できたのが、これ → ルビ表示改善 JavaScript : ruby_enabler.js
どんな動作をするかというと、
ページにアクセスして来た人が「JavaScript 無効」の場合はスタイルシートのみによって「何も対策しないよりマシ」な表示をし、「JavaScript 有効」の場合には、使用しているブラウザごとに、ほぼマトモなルビ表示を実現します。
Firefox に適用するスタイルは、
で、これだけだと、line-height の値によっては、ルビ対象文字列とルビとが無茶苦茶離れて表示されてしまうので、ruby_enabler.js では、個々の rt / rtc タグ に対して、
わはは。強引。
さらに、上のスタイルだと Opera で見た時にルビの上下位置が周りの文字と全く合わないので、Opera からの閲覧時には以下のスタイルを追加。
そんなわけで、Firefox たちが ruby に対応するまでの暫定措置として、ruby_enabler.js をお試しいただければと。
→ ルビ表示改善 JavaScript : ruby_enabler.js
- Firefox / Opera でも綺麗にルビを表示したい。
- HTML4 / HTML5 の記述の違いに関わらず、きちんとルビを表示したい。
順序が逆になるけれど、まずふたつめの問題。
表示サンプルページを見ていただければ判るように、Firefox / Opera 以外のブラウザでは、HTML5形式の記述(rb,rbc,rtc要素なし)であれば、思ったようなルビ表示が実現できますね。
ということで、
- Firefox / Opera 以外のブラウザでの閲覧時には、
- HTML4 形式で記述された ruby タグ内部を HTML5 形式の記述に変換する。
- はじめから HTML5 形式で記述されていれば何もしない。
- internet explorer 8 からのアクセス時には、
- たまたま最初からなんとなく良い感じで表示されるので、何もしない。
次にひとつめの問題。こちらは
- Firefox / Opera からのアクセス時には、
- まず ruby タグ内を HTML4 形式の記述に変換して、
- その上で ruby 要素、ruby 内要素にスタイルを適用する。
適用するスタイル、というのは前の記事でも引用させていただいた、
ruby 要素に display : inline-table; を指定して、さらに ruby 内要素をインラインテープル内要素として組み立てる。そして ruby 要素に指定した vertical-align で縦方向の表示位置を合わせる。
という方法をアレンジしてみます。(前の記事で「この方法は上手くない」と書きましたが、スタイル適用対象を Firefox / Opera に限定して、ソースが必ずHTML4形式で記述されているとするならば、現在でもかなり有用です)できたのが、これ → ルビ表示改善 JavaScript : ruby_enabler.js
どんな動作をするかというと、
- IE 8 からのアクセス時 → 何もしない。
- IE 9 / Safari / Chrome から → RUBY要素内を「HTML5での書式」に書き変える。
- Firefox / Opera から → RUBY要素内を「HTML4での書式」に書き換えてスタイルを適用。
Firefox に適用するスタイルは、
ruby{と、こんな感じ。これで、表示フォントの種類やサイズ、line-height の値や lang属性の値に関わらず、ルビとその前後の文字との上下位置がピッタリ合います。ただし「Firefox からの閲覧で、ruby の書式が HTML4 / XHTML1.1 形式(rb,rbc,rtcタグあり)」の場合のみ。これをこのままスタイルシートに書いてしまうと、他のブラウザで予期しない不体裁が起こることがあります。
display:inline-table;
text-align:center !important;
text-indent:0 !important;
margin:0 !important;
padding:0 !important;
vertical-align:bottom;
}
ruby>rb,ruby>rbc{
display:table-row-group !important;
}
ruby>rt,ruby>rtc{
display:table-header-group !important;
font-size:8px;
line-height:1em !important;
letter-spacing:0 !important;
font-weight:normal !important;
font-style:normal !important;
}
rbc>rb{
display:table-cell !important;
}
ruby_enabler.js では、スクリプト内でブラウザの種類・ルビの書式のパターンを適切に切り分けて対処しています。
で、これだけだと、line-height の値によっては、ルビ対象文字列とルビとが無茶苦茶離れて表示されてしまうので、ruby_enabler.js では、個々の rt / rtc タグ に対して、
-moz-transform:translate(0,y);というスタイルを適用して、ルビ対象文字列との距離を調整しています。
/* yは個々の rt / rtc について計算される */
わはは。強引。
さらに、上のスタイルだと Opera で見た時にルビの上下位置が周りの文字と全く合わないので、Opera からの閲覧時には以下のスタイルを追加。
ruby{vertical-align:0.9em;}こちらはフォントの種類やサイズ、それに表示する時の値の丸め誤差などなどによって、若干ズレてしまう場合がありますが、まぁよかろう。
ruby,ruby>rb,ruby>rbc,rbc>rb{line-height:1em !important;}
そんなわけで、Firefox たちが ruby に対応するまでの暫定措置として、ruby_enabler.js をお試しいただければと。
→ ルビ表示改善 JavaScript : ruby_enabler.js
sounisi5011
Operaの場合、-o-table-baseline プロパティを使うことでズレを上手いこと修正できるようです。
http://qiita.com/sounisi5011/items/a74472bd1155710727d4#%E6%97%A7operaopera-15%E6%9C%AA%E6%BA%80
このため、Opera用のスタイルは以下で十分かもしれません。
ruby{
vertical-align:baseline;
-o-table-baseline:2;
}
tyzからsounisi5011への返信
ありがとうございます。
もういろいろ面倒くさかったので、
→ http://freefielder.jp/blog/2015/02/inline-table-vertical-align.html
こんな方法を採用してみました。