知ってる方もいるかも知れませんが、NN4 は
style="〜"
というような書き方でスタイルを埋め込み JavaScript で出力すると思わぬエラーが発生します。
なので普通は(STYLEタグ内でクラス名を付けたルールを作成し)class="〜" という形でスタイルを埋め込むことになります。これだとエラーは発生しません。しかし、この場合 CSS は変数が使用できないため、汎用的なスクリプトは作成できなくなります。
では、STYLEタグごと JavaScript で出力してしまおうと考えますが、これは NN4 がすさまじく不安定になる原因になります(エラー個所がさっぱり分からないという、とんでもなくヤバい状態)。
結局、NC4用のSTYLEを普通(静的)に作成し、NN4の汎用化はなくなくあきらめてしまうものですが、STYLE の動的な生成方法がありました。
それは
JavaScriptStyleSheets( JSSS ) です。
知ってはいたものの、普及していない、覚えるのがダルいとかで、今まで使用する機会は全くなかったのですが、
少なくとも NN4 を考慮したクロスブラウザDHTMLでは非常に役に立ちそうです。
CSS の宣言は
<style type="text/css"><!--
...
-->
</style>
です。JSSS の場合は
<style type="text/JavaScript"><!--
...
//-->
</style>
となりますが、今回僕が言いたいことはこの書き方ではありません。
僕が思う JSSS の一番の利点は
SCRIPTタグ内でも書ける ということです。つまり、JavaScript で使用する変数が STYLE にそのまま適用できるということになります。
では、実際にそのスクリプトを書いてみたいと思います。先ず、雛型です。
if( document.layers !== void 0 ){
with( document ){
...
}
}
JSSS は NN4 が対応しているため、if 文で判定します。次に JSSS のルートオブジェクトは document オブジェクトであるため、with 文で括っておきます。
さて、実際の処理ですが、至って簡単です。その例を数個書いておきたいと思います。CSSと見比べながら確認して下さい。
if( document.layers !== void 0 ) with( document ){
// H1{ font-size:20px; } と同じ
tags.H1.fontSize = "20px" ;
// .voo{ font-weiht:bold; } と同じ
classes.voo.all.fontWeight = "bold" ;
// #HOGE{ text-align:center } と同じ
ids.HOGE.textAlign = "center" ;
// P.voo{ color:#ff0000; } と同じ
classes.voo.P.color = "#ff0000" ;
// .voo A{ text-decoration:none; } と同じ
contextual( classes.voo.all, tags.A ).textDecoration = "none" ;
// DIV.voo P{ padding-top:3px; } と同じ
contextual( classes.voo.DIV, tags.P ).paddingTop = "3px" ;
}
キーワードは
all, tags, classes, ids, contextual
ぐらいだと思います。
実際使用するのは以下のような感じになるでしょうか(HTMLだけで代用できるのであまり良い例ではありませんが)。
フォントサイズに依らず、TABLE項目(TH)の必ず中央に位置したい場合(paddingの値をうまく計算する)
var class_id = "cname" ; // THに適用するクラス名
var height = 50 ; // 項目の高さ
var fontSize = 13 ; // フォントサイズ
var padding = Math.floor( ( height-fontSize )/2 ); // 上下余白の値
// JSSSルール定義
if( document.layers !== void 0 ) with( document ){
// 設定する項目が多い場合、さらに with で括ると良い
classes[ class_id ].TH.fontSize = fontSize+"px" ;
classes[ class_id ].TH.paddingTop = padding ;
classes[ class_id ].TH.paddingBottom = padding ;
}
// HTML出力
document.writeln(
"<table border='0' cellPadding='0' cellSpacing='0' height='"+height+"'><tr>",
"<th class='"+class_id+"'> SAMPLE <\/th>",
"<\/tr><\/table>"
);
CSS使いにとっては、CSS ではなく JSSS が普及した方が良かったのかも知れませんね。