#?SuikaWiki/0.9 [1] [CODE[Content-Style-Type:]] 欄は、 [[HTML 4]] (>>2) が規定する [[HTTP]] [[頭欄]]で, 当該[[実体]]の既定[[スタイル・シート]]の[[媒体型]]を指定します。 [3] 細かい構文は規定されていませんが、 [[HTTP]] の [CODE(HTTP)[[[Content-Type]]:]] 欄と同じと考えて良いでしょう。 パラメーターが使えるのかどうかは不明 (HTML 4 では全体的に「媒体型」にパラメータも含まれるか不明。) ですが、実際には使用している例が観測されていますし、 媒体型の定義によってはパラメータがないと型を完全に特定できませんから、 使用可能と考えるのが良いと思われます。 [4] [[[CODE(MIME)[charset]]パラメーター]]は一般に指定出来ません。 [CODE’(HTTP)[Content-Style-Type:]] の指定対象であるスタイル・シートはその実体に組み込まれたものであり、 [CODE(MIME)[charset]] は既に [CODE(HTTP)[Content-Type:]] 欄の指定などで判明しているはずだからです。 むしろ存在した方が、 [WEAK[(二重に復号しようとしてしまうなど)]] 解釈に要らぬ混乱を起こす虞もあるでしょう。 [7] HTML 4 では、次の優先順で「既定スタイル・シート」 が決定されます。 = [CODE(HTMLe)[[[meta]]]] 要素での指定の内、一番最後のもの。 = HTTP 頭での指定の内、一番最後のもの。 = [CODE(MIME)[[[text/css]]]] この規定から、この欄は (意味はないものの) 複数指定可能なことがわかります。 実際 ([[内容折衝]]などの処理の関係で) 複数の HTTP 頭欄を送るサーバーがあります。 また、 [[HTTP]] の規定から、同じ名前の複数の頭欄を置ける場合は、 読点区切りで一つの欄内に複数の値を書ける必要があります。 [12] >>7 の順序は、 [Q[[CODE(HTMLe)[meta]] 要素内の HTTP 頭欄代替表現は、実際の HTTP 頭欄の後に続いて存在する]]と考えることで、 [Q[一番最後の頭欄の、一番最後の項目]]と言い換えることが出来ます。 [8] >>3-7 から [CODE(HTTP)[Content-Style-Type:]] 欄の構文を推定すると、次のようになります。 - [9] [CODE(ABNF)[[DFN[Content-Style-Type]] := "Content-Style-Type:" [ [[FWS]] ] media-type-list [FWS] ]] - [10] [CODE(ABNF)[[DFN[media-type-list]] := media-type *([FWS] "," [FWS] media-type)]] - [11] [CODE(ABNF)[[DFN[media-type]] := type "/" sub-type *([FWS] ";" [FWS] parameter) ;; See [[RFC 2616]] ]] [13] ところで、この既定のスタイル・シート言語の指定が適用されるのは [CODE(HTMLa)[[[style]]]] 属性の値ですが、 HTML4 の同じ節の規定によると、 [CODE(HTMLa)[style]] 属性がある場合は [CODE(HTTP)[Content-Style-Type:]] の指定が必須です。 この規定が守られている限りは >>7 の3番目の処理に行くことはないはずです。 (実際には守られていないことがあるので >>7 の3番目をエラー処理として行うのですけど。) [26] >>13 また、 HTTP 以外の転送プロトコルや local のファイルなどで、 [CODE(HTTP)[Content-Style-Type]] 相当の指定が無い場合にも 3 番目に行くかもしれません。 それを考えると、 [CODE(MIME)[text/css]] 以外のスタイル言語を [CODE(HTMLa)[style]] 属性で使う時には [CODE(HTMLe)[meta]] 要素でも指定する方が安全かもしれません。 [[#comment]] * 例 - [5] [SAMP(HTTP)[Content-Style-Type: [CODE(MIME)[text/css]]]] - [6] [SAMP(HTML)[<[CODE(HTMLe)[meta]] [CODE(HTMLa)[[[http-equiv]]]]="[CODE(HTTP)[Content-Style-Type]]" [CODE(HTMLa)[[[content]]]]="[CODE(MIME)[text/css]]" />]] [22] [[Apache]] の [CODE(file)[[[.htaccess]]]] を使って >>5 を指定するためには、 [PRE[ <[[IfModule]] mod_headers.c> [[Header]] set [CODE(HTTP)[Content-Style-Type]] "[CODE(MIME)[text/css]]" ]PRE] と書きます。 ([CODE[mod_headers]] が組み込まれている時のみ有効。) [[#comment]] * 歴史 [20] この欄の [[W3C]] draft 初出は 『HTML3 and Style Sheets』 (1996年7月10日) です。 [WEAK[(この WD はその後の HTML 4 のスタイル・シートの章の直接の祖先です。)]] この時点で既に HTML 4 最終版とほぼ同じ規定ですが、 [CODE(HTMLe)[[[style]]]] 要素型の [CODE(HTMLa)[[[type]]]] 属性は必須でありませんでしたし、 [CODE(HTMLa)[style]] 属性を使っていても [CODE(HTTP)[[ABBR[CST][Content-Style-Type]]:]] 欄は必須ではありませんでした。 現在でも CSS が既定値になっている (>>7) のはこの時以来の名残でしょう。 [21] この措置は当時の [[NN]] や [[IE]] の実装との互換性を考えれば妥当なものでした。 それが HTML 4 では必須化されたのは[[未来との互換性]]を重視したとでも言えましょう。 [24] [CODE(HTTP)[Content-Style-Type]] や [CODE(HTTP)[[[Content-Script-Type]]]] のような、 HTTP RFC で規定されていない HTTP 頭欄を使うことについては、 HTML 4 の策定中から批判はありました。また、 [CODE(HTMLa)[style]] 属性や[[事象属性]]の型を文書単位でしか指定できないことを指摘する意見もありました。 (たとえば [[www-html]] で何度か話題になっています。) そういう声を押し切って HTML 4 に残った理由は (HTML WG の議事録は公開されていないので) 分かりません。 (W3C WG の議事録は一定期間後に公開するべきだよね?) [[#comment]] * 参考文献 - [2] ''Style Sheets in HTML documents (Setting the default style sheet language)'' - [14] ''XHTMLでのCSSスタイルシート・対応表'' - [15] ''HTMLでのCSSスタイルシート・対応表'' [[#comment]] * メモ [16] [[SVG]] には [CODE(XMLe)[[[svg]]]] 要素に [CODE(XMLa)[[[contentStyleType]]]] 属性があり、 これを使って既定スタイル言語を指定します。 (''Styling - SVG'' ) [17] >>16 ちなみにその既定値は [CODE(MIME)[text/css]] です。 [18] >>16-17 古い [[WD]] では、 [CODE(HTTP)[Content-Style-Type:]] を見ていましたが、削除されました。 (''Styling'' ) 既定値はやはり [CODE(MIME)[text/css]] でした。 [19] は[Q[実際には [CODE(MIME)[text/css]] 以外は [CODE(HTMLa)[[[style]]]] 属性では使われない]]と語ってます。 [25] [CODE(HTTP)[Content-Style-Type]] や [CODE(HTTP)[[[Content-Script-Type]]]] の役割を実現する方法は幾つかあります。 - HTTP の頭欄として指定する : HTML 4 の方法 - 文書の大域的マークとして指定する : SVG の方法 - 局所的マークとして指定する: 事象属性に対する [[WinIE]] 独自拡張の [CODE(HTMLa)[[[language]]]] 属性の方法 - 属性値内で指定する : 事象属性についての WinIE 独自拡張の、属性値の最初の [CODE(JS)[javascript:]] や [CODE(VB)[vbscript:]] で判別する方法 - 諦めて固定にする : 多くのブラウザの [CODE(HTMLa)[style]] 属性のように CSS に固定 - そもそも [CODE(HTMLa)[style]] 属性や事象属性は使わない : [[表現と構造の分離]]原則的に正統な方法 どれも一長一短で、結局全部乱立する羽目になったわけです。