18

在大多数浏览器中,以下内容将起作用。

window.onload = function(){
    console.log( document.getElementById('svgElm').getBoundingClientRect().width );
};

这是一个演示。如果您在 Google Chrome 中尝试,控制台将输出200. 但是,FireFox 会返回0.

4

4 回答 4

22

如果无法返回 SVG 属性,我最终会退回到父尺寸。这是一个演示http://jsbin.com/uzoyik/1/edit

相关代码是:

svg.clientWidth || svg.parentNode.clientWidth
svg.clientHeight || svg.parentNode.clientHeight
于 2012-11-30T14:41:27.173 回答
14

我不认为“宽度”是 getBoundingClientRect 方法返回的对象的标准跨浏览器属性。我通常会做类似的事情:

var box = el.getBoundingClientRect();
var width = box.right-box.left;
var height = box.bottom-box.top;
于 2014-03-25T22:14:28.930 回答
2

此 Firefox 错误已在 2014 年 10 月 14 日发布的 Firefox 33 中修复。

有关详细信息,请参阅错误 530985

于 2012-10-29T14:14:50.517 回答
2

我为此找到的解决方案是使用.getComputedStyle(). 由于svg旧的 IE8 浏览器不支持元素,.getComputedStyle()因此可以提供一致的结果。

所以我最终在我的库中使用了这个函数:

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-05-31T08:45:13.757 回答