WebWedge.jpg

phpとかJSとか適当に書いています。

パーセント(%)で指定したwidthやheightの値をCSSファイルからそのまま取り出す

CSS
#box1 { width:1000px; }
#box1>#box2 { width:50%; }

例えばこんな時、document.getElementById(“box2”).clientWidth や $(“#box2”).width()で値を取得すると、#box2の実際の値である500pxとして取得されてしまいます。

Javascript
console.log(document.getElementById("box2").clientWidth);
console.log($("#box2").width());
// [結果]
// 500

CSSで設定された値(50%)をそのまま取得したい時は、document.styleSheetsを使用します。
不要な要素は省略しているけど、こんな感じでCSSファイルごとに配列化されて格納されます。

Javascript
console.log(document.styleSheets);

// [結果]
Array (
    [0] : { // CSSファイルごとに配列に格納される
        cssRules : Array(
            [0] : { // スタイル要素ごとに配列に格納される
                selectorText : "#box1",
                style : {
                    width:"1000px",
                }
            },
            [1] : {
                selectorText : "#box1>#box2",
                style : {
                    width:"50%",
                }
            }
        )
    }
)

console.log(document.styleSheets[0].cssRules[1].style.width);
// [結果]
// 50%

※<link href>によって外部から読み込まれたCSSファイルは、GoogleChromeではサーバー上で動作させないとcssRulesがnullになってしまいます。ローカルで、かつChromeでテストする場合はローカルサーバーで動作させてください。

上から順に配列化される都合上、CSSを追加したり編集したりすることで添字も変わってしまうので、上記のような取得の仕方は賢明ではありません。
多少汎用的な関数にするならこんな感じでしょうか。

Javascript
function getWidth(selector) {
    var w;
    for(var i=document.styleSheets.length-1; i>=0; i--) {
        var r = document.styleSheets[i].cssRules;
        for(var j=r.length-1; j>=0; j--) {
            if(r[j].selectorText==selector) {
                w = r[j].style.width;
                break;
            }
        }
    }
    return w;
}
console.log(getWidth("#box1>#box2"));
// [結果]
// 50%

より汎用的にパッケージ化されたjquery.stylesheets.jsというjQueryプラグインもあります。
https://github.com/f0r4y312/jquery-stylesheet

Categories

CSS, Javascript, コーディングとか

COMMENTS

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です