Blog

※ブログ移転しました。 → hamashun.me

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を\に指定する」となります。 こちらも、そんな値は存在しませんので無視します。
モダンブラウザと違うのは、ここで処理を終了するという点です。

Tantek Box Model Hack解説画像
解りにくいと思うので、画像を用意しました。 このように、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となります。

Contribution Form

Blog Search
Search
Recent Entry
Category
Monthly Archive