HTML 要素の計算されたスタイルを取得するには、常に多くの互換性の問題がありました。Firefox と Webkit (Chrome、Safari) は W3C 標準メソッド getComputedStyle() をサポートしていますが、IE6/7/ は異なります。 8 は標準メソッドをサポートしていませんが、それを実装するためのプライベート プロパティ (currentStyle) があり、IE9 と Opera の両方がそれをサポートしています。これら 2 つのメソッドと属性を使用すると、基本的にほとんどの要件を満たすことができます。
ただし、適応型の幅と高さの場合、currentStyle を使用して計算値を取得することはできません。auto を返すことしかできません。この問題を解決するには、いくつかの方法があります。私が以前に考えたのは、標準メソッドをサポートしていないブラウザでも計算された幅と高さを取得できるように、clientWidth/clientHeight からパディング値を減算することでした。数日前、Situ Zhengmei が別の方法を使用しているのを見ました。 getBoundingClientRect() メソッドを使用してページ上の要素の位置を取得し、左から右を引いたものが幅となり、下から上を引いたものが高さになります。彼のコードにいくつかの小さな変更を加えました。最終的なコードは次のとおりです:
var val = elem.currentStyle[スタイル];
if( val === 'auto' && (style === "width" || style === "height") ){
var rect = elem.getBoundingClientRect();
if( style === "width" ){
returnect.right - rect.left 'px';
}else{
returnect.bottom - rect.top 'px';
}
}
return val;
}();
};
// このメソッドを呼び出します
var test = document.getElementById( 'test' ),
// 計算された幅を取得します
tWidth = getStyle( test, 'width' );
新しい質問、要素の幅または高さが em または % 単位を使用している場合、getComputedStyle() によって返される値は em または % を自動的に px 単位に変更しますが、currentStyle は変更せず、フォント サイズの場合は を使用します。 em を単位として、Opera では 0em を返します。本当に怖いです。
その後、使用中に予期しない互換性の問題がいくつか見つかりました。今日、元のコードを最適化し、いくつかの一般的な互換性の問題に対処しました。
JavaScript では、「-」(ダッシュまたはハイフン) はマイナス記号を表し、CSS では、padding-left、font-size などの多くのスタイル属性にこの記号が含まれているため、次の場合コードが JavaScript に表示されます。これはエラーです:
float の場合、これは JavaScript の予約語です。JavaScript で要素の float 値を設定または取得する別の方法は、標準ブラウザでは cssFloat であり、IE6/7/8 では次のとおりです。スタイルフロート。
top、right、bottom、left に明示的な値がない場合、一部のブラウザはこれらの値を取得するときに auto を返しますが、auto 値は正当な CSS 属性値ですが、私たちが望むものではありません。結果は 0px になるはずです。
IE6/7/8 で要素の透明度を設定するには、filter:alpha(opacity=60) のようなフィルターを使用する必要があります。IE9 は両方の書き込み方法を直接サポートします。要素の透明度を取得するための互換性も実装されており、opacity を使用する限り、ブラウザーのすべての要素の透明度の値を取得できます。
IE6/7/8 における要素の幅と高さの取得については、以前の記事で紹介したので、ここでは繰り返しません。もう 1 つ注意すべき点は、要素のスタイルが style inline を使用して記述されている場合、または style 属性が JavaScript を使用して設定されている場合、次のメソッドを使用して要素の計算されたスタイルを取得できることです:
このメソッドは getComputedStyle や currentStyle で属性値を読み取るよりも高速なので、最初に使用する必要があります。もちろん、前提条件はインライン書き込みによってスタイルが設定されていることです (インライン スタイルを設定するための JavaScript も設定されています)。最適化された最終コードは次のとおりです: