getBoundingClientRect()不返回SVG rect的高度和宽度

时间:2015-09-17 11:11:54

标签: javascript angularjs svg

我需要一双新鲜的眼睛来向我展示我做错了什么。

我想获得heightwidth并使用它们计算出另一个元素的位置。

HTML

<g>
    <rect
        class="graphic"
        draggable="data"
        ng-attr-x="{{ data.x }}"
        ng-attr-y="{{ data.y }}"
        ng-attr-height="{{ data.height }}"
        ng-attr-width="{{ data.width }}"
    ></rect>
</g>

返回我想要的值的功能

function getSVGRectDimensions(element) {
    //logging
    console.log('firstChild', element[0].firstElementChild);
    console.log('firstChild.Clientrect', element[0].firstElementChild.getBoundingClientRect());

    var viewportOffset = element[0].firstElementChild.getBoundingClientRect();
        if (!element.jquery) {
            element = angular.element(element);
        }
        return {
            left: viewportOffset.left,
            height: viewportOffset.height,
            top: viewportOffset.top,
            width: viewportOffset.width
        }
    }

我如何使用该功能

var svgElement = getSVGRectDimensions(data.element);

在控制台中我得到了

enter image description here

从日志中,您可以看到height的{​​{1}}和width&gt; 0

rect

然而,当我使用<rect class="graphic" draggable="data" ng-attr-x="{{ data.x }}" ng-attr-y="{{ data.y }}" ng-attr-height="{{ data.height }}" ng-attr-width="{{ data.width }}" x="1033.78" y="364" height="46.22000000000003" width="106.8900000000001"></rect> getBoundingClientRect()height = 0来调用该函数时。

width

为什么会这样?

我还试图摆脱firstChild.Clientrect ClientRect {} bottom: 60.999996185302734 height: 0 left: 681.1538696289062 right: 681.1538696289062 top: 60.999996185302734 width: 0 __proto__: ClientRect ,这导致返回firstElementChild而不是g,但仍然rectheight = 0。

1 个答案:

答案 0 :(得分:4)

根据https://developer.mozilla.org/en-US/docs/Web/API/Element/getBoundingClientRect,getBoundingClientRect返回四个值:top,left,bottom,right。 在控制台中,您可以看到存在这四个值。从这些值计算宽度和高度是微不足道的

你使用:

var viewportOffset = element[0].firstElementChild.getBoundingClientRect();

返回DOMRect,然后返回:

return {
        left: viewportOffset.left,
        height: viewportOffset.height,
        top: viewportOffset.top,
        width: viewportOffset.width
    }

正如我所说,viewportOffset是一个DOMRect,没有属性宽度和高度相反他们有正确,底部

所以为了计算你的宽度和高度,你的返回代码应如下所示:

return {
        left: viewportOffset.left,
        height: viewportOffset.bottom - viewportOffset.top,
        top: viewportOffset.top,
        width: viewportOffset.right - viewportOffset.left
    }