妥当でないCSSハックはやめようという趣旨の記事を読んだのだけれど、一つ気になるところがあったので書いておく。普段だったらdel.icio.us辺りに誰も読まないコメントを書いて流すんだけど、はてブでもまだつっこまれていないようなので、記事にしておく。
結論を述べるとスターハックはCSS文法上全く問題がないハックであり、単にUAのバグをつついただけのハックである。この記事の筆者が言うような議論の必要などない。
下記にtypoを修正しつつ記事を引用する。
次に考えたいのは、書式として合っているかどうかです。
* html .hoge {~}
といったスターハックなどと呼ばれるハックは、「*
(全ての要素)の子孫要素であるhtml
の子孫要素のクラスhoge
の要素に対して~」という意味になります。しかし、html
要素はルート要素なので、あらゆる要素の子要素となりえません。バリデータではエラーになりませんが、より厳格な記述を目指すなら、避けた方が良いかもしれません。ただし、これには議論の余地があると思います。
CSSはHTMLだけのものではない。仕様書の冒頭ではこのように定義されている。誤訳のしようもないので邦訳から引用。
この仕様はCascading Style Sheets, Level2(以下CSS2)を規定する。 CSS2は、文書作成者及びユーザが、HTMLやXML等の構造化文書にスタイル(フォント、文字間隔、音声挿入など)を設定するためのスタイルシート言語である。 この言語を用いて文書の体裁設定をその内容から分離することにより、Web構築及びサイト保守が容易な作業となる。
CSSは構造化文書にスタイルを設定するための言語です。従ってCSSをhtml要素はルート要素なので、あらゆる要素の子要素となりえません
などという、つまらないHTMLのローカルルールに則って作成する必要は全くありません。
スターハックはどんなに厳格な目で見ても文法上問題のないハックです。
既にXMLへCSSを用いている例は多数あります。FirefoxではuseChrome.cssを書き換えることでインタフェースを調整することができますが、これはインタフェースを構成するXMLに対してCSSを適用しているからこそなせる技です。Operaブラウザはスタイルシートと関連づけられていないXMLをただのプレーンテキストであるかの様にレンダリングすることはご存じかと思いますが、これはCSSに於ける初期値をそのまま全て適用するという実装の結果です。他にもOperaのメーラはそのメールに独自のXMLを定義し、それにmail.cssmine.cssを適用することでレンダリングしています。
フォローアップも何となくアレな雰囲気なので追記しておく。一度首つっこんだわけだし、トラックバックついでに。
XMLの各要素にスタイルを指定するのかな。 それをやった事が無いので想像しかできません
とあるが、XHTML文書にCSSを適用させているならば、既にそれはXML文書にスタイルシートを適用させていると言える。XHTML文書は立派なXML文書だ。xmlns="http://www.w3.org/1999/xhtml"
と関連づけることによって多くのXHTML文書はHTML文書との後方互換性をも実現しているだけ。
試しに<html xmlns="http://www.w3.org/1999/xhtml" xmlns:xhtml="http://www.w3.org/1999/xhtml">
とでもして適当なXHTML文書を作成してみればよい。こう定義した場合<p>
と<xhtml:p>
は等価となる。そこにスタイルシートを適用させてみればやはり(X)HTML側の仕様がからんでくるのでは
という疑問を払拭できるだろう。尤もこの疑問は既に解消されたのかもしれないが。
現状のCSS2には名前空間の概念がない為、要素名との一致を行っているに過ぎない。@namespace
ルールが記述されないCSSファイルはそのように扱われることとなっている。
単純に要素名と一致させているだけだから、dcterms\:abstract{font-size:larger;}
なんて記述ももちろんあり。もちろん名前空間を利用するのと異なり汎用性は低くなってしまうが。念のため解説すると、コロンの前にあるバックスラッシュは疑似要素と見なされないようにするための記述。
誤植修正。