ASH | サーバ | セキュリティ | Linux | FreeBSD | DB | Web | CGI | Perl | Java | XML | プログラム | ネットワーク | 標準 | Tips集

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のソースをダウンロードすることができます。
 プログラムの著作権は放棄していませんが、そのまま利用したり、カスタマイズして利用することは、自由に行って頂いて構いません。



Copyright (C) 1995-2009 ASH.
URL:http://ash.jp/ Mail:info@ash.jp