CSSの書き換えできたら便利だと思いませんか?スタイルくらい jQueryでやればいいじゃん。ってのはたしかにそうなんだけど。
jQueryは便利だけど、、、
$("div.tsample").css("width","300px");
jQueryでやると便利なんだけど、CSSじゃないんです。CSS書式で書きたいんですね。SasSとかもいいのですが。やっぱCSSは最強だと思います。共通言語だしね。
CSSはコメントアウトが面倒
でもね、CSSはコメントアウトが面倒なんですよ。行コメントなんで無いの!
/* div#test{ } /* div#sample{ } */ div#sample2{ } */ /*←閉じの重複問題が発生!*/
Syntax エラー!!ブロックコメントの挟みこみで頻繁に苦労します。
JSからCSSルールを追加する。
JSからCSSのルールを追加する。
//CSSノード追加 var newStyle = document.createElement('style');newStyle.type = "text/css"; document.getElementsByTagName('head').item(0).appendChild(newStyle); css = document.styleSheets.item(0) //追加 var idx = document.styleSheets[0].cssRules.length; css.insertRule("dl.list_content > dd.menu div.body { outline: solid 1px red; }", idx);//末尾に追加
とする。あれ?意外と簡単。
これでコメントアウト問題に光明が。
//css.insertRule("dl.list_content > dd.menu div.body { outline: solid 1px red; }", idx); css.insertRule("dl.list_content > dd.menu div.body { outline: solid 2px blue }", idx);
行コメントアウトができますね。
document.styleSheets がスタイルシート
動作原理についてちょっと言及。 document.styleSheets でスタイルシートを参照できる。styleSheetsは配列。で、styleSheetsはCSSStyleSheetの配列になっています。CSSStyleSheetは、スタイルシートをJsから扱うクラスです。とりあえず、すぐ使えるのはスタイルシートの無効化です。
つまり
- document
- styleSheets
- CSSStyleSheet
- CSSStyleSheet
- CSSStyleSheet
- CSSStyleSheet
- styleSheets
という関係です。
スタイルシートをたどる
たどり着いたら、中身を確認して安心する。style作業は、ひたすら繰り返しです。*1
var stylesheet = document.styleSheets.item(1); stylesheet.cssRules.item(0).cssText //#=>".retail-tabs { // background-image: url(https://images-na.ssl-images-amazon.com/images/G/09/nav2/images/skins/teal/tabs-line.jpg); }"
ルールを足す。
var stylesheet = document.styleSheets.item(1);//既存スタイルを取得し stylesheet.cssRules.item(0).cssText//確認したら //追加します。 css.insertRule("dl.list_content > dd.menu div.body { outline: solid 1px red; }", 0 );
簡単ですね。0はブラウザに依っては省略可能で、0を指定すると、先頭に、lengthを指定すると末尾にルールを追加します
既存のルールを消す
ここまでで、ルールをたどり方がわかったので、不要スタイルを消してみます。
var stylesheet = document.styleSheets.item(1);//既存スタイルを取得し stylesheet.cssRules.item(0).cssText//確認したら //消す stylesheet.deleteRule(0);
insertRuleと同じで、0を指定したら先頭のルールを消します。
既存ルールに影響しないように、新しいStyleタグの中で作業したい。
Styleタグを作るそうです。
//CSSノード追加 var blankStyle = document.createElement('style'); blankStyle.type = "text/css"; document.getElementsByTagName('head').item(0).appendChild(blankStyle);
これで新しいStyleタグがあるので、自由に遊べます。
*1:*