Отримати ширину / висоту елемента 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"

Є властивості ширини та висоти 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;
}

Відповіді:


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
До речі, я намагаюся визначити розмір полотна, на якому я можу малювати перед тим, як відтворювати фігури.
Ленґдон,

1
Я думаю, що може бути краще перевірити доступний розмір контейнера (div, який містить ваш svg), тоді ви зможете встановити відповідний розмір для себе svg
Павел Груба,

1
@Langdon, який щойно виправили у Firefox. Firefox 33 повідомить про щось подібне до Chrome.
Роберт Лонгсон,

2
Сьогодні я повідомив про проблему з getBoundingClientRect для FireFox 38, коли використовується символ / використання. У цьому випадку getBoundingClientRect розширює елемент до межі viewBox. Також існує відома проблема щодо ширини штриху. Тож getBoundingClientRect наразі не є крос-браузерним рішенням.
Дзенлі,

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

1
повертає нуль, коли svg приховано (наприклад, на вкладці bootstrap)
Олексій Ш.

caniuse.com/#feat=getboundingclientrect - зараз все виглядає нормально, FF12 +, Chrome 4+
marksyzm

8

Я використовую Firefox, і моє робоче рішення дуже близьке до obysky. Єдина відмінність полягає в тому, що метод, який ви викликаєте в елементі svg, поверне декілька прямокутників, і вам потрібно вибрати перший.

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

Це спосіб отримати розмір до застосування CSS transform.
Marko

7

SVG має властивості widthі height. Вони повертають об'єкт SVGAnimatedLengthіз двома властивостями: animValі baseVal. Цей інтерфейс використовується для анімації, де baseValзначення перед анімацією. З того, що я бачу, цей метод повертає узгоджені значення як у Chrome, так і у Firefox, тому я думаю, що його також можна використовувати для отримання розрахункового розміру SVG.


де svg - ваш елемент ... нехай 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 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", ""));
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.