SVG要素の幅/高さを取得します


85

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

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

Chrome 28:

style x
client 300x100
offset 300x100

IE 10:

stylex 
client300x100 
offsetundefinedxundefined 

FireFox 23:

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

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


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

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;
}

回答:


104

getBBox関数を使用する

http://jsfiddle.net/Xkv3X/1/

var bBox = svg1.getBBox();
console.log('XxY', bBox.x + 'x' + bBox.y);
console.log('size', bBox.width + 'x' + bBox.height);

10
それをHTML要素のように扱い、svg描画されたものにもかかわらず要素が占めている実際のサイズを取得する方法はありませんか?jsfiddle.net/Xkv3X/4
ラングドン

3
ところで、シェイプをレンダリングする前に描画できるキャンバスのサイズを決定しようとしています。
ラングドン2013

1
コンテナの利用可能なサイズ(svgを含むdiv)を確認してから、適切なサイズをsvgに設定する方がよいと思います
Pavel Gruba 2013

1
@LangdonはFirefoxで修正されました。Firefox33はChromeに似たものを報告します。
ロバートロングソン2014

2
今日、symbol / useが使用されている場合のFireFox38のgetBoundingClientRectの問題を報告しました。この場合、getBoundingClientRectは要素をviewBoxの境界まで拡張します。また、ストローク幅に関する既知の問題があります。したがって、getBoundingClientRectは今のところクロスブラウザソリューションではありません。
2015年

50

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);

これです !言ったように、Firefoxには問題がありますが、これはほとんどのブラウザで機能します:)
thatOneGuy 2015年

1
svgが非表示の場合(たとえば、ブートストラップタブ)にゼロを返します
AlexeySh。

caniuse.com/#feat=getboundingclientrect -すべて大丈夫ルックス今、FF12 +、クロム4+
marksyzm

8

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

var chart = document.getElementsByClassName("chart")[0];
var width = chart.getClientRects()[0].width;
var height = chart.getClientRects()[0].height;

これは、CSStransformが適用される前にサイズを取得する方法です。
マルコ2017

7

SVGにはプロパティwidthとがありheightます。これらはSVGAnimatedLength、2つのプロパティを持つオブジェクトを返します:animValbaseVal。このインターフェイスはアニメーションに使用されます。ここで、baseValはアニメーションの値です。私が見ることができることから、このメソッドはChromeとFirefoxの両方で一貫した値を返すので、SVGの計算されたサイズを取得するためにも使用できると思います。


ここで、svgは要素です... let svgWidth = svg.width.baseVal.value; svgHeight = svg.height.baseVal.value;
ボブ

残念ながら、これは現時点ではFirefoxでは機能しません。初期値が表示されますが、svgサイズを変更して再試行すると、元の値が表示されます。
ボブ

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;
};

3

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

Firefox 33は2014年10月14日にリリースされますが、試してみたい場合は、Firefoxのナイトリーに修正が含まれています。


-2

方法保存の幅と高さユニットを決定するために、任意の要素(NOパディング、マージンなし)を以下の通りです。

let div   = document.querySelector("div");
let style = getComputedStyle(div);

let width  = parseFloat(style.width.replace("px", ""));
let height = parseFloat(style.height.replace("px", ""));
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.