JavaScriptによるスタイルシート(CSS)の操作
スタイルシートには、CSSファイルに記述されたスタイルルールと、各タグに記述されたスタイル属性があります。スタイルルールは、タグ名やクラス属性やID属性などを使ったセレクタによって、適用されます。
そこで、JavaScriptを使って、スタイルシートに関する各種データを操作する方法を紹介します。
このプログラムは、IE8, IE7, IE6, Firefox3, Safari4, Opera10, Sleipnir2で動作することを確認済みです。
スタイルルールの取得方法
スタイルシートは、document.styleSheets で取得できます。
ファイル毎に、配列として格納されています。
各スタイルシートには、スタイルルールの配列として格納されています。
スタイルルールは、セレクタとプロパティ+値の形式に分かれて取得できます。
JavaScriptの記述 |
処理内容 |
document.styleSheets |
スタイルシートの配列を取得 |
styleSheet.rules |
スタイルルールの配列を取得 |
styleSheet.cssRules |
スタイルルールの配列を取得(IEの場合) |
rule.selectorText |
セレクタを取得 |
rule.style.cssText |
プロパティ:値を取得 |
style.cssText は、CSSファイルに記述する形式と同じ、プロパティ:値の形式で取得できるだけでなく、値を設定することで、スタイルシートを書き換えることもできます。
スタイルルールの取得ライブラリ
外部スタイルシート(ルール)をすべて取得し、CSSファイルの記述形式の表示文字列を返却するJavaScript関数 getAllStyleRule() です。
このプログラムを利用することにより、スタイルシートのデータが、ブラウザ内でどのように格納されたかを理解することができるだけでなく、スタイルシートを操作するプログラムを作成するときの参考になります。
JavaScriptのソース |
/* 外部スタイルシート(ルール)の取得 */
function getAllStyleRule() {
var styleSheets = document.styleSheets;
var str = '';
for (var i = 0; i < styleSheets.length; i++) {
var styleSheet = styleSheets[i];
var rules = styleSheet.rules || styleSheet.cssRules;
str += "[" + styleSheet.href + "]\n";
for (var j = 0; j < rules.length; j++) {
var rule = rules[j];
str += rule.selectorText + " {\n";
str += rule.style.cssText + "\n";
str += "}\n";
}
}
return(str);
}
|
各タグのスタイル関連情報の取得方法
HTML内に記述された、各タグのスタイル関連情報(スタイル属性、クラス属性、ID属性)をすべて取得し、HTMLの記述形式の表示文字列を返却するJavaScript関数 getAllStyle() です。
このプログラムを利用することにより、各タグのスタイル関連データが、ブラウザ内でどのように格納されたかを理解することができるだけでなく、各タグのスタイルを操作するプログラムを作成するときの参考になります。
JavaScriptの記述 |
処理内容 |
getElementsByTagName |
タグ名から要素を取得 |
getAttribute |
要素の属性を取得 |
childNodes |
要素の子要素の配列を取得 |
nodeType |
ノードの種類を取得(1は要素) |
nodeName |
ノード名を取得 |
style.cssText |
プロパティ:値のスタイル情報を取得(IEの場合) |
各タグのスタイル関連情報の取得ライブラリ
bodyタグ内の要素を再帰的に検索し、各タグのスタイル関連情報(スタイル属性、クラス属性、ID属性)を返却します。
スタイル属性や、クラス属性の取得方法は、IE7以前のブラウザとその他のブラウザで、取得方法が変わります。
JavaScriptのソース |
/* 各タグのスタイル属性、クラス属性、ID属性の取得 */
function getAllStyle() {
var isMSIE = /*@cc_on!@*/false;
var body = document.getElementsByTagName('body')[0];
if (body == null) { return; }
return(getChild(body));
function getChild(obj) {
var str = '';
var val = '';
var nodes = obj.childNodes;
if (nodes) {
for (var i = 0; i < nodes.length; i++) {
node = nodes[i];
if (node.nodeType != 1) { continue; }
// get element name
str += "[" + node.nodeName + "]\n";
// get style attribute
if (isMSIE) { // for IE8, IE7, IE6, Sleipnir
val = node.style.cssText;
} else { // for IE8, FireFox, Opera, Safari, Crome, Sleipnir
val = node.getAttribute('style');
}
if (val) {
str += "style = \"" + val + "\"\n";
}
// get class attribute
val = node.getAttribute('class') || node.getAttribute('className');
if (val) {
str += "class = \"" + val + "\"\n";
}
// get id attribute
val = node.id;
if (val) {
str += "id = \"" + val + "\"\n";
}
if (node.hasChildNodes()) {
str += getChild(node);
}
}
}
return(str);
}
}
|
スタイルルールの追加(変更)方法
スタイルシートは、後から指定した値が優先されますので、最後のスタイルシートに追加することで、スタイルルールの追加(変更)を行うことができます。
JavaScriptの記述 |
処理内容 |
sheet.insertRule |
スタイルルールの追加 |
sheet.addRule |
スタイルルールの追加(IEの場合) |
スタイルルールの追加(変更)ライブラリ
最後のスタイルシートを取得し、ルールを追加します。
スタイルシートが全く指定されていない場合、新しくスタイルシートオブジェクトを追加しています。
JavaScriptのソース |
/* スタイルの追加(変更) */
function addStyleRule(selector, declaration) {
var isMSIE = /*@cc_on!@*/false;
var sheet;
if (document.styleSheets.length) { // 最後のスタイルシートを取得
sheet = document.styleSheets[document.styleSheets.length - 1];
} else { // StyleSheetがない場合、StyleSheetを作成
if (isMSIE) { // for IE8, Sleipnir
sheet = document.createStyleSheet();
} else { // for FireFox, Opera, Safari, Crome
var head = document.getElementsByTagName('head')[0];
if (head == null) { return(); }
var style = document.createElement('style');
head.appendChild(style);
sheet = style.sheet;
}
}
if (isMSIE) { // for IE8, Sleipnir
sheet.addRule(selector, declaration);
} else { // for FireFox, Opera, Safari, Crome
sheet.insertRule(selector + '{' + declaration + '}', sheet.cssRules.length);
}
}
|
JavaScriptのソースのダウンロード
下記のリンクから、javaScriptのソースをダウンロードすることができます。
プログラムの著作権は放棄していませんが、そのまま利用したり、カスタマイズして利用することは、自由に行って頂いて構いません。