« class名の付け方を視野を広げて考えてみた | Back To Blog Top | Daily Link 2007-01-29 | Note »
Tantek Box Model Hackについての考察
CSSハックとしても、かなり古い部類に属するTantek Box Model Hack。
バリデータを通過していながらも、近頃はIE5用の指定をまとめて別ファイルに移す、いわゆるPass Filterにお株を奪われていました。
しかし、そのPass Filterがバリデータを通らない事から、今再び見直してみたいと思います。
バックスラッシュエスケープの役割
.hoge {
color: blue;
voice-family: "\"}\"";
voice-family: inherit;
color: red;
}
(Box Model Hackと言いつつも、解りやすさを重視してプロパティはcolorプロパティにしています)
まずは動作の仕組みを解明してみます。
このハックの鍵となるのはバックスラッシュエスケープです。 これの詳しい説明は拙エントリ、よく解るかもしれないバックスラッシュエスケープを参照してください(宣伝)。
バックスラッシュエスケープが使われているのはvoice-familyプロパティです。
voice-familyプロパティは、音声ブラウザを使用する際に、声の種類を指定するプロパティです。 参考:voice-family とは | スタイルシート用語集 | ミツエーリンクス
hoge-familyというとfont-familyプロパティを連想しますが、値の指定の仕方などで共通点があります。 このハックでは、引用符でくくる部分に特に注目します。
まずはモダンブラウザでの解釈です。
「voice-familyを\"}\"に指定する」となります。 もちろんそんな値は存在しませんので、CSSの仕様に従って無視されます。
そして、続くプロパティを読み込みます。
次に、バックスラッシュエスケープに対応していないIE5などの解釈です。
「voice-familyを\に指定する」となります。 こちらも、そんな値は存在しませんので無視します。
モダンブラウザと違うのは、ここで処理を終了するという点です。
解りにくいと思うので、画像を用意しました。 このように、IE5は途中で処理を終了します。 宣言ブロックの外に謎の文字が残る事になりますが、これはどうやら無視されるようです。
一方、バックスラッシュを解釈するブラウザでは、終了を意味する } を文字列の一部として認識するので、最後まで読み込む事になります。
inheritの役割
inheritとは、『親要素の値を継承する』という効果があります。
新しいブラウザ向けの記述で気になるのは、続くvoice-family: inherit;という部分の役割です。
音声ブラウザは使える環境にある人が少ないと思うので、似ているプロパティのfont-familyを使って検証してみます。
サンプルのテキスト(hamashun.comという部分)は、デフォルトで明朝体になるよう指定しています。
ところがFirefoxのみですが、inheritを指定していない方のフォントがゴシック体になっています(恐らくはブラウザに設定されたデフォルトフォントです。 明朝を指定していた場合には異なる結果になると思います)。
voice-familyとfont-familyという違いはありますが、inheritを指定しない場合、voice-familyプロパティにも何らかの不具合が出る可能性はあるでしょう。
inheritの指定は、これを回避する為であると考えられます。
もっとも、CSSファイルを読み込む際にmedia="screen,print"などと指定しておけば、音声スタイルシートのプロパティであるvoice-familyプロパティは、不具合どころか何の効果も無い事になります。
結論
これらにより、IE5では文字色が青になり、新しいブラウザでは文字色が赤になります。
また、バリデータのチェックはバックスラッシュを解釈する理屈で行われるので、Validとなります。