[ Tags :: CSS ]

CSSでルビ・タイプ2

1 of 212Next»
CSSのみでルビを実装するとした時、まあ、一番シンプルな考えをするのであれば、Ruby要素以下、関連のタグに対してスタイルを指定する方法ですね。IEを除けた指定をしておけば、IEでは独自実装のルビ表示が。他はIE6/7では未実装のdisplay:inline-table系を使った指定が使えるので、実に分かりやすい実装が出来ます。

弊害として考えられるのは、オリジナルでRuby要素関連にユーザスタイルシートを当てている場合くらいでしょうが、まあ、そんなにはいないでしょうね。


私が作っているルビCSSは、そこの弊害を回避する一つのアイディア(と呼べるほどのものではないですが)で、Ruby要素に指定するのではなくSPAN要素にクラスを指定して、そのクラスに同じスタイルシートを適用するというやり方。
ソースが非常に煩雑になって見づらいことこの上ないのですが、まあ、そこそこ安定します。

ネックは、IE6,7での表示ですね。
Ruby要素の独自拡張を実装しているからと言って、display:ruby-baseなんかを実装しているわけではないので、結局別の仕組みでIEでのルビを組まなければなりません。それがまた、スマートにはできないんですよねぇ……。絶対配置を使った非常に安直なやり方です。

両者を比べるなら明らかに前者ではあるんですが、イマイチ踏み切れません。


そんなわけで、ルビCSSの別タイプを考えてみました。IE6/7では動きません(笑
ツッコミどころ満載のアレではありますが…。
/*
*
* [Ruby CSS Type2 v1.0]
*
* Example : <span class="ruby"><abbr title="[ruby text]"> [ruby base] </abbr></span>
*
* CSS Author : BENIT
*
* OS : Windows XP
*
* Browser : Internet Explorer8
* Firefox3.0
* Opera9.5
* Safari3.1.2 for win
*
* Not support [IE6/7]
*
* Last Updata //2008-8-03// Added Type2
*
*/
span.ruby2 abbr[title] {
font-size: 100%;
border-bottom-style: none;
}

html>/**/body span.ruby2 {
line-height: 1;
text-align: center;
padding: 0;
display: inline-table;
}

html>/**/body span.ruby2 { vertical-align: -28%; } /* Firefox2.x */
html>/**/body span.ruby2 , x:-moz-broken { vertical-align: 110%; } /* Firefox3.0 */
html[lang*=""]>/**/body span.ruby2 { vertical-align: 110%; } /* Opera9.5 (, IE8 and Safari) */
*:first-child+html/**/>body span.ruby2 { margin-bottom : -4px; vertical-align: baseline; } /* IE8 */
html[lang*=""]:not(:nth-child(n)) body span.ruby2 { vertical-align: -20%; } /* Safari3.1.2 */

span.ruby2:hover{ background-color: #bbb; }

html>/**/body span.ruby2 > abbr:first-child {
line-height: 1.1;
white-space: nowrap;
margin: 0;
display: table-cell;
}
html[lang*=""]:not(:nth-child(n)) body span.ruby2 > abbr:first-child { display: inline-table; } /* Safari3.1.2 */

html>/**/body span.ruby2 > abbr:first-child:before {
font-size: 64%;
line-height: 1.2;
letter-spacing: 1px;
width: 100%;
display: table-caption;
content: attr(title);
}
*:first-child+html>/**/body span.ruby2 > abbr:first-child:before { display: table-header-group; } /* IE8 */
基本的な考えかたは従来私がやってきたルビCSSと同じっちゃ同じなんですが、記述方式が根本的に違います。
IE6/7では使えないcontentプロパティを使い、titile属性を生成要素として出力し、それをdisplay:table-captionとして上に乗っけています。
SPAN要素にクラスを指定するのは相変わらずですが、今回、中にはABBR要素を使ってみました。本来は略語の正式名を掲載するための要素ですが、まあ、超拡大解釈ということで(笑 DFN要素はスタイルきった時に全てのブラウザで斜体表示になって鬱陶しいから、最初考えたんですけど没にしました。ABBRだってSafariは確か斜体にしたはずですが、まあ、webkitを使ってスタイルをオフにすることは早々ないでしょう。別にSPAN要素にタイトルでもよかったんですが、こっちは少しでも短くしたかったので……(笑

……というのは建前で。
本当は、<ruby><rb title="ruby text">ruby base</rb></ruby>としようかと思ったんですよ。ところが、この書き方だとIE8で動かないんですね。というより、RB要素に一切スタイルが効かない……。そうなると、RUBY要素の中にはRB要素RT要素他ルビ関連しか包含できないので、結局SPAN要素のお出ましというわけです(´д`)

まあでも、それなりに面白いとは思うんですよねー。IE8だと大量に使うとページがクソ重たくなるので実用性皆無ですけど(笑
でも、他のブラウザでは色んな意味で使い勝手が良いです。コピペしてもルビが入ってこないところとか、頑張れば手打ちでも打てるくらいの面倒くささとか(ノ∀`)

結構苦労しましたよー。裏技的なことをやってるおかげでブラウザごとに微妙な挙動が発生するもので。Safariはベーステキスト部にtabel-cellを指定するとルビテキストのセンタリングが出来ないし、IE8は逆にルビ側がtable-captionだとセンタリングが出来ないし、上下のdisplayの設定次第だとSafari落ちるし(笑
下table-cell、上table-header-groupだったかな? 謎仕様……。

つか、そもそも生成要素に本当はテーブル関連プロパティは設定できないことになってた気がします。CSS3からOKになりそう、だった筈。ま、動いてるからいいんですけどね(゚Д゚)

サンプルはこちらからどーぞLink
ブラウザ側で拡大縮小してもそんなに崩れない、はず。


今回のルビCSSをいじるに当たって、元祖の方も微調整しました。次ページに掲載ィー

1 of 212Next»

icon

11:53 pm
Comment [0]
TrackBack [0]

Up

ルビCSS 2.1

追記
CSSの修正版がありますLink


もっと読む»

現在IEのみで実装されているルビタグをCSSによって他のブラウザでも再現してしまえ、という企画。
実際にルビタグを使うわけではなく、SPAN要素にクラスを指定して実現しているので、CSSハックだらけ・フォント依存の部分がある・HTMLが読みづらくなる、という欠点以外はクリーンな実装だと思います。

/* 
 * [Ruby CSS v2.1]
 *
 * Example    : <span class="ruby"><span class="rb"> [ruby base] </span><span class="rp">《</span><span class="rt"> [ruby text] </span><span class="rp">》</span></span> 
 *
 * CSS Author : Akatsuki Kitamura 
 * Sourses    : http://www.akatsukinishisu.net/itazuragaki/css/use_ruby_style_as_user_stylesheet.htmlLink  
 *              http://www.akatsukinishisu.net/itazuragaki/id/ruby_for_mozilla.htmlLink 
 *  
 * Customize  : BENIT(2008/06/21)
 *
 * OS : Windows XP
 *
 * Browser : Internet Explorer6
 *           Internet Explorer7
 *           Internet Explorer8
 *           Firefox3.0 // and less than
 *           Opera9.5 // and less than
 *           Safari3.1.2 for win // and less than
 *
 * rb == ruby base
 * rt == ruby text
 * rp == ruby parentheses?
 * 
 * Last Updata //2008-6-21// Added the new CSS for Firefox3. 
 *                           Fixed CSS for IE7/8 
 *
 */

/* -+-+-+-+-+-+-[Common CSS]-+-+-+-+-+-+- */
span.ruby {
  font-size: 100%;
  line-height: 2.2;
  text-indent: 0;
  white-space: nowrap;
  margin: 0;
  position: static;
}
span.ruby span.rt {
  font-size: 77%;    /* ruby size */
  line-height: 1.3;
  letter-spacing: 0;
}
span.rp {    /* parentheses for a browser that not support CSS */
  display:none;
}

/* -+-+-+-+-+-+-[For IE7/8]-+-+-+-+-+-+- */

/* IE7 only (not apply IE8) START*/
/*/*/
*:first-child+html span.ruby {
  line-height: 2.3;
  padding: 0 0.2em;
  position: relative;
}
/**/
/*/*/
*:first-child+html body span.ruby span.rt {
  position: absolute;
  top: -1.2em;
  left: 0.2em;
}
/**/
/* IE7 only END*/

/* Common of IE7/8 */
*:first-child+html body span.ruby span.rt {
  font-size: 77%;
}

/* -+-+-+-+-+-+-[For IE6]-+-+-+-+-+-+- */
* html span.ruby {
  line-height: 2.2;
  padding: 0 0.2em;
  position: relative;
}
* html span.ruby span.rt {
  font-size: 62%;
  position: absolute;
  top: -1.0em;
  left: 0.2em;
}

/* -+-+-+-+-+-+-[For IE8, Firefox, Opera and Safari]-+-+-+-+-+-+- */
html>/**/body span.ruby {
  display : inline-table;
  line-height : 1;
  text-align : center;
  padding : 0;
}

/* Adjustment of each browser */
html>/**/body span.ruby                          { vertical-align : -28%; } /* Firefox2.x */
html>/**/body span.ruby , x:-moz-broken          { vertical-align : 115%; } /* Firefox3.0 */
html[lang*=""]>/**/body span.ruby                { vertical-align : 125%; } /* Opera9.5 (, IE8 and Safari) */
*:first-child+html/**/>body span.ruby            { margin-bottom: -4px; vertical-align: baseline; } /* IE8 */
html[lang*=""]:not(:nth-child(n)) body span.ruby { vertical-align: -15%; } /* Safari3.1.2 */

html>/**/body span.ruby > span.rb {
  display : table-row-group;
  line-height : 1.2;
}
html>/**/body span.ruby > span.rt {
  display : table-header-group;
}
前回のエントリで見つけたハックを使って、Firefox3.0に対応しました。これで現行の最新ブラウザには一通り対応してると思います。
相変わらずvertical-alignの指定には細かい微調整が必要ですが……。


ルビサンプル

 六の宮の姫君の父は、古い宮腹みやばらの生れだつた。が、時勢にも遅れ勝ちな、昔気質むかしかたぎの人だつたから、官も兵部大輔ひやうぶのたいふより昇らなかつた。姫君はさう云ふ父母ちちははと一しよに、六の宮のほとりにある、木高こだか屋形やかたに住まつてゐた。六の宮の姫君と云ふのは、その土地の名前につたのだつた。

図書カード:六の宮の姫君 - 芥川龍之介(青空文庫)Link

上に書いてない欠点が、ルビがある行と無い行で行間が変わることかな……。あとIE7以下はモダンブラウザと違う処理なので長いルビがあると読みづらいことも大欠点。

ちなみにソースはこんなことになります(笑

 六の宮の姫君の父は、古い<span class="ruby"><span class="rb">宮腹</span><span class="rp">《</span><span class="rt">みやばら</span><span class="rp">》</span></span>の生れだつた。が、時勢にも遅れ勝ちな、<span class="ruby"><span class="rb">昔気質</span><span class="rp">《</span><span class="rt">むかしかたぎ</span><span class="rp">》</span></span>の人だつたから、官も<span class="ruby"><span class="rb">兵部大輔</span><span class="rp">《</span><span class="rt">ひやうぶのたいふ</span><span class="rp">》</span></span>より昇らなかつた。姫君はさう云ふ<span class="ruby"><span class="rb">父母</span><span class="rp">《</span><span class="rt">ちちはは</span><span class="rp">》</span></span>と一しよに、六の宮のほとりにある、<span class="ruby"><span class="rb">木高</span><span class="rp">《</span><span class="rt">こだか</span><span class="rp">》</span></span>い<span class="ruby"><span class="rb">屋形</span><span class="rp">《</span><span class="rt">やかた</span><span class="rp">》</span></span>に住まつてゐた。六の宮の姫君と云ふのは、その土地の名前に<span class="ruby"><span class="rb">拠</span><span class="rp">《</span><span class="rt">よ</span><span class="rp">》</span></span>つたのだつた。





item

六の宮の姫君 (創元推理文庫)Link

  • メーカー・販売: 東京創元社
  • アマゾン価格: ¥ 609
  • 売り上げランキング: 130,382位
  • ジャンル・カテゴリー: 文庫
  • レビュー評 価: [詳 細]
    2008-09-29 ホレイシアLink
    rating:5/5円紫さんシリーズでは最高傑作
    2007-11-05 ゆこりんLink
    rating:3/5本好きな人必見!異色のミステリー♪
    2007-07-03 阿寒毬藻Link
    rating:4/5菊池寛が読みたくなる。
    2006-07-29 かほひめLink
    rating:5/5すばらしい、書誌学ミステリ
    2006-04-29 ぷりうすLink
    rating:4/5文学の向こう側を覗く



icon

09:53 am
Comment [2]
TrackBack [0]

Up

IE8とOpera9.5を考慮したCSSハック

段々各ブラウザのCSSの対応状況が出揃ってきたので、滅多やたらにハックする必要性というのは薄れてきていますが、まれにブラウザの癖のようなものにぶち当たることがあります。そういったときには、相変わらずお世話になることは多いのではないでしょうか……。

特に断りがなければIEは5.5~8、Firefoxは2~3、Operaは9.27と9.5、Safariは3.1です。
また、テストしたOSはXPです。
あくまで「こう書けば効かないべ?」って感じで書いてるので、同種の効きかたをするもっとスマートなハックがあるかもしれません。ハックにスマートもクソもありませんが。
最後に参考URLを書いたので、色々自分で試してみるが吉。
未対応セレクタで振り分けられれば一番楽なんですけども……。

TRUE:IE6以下
FALSE:IE7以上、Firefox、Opera、Safari
* html body selector

TRUE:IE7以上
FALSE:IE6以下、Firefox、Opera、Safari
*:first-child+html body selector

TRUE:IE
FALSE:Firefox、Opera、Safari
*:first-child+html body selector
* html body selector
上二つの複合型。

TRUE:IE7以上、Firefox、Opera、Safari
FALSE:IE6以下
html>body selector
* htmlの逆。

TRUE:IE7以上、Opera9.27
FALSE:IE6以下、Firefox、Opera9.5、Safari
*+html selector
参考サイトを見る限りOpera9.27には使えないはずなのですが、テスト環境では使えました。怪しいです。
追記
Opera9.27にも効いてしまう原因が分かりました。
XML宣言があると有効で、ないと無効であるようです。なんじゃそりゃ('A`)

TRUE:IE8、Opera9.27
FALSE:IE7以下、Firefox、Opera9.5、Safari
*+html>/**/body selector
以前はOperaのみに使えるハックだったのですが状況が変わりました。
いずれは状況的にIE8のみに使えるハックのような扱いとなるかもしれません。

TRUE:Opera9.27
FALSE:IE、Firefox、Opera9.5、Safari
*+html:first-child body selector
Opera9.5では使えないのでそのうち意味を成さなくなるでしょう。

TRUE:IE8
FALSE:IE7以下、Firefox、Opera、Safari
*:first-child+html>/**/body selector
 *:first-child+html bodyhtml>/**/body の複合型。

TRUE:Opera9.5、Safari
FALSE:IE、Firefox、Opera9.27
body:first-of-type selector

TRUE:IE8、Firefox、Opera、Safari
FALSE:IE7以下
html>/**/body selector
CSSの対応度合い的には便利なハックかもしれません

TRUE:Safari
FALSE:IE、Firefox、Opera
html:not(:nth-child(n)) selector
類似でhtml:not(:only-child:nth-child(1)) selectorhtml:not(:only-child:only-child) selectorも。

TRUE:Firerfox、Opera9.5、Safari
FALSE:IE、Opera9.27
html:not(:target) selector

TRUE:IE7以上、Opera、Safari
FALSE:IE6以下、Firefox
html[lang*=""] selector

TRUE:IE8、Opera、Safari
FALSE:IE7以下、Firefox
html[lang*=""]>/**/body selector
html[lang*=""]html>/**/body の複合型.。

TRUE:Opera9.5、Safari
FALSE:IE、Firefox、Opera9.27
html[lang*=""]:not(:target)>/**/body selector
html:not(:target)html[lang*=""]>/**/bodyの複合型。長すぎ。
上二つもそうですが、htmlで始まる別のハックで上書きする場合、htmlhtml[lang*=""]とする必要あり。

上記のを複合的に使ってIE6以下、IE7、IE8、Firefox、Opera9.27、Opera9.5、Safari3.1を全て個別に振り分けるとこうなる。ごつすぎる……。
body selector /* Firefox */
* html body selector /* less than IE6 */
*:first-child+html body selector /* IE7 (+IE8) */
html[lang*=""]>/**/body selector /* Opera9.5 (+IE8,Safari,Opera9.27) */
*+html:first-child body selector /* Opera9.27 */
*:first-child+html>/**/body selector /* IE8 */
html[lang*=""]:not(:nth-child(n)) selector /* Safari */

ま、あくまでIE8もOpera9.5もまだまだベータ版なので、正式版のときにこれが通用する保障はありませんのであしからず。
ちなみにFirefox2と3は現時点では振り分け方法がわかりません(´・ω・`)


cf.http://thomas.tanreisoftware.com/css_filters/huzzah.htmlLink
この表を眺めて組み合わせて作っています。

icon

05:50 pm
Comment [0]
TrackBack [0]

Up
Visual Switch