SVG 요소의 너비 / 높이 가져 오기


86

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"

에 너비 및 높이 속성이 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;
}

답변:


105

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

11
HTML 요소처럼 취급 svg하고 무엇이 그려졌음에도 불구하고 요소가 차지하는 실제 크기를 얻을 수있는 방법 이 없습니까? jsfiddle.net/Xkv3X/4
Langdon

3
Btw, 모양을 렌더링하기 전에 그릴 수있는 캔버스의 크기를 결정하려고합니다.
Langdon

1
컨테이너 (
SVG

1
Firefox에서 방금 수정 된 @Langdon. Firefox 33은 Chrome과 유사한 것을보고합니다.
Robert Longson 2014

2
오늘 저는 기호 / 사용이 사용될 때 FireFox 38 용 getBoundingClientRect의 문제를보고했습니다. 이 경우 getBoundingClientRect는 요소를 viewBox의 경계까지 확장합니다. 또한 스트로크 너비에 대한 알려진 문제가 있습니다. 따라서 getBoundingClientRect는 현재 크로스 브라우저 솔루션이 아닙니다.
Dzenly

51

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

이 하나 ! 같은 파이어 폭스가 : 대부분의 브라우저에서 문제가 아직이 작품을 가지며
thatOneGuy

1
svg가 숨겨진 경우 0을 반환합니다 (예 : 부트 스트랩 탭)
Alexey Sh.

caniuse.com/#feat=getboundingclientrect- 모두 괜찮아 보입니다. FF12 +, Chrome 4+
marksyzm

8

Firefox를 사용하고 있으며 작업 솔루션은 obysky에 매우 가깝습니다. 유일한 차이점은 svg 요소에서 호출하는 메서드가 여러 개의 rects를 반환하고 첫 번째 항목을 선택해야한다는 것입니다.

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

이것은 CSS transform가 적용 되기 전에 크기를 얻는 방법 입니다.
Marko

7

SVG에는 widthheight. SVGAnimatedLength두 가지 속성이 있는 객체 를 반환합니다 : animValbaseVal. 이 인터페이스는 애니메이션에 사용됩니다 . 여기서은 애니메이션 이전baseVal 의 값 입니다. 내가 볼 수 있듯이이 방법은 Chrome과 Firefox에서 일관된 값을 반환하므로 계산 된 SVG 크기를 얻는데도 사용할 수 있다고 생각합니다.


여기서 svg는 요소입니다 ... let svgWidth = svg.width.baseVal.value; let svgHeight = svg.height.baseVal.value;
Bob

불행히도 이것은 현재 Firefox에서 작동하지 않습니다. 초기 값을 제공하지만 svg 크기를 변경하고 다시 시도하면 원래 값을 제공합니다.
Bob

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 x 100을 반환합니다.

Firefox 33은 2014 년 10 월 14 일에 출시 될 예정이지만 사용 해보고 싶다면 Firefox nightlies에 이미 수정 사항이 있습니다.


-2

저장 방법 A는 너비 및 높이를 결정하는 수단 어떤 요소 (패딩없이 마진)은 다음이다 :

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.