101

svg要素の寸法を取得する適切な方法は何ですか?

http://jsfiddle.net/langdonx/Xkv3X/

クローム 28:

style x
client 300x100
offset 300x100

IE10:

stylex 
client300x100 
offsetundefinedxundefined 

ファイアフォックス 23:

"style" "x"
"client" "0x0"
"offset" "undefinedxundefined"

には幅と高さのプロパティがありsvg1ます.width.baseVal.valueが、要素に幅と高さの属性を設定した場合にのみ設定されます。


フィドルは次のようになります。

HTML

<svg id="svg1" xmlns="http://www.w3.org/2000/svg" version="1.1">
    <circle cx="50" cy="50" r="40" stroke="black" stroke-width="1" fill="red" />
    <circle cx="150" cy="50" r="40" stroke="black" stroke-width="1" fill="green" />
    <circle cx="250" cy="50" r="40" stroke="black" stroke-width="1" fill="blue" />
</svg>

JS

var svg1 = document.getElementById('svg1');

console.log(svg1);
console.log('style', svg1.style.width + 'x' + svg1.style.height);
console.log('client', svg1.clientWidth + 'x' + svg1.clientHeight);
console.log('offset', svg1.offsetWidth + 'x' + svg1.offsetHeight);

CSS

#svg1 {
    width: 300px;
    height: 100px;
}
4

8 に答える 8

61

FireFox には getBBox() の問題があります。vanillaJS でこれを行う必要があります。

私はより良い方法を持っており、実際の svg.getBBox() 関数と同じ結果です!

この良い投稿で: SVG/G 要素の実際のサイズを取得する

var el   = document.getElementById("yourElement"); // or other selector like querySelector()
var rect = el.getBoundingClientRect(); // get the bounding rectangle

console.log( rect.width );
console.log( rect.height);
于 2014-07-09T09:03:49.077 に答える
9

私は Firefox を使用していますが、私の作業ソリューションは obysky に非常に近いものです。唯一の違いは、svg 要素で呼び出すメソッドが複数の四角形を返し、最初の四角形を選択する必要があることです。

var chart = document.getElementsByClassName("chart")[0];
var width = chart.getClientRects()[0].width;
var height = chart.getClientRects()[0].height;
于 2014-11-15T18:53:31.727 に答える
3

これは、私が見つけた一貫したクロスブラウザーの方法です。

var heightComponents = ['height', 'paddingTop', 'paddingBottom', 'borderTopWidth', 'borderBottomWidth'],
    widthComponents = ['width', 'paddingLeft', 'paddingRight', 'borderLeftWidth', 'borderRightWidth'];

var svgCalculateSize = function (el) {

    var gCS = window.getComputedStyle(el), // using gCS because IE8- has no support for svg anyway
        bounds = {
            width: 0,
            height: 0
        };

    heightComponents.forEach(function (css) { 
        bounds.height += parseFloat(gCS[css]);
    });
    widthComponents.forEach(function (css) {
        bounds.width += parseFloat(gCS[css]);
    });
    return bounds;
};
于 2014-07-03T17:40:53.923 に答える
3

Firefox 33 以降では getBoundingClientRect() を呼び出すことができ、正常に動作します。つまり、上記の質問では 300 x 100 が返されます。

Firefox 33 は 2014 年 10 月 14 日にリリースされますが、試してみたい場合は、修正が既にFirefox nightliesに掲載されています。

于 2014-07-09T09:23:46.843 に答える