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

U r*_*u s 5 javascript svg angularjs

我需要一双新鲜的眼睛来告诉我我做错了什么.

我想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>
Run Code Online (Sandbox Code Playgroud)

返回我想要的值的函数

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
        }
    }
Run Code Online (Sandbox Code Playgroud)

我如何使用该功能

var svgElement = getSVGRectDimensions(data.element);
Run Code Online (Sandbox Code Playgroud)

在控制台我得到

在此输入图像描述

从日志中,你可以看到heightwidthrect> 0.

<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>
Run Code Online (Sandbox Code Playgroud)

然而,当我用getBoundingClientRect(),heightwidth= 0 调用函数时.

firstChild.Clientrect ClientRect {} bottom: 60.999996185302734 height: 0 left: 681.1538696289062 right: 681.1538696289062 top: 60.999996185302734 width: 0 __proto__: ClientRect
Run Code Online (Sandbox Code Playgroud)

为什么会这样?

我也试图摆脱firstElementChild,这导致返回g而不是rect但仍然heightwidth= 0.

Hol*_*ill 3

根据https://developer.mozilla.org/en-US/docs/Web/API/Element/getBoundingClientRect getBoundingClientRect返回四个值:上、左、下、右。在您的控制台中,您可以看到存在这四个值。根据这些值计算宽度和高度很简单

你用:

var viewportOffset = element[0].firstElementChild.getBoundingClientRect();
Run Code Online (Sandbox Code Playgroud)

它返回一个 DOMRect ,然后:

return {
        left: viewportOffset.left,
        height: viewportOffset.height,
        top: viewportOffset.top,
        width: viewportOffset.width
    }
Run Code Online (Sandbox Code Playgroud)

正如我所说, viewportOffset 是一个 DOMRect ,它没有属性width 和 height相反,他们有权利,底部

因此,要计算出宽度和高度,您的返回代码应如下所示:

return {
        left: viewportOffset.left,
        height: viewportOffset.bottom - viewportOffset.top,
        top: viewportOffset.top,
        width: viewportOffset.right - viewportOffset.left
    }
Run Code Online (Sandbox Code Playgroud)

  • 但是 `viewportOffset.bottom` - `viewportOffset.top` 仍然会将 `height` 设为 0。 (10认同)