รับความกว้าง / ความสูงขององค์ประกอบ 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
แต่ฉันกำลังพยายามกำหนดขนาดของผืนผ้าใบที่ฉันสามารถวาดได้ก่อนที่จะแสดงรูปร่าง
Langdon

1
ฉันคิดว่ามันอาจจะดีกว่าถ้าตรวจสอบขนาดของคอนเทนเนอร์ที่มีอยู่ (div ที่มี svg ของคุณ) จากนั้นคุณสามารถกำหนดขนาดที่เหมาะสมให้กับคุณได้ svg
Pavel Gruba

1
@Langdon ที่เพิ่งได้รับการแก้ไขใน Firefox Firefox 33 จะรายงานสิ่งที่คล้ายกับ Chrome
Robert Longson

2
วันนี้ฉันรายงานปัญหาเกี่ยวกับ getBoundingClientRect สำหรับ FireFox 38 เมื่อมีการใช้สัญลักษณ์ / การใช้งาน ในกรณีนี้ 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);

อันนี้ ! ตามที่กล่าวว่า firefox มีปัญหา แต่สิ่งนี้ใช้ได้กับเบราว์เซอร์ส่วนใหญ่ :)
thatOneGuy

1
ส่งคืนศูนย์เมื่อ svg ถูกซ่อน (ตัวอย่างเช่นในแท็บ bootstrap)
Alexey Sh

caniuse.com/#feat=getboundingclientrect - ตอนนี้ทุกอย่างเรียบร้อยแล้ว FF12 +, Chrome 4+
markyzm

8

ฉันใช้ Firefox และโซลูชันการทำงานของฉันใกล้เคียงกับ obysky มาก ข้อแตกต่างเพียงอย่างเดียวคือเมธอดที่คุณเรียกใช้ในองค์ประกอบ svg จะส่งกลับหลาย rects และคุณต้องเลือกอันแรก

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

นี่คือวิธีรับขนาดก่อนที่transformจะใช้CSS
Marko

7

SVG มีคุณสมบัติwidthและheight. พวกเขากลับวัตถุSVGAnimatedLengthที่มีสองคุณสมบัติ: และanimVal baseValอินเทอร์เฟซนี้ใช้สำหรับแอนิเมชั่นbaseValค่าก่อนแอนิเมชั่นอยู่ที่ไหน จากสิ่งที่ฉันเห็นวิธีนี้จะคืนค่าที่สอดคล้องกันทั้งใน Chrome และ Firefox ดังนั้นฉันคิดว่ามันสามารถใช้เพื่อคำนวณขนาด SVG ได้ด้วย


โดยที่ svg เป็นองค์ประกอบของคุณ ... ให้ svgWidth = svg.width.baseVal.value; ให้ 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 จะเปิดตัวในวันที่ 14 ตุลาคม 2014 แต่การแก้ไขนี้มีอยู่แล้วในFirefox nightliesหากคุณต้องการทดลองใช้


-2

วิธีบันทึกเพื่อกำหนดหน่วยความกว้างและความสูงขององค์ประกอบใด ๆ (ไม่มีช่องว่างภายในไม่มีขอบ) มีดังต่อไปนี้:

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.