getBoundingClientRect() 返回错误的宽度

Posted

技术标签:

【中文标题】getBoundingClientRect() 返回错误的宽度【英文标题】:getBoundingClientRect() returning wrong width 【发布时间】:2017-04-30 13:31:45 【问题描述】:

我将Angular Material 用于我的网格系统。我正在尝试生成一个 SVG,它应该向我显示元素的宽度,但它是 getBoundingClientRect() 正在返回 300px,尽管宽度是 618px。我再次尝试让我的窗口变小,但它仍然显示为300px,尽管这次它实际上是100px..

这是我的 html

<div layout="row" layout-wrap layout-padding>
    <div flex="33" ng-repeat="result in ctrl.results">
        <svg   position>
          <rect x="0" y="0"   fill="#da552f"></rect>
          <text fill="#ffffff" x="50%" y="50%" alignment-baseline="middle" text-anchor="middle" font-size="48" font-family="Verdana">Hello World</text>
        </svg>
    </div>
</div>

这是我的 position 属性的 angularjs 指令:

var app = angular.module('MainDirective', []);

app.directive('position', function () 
    return 
        restrict: 'A',
        link: function ($scope, element, attrs) 
            var rect = element[0].getBoundingClientRect();
            var text = element.children()[1].getBBox();
            console.log(rect)
        
    ;
);

我的项目中没有自定义 CSS。

任何想法为什么会发生这种情况?我尝试了很多不同的getBoundingClientRect() 变体,但它们都返回了300...

编辑:作为证明:

【问题讨论】:

你在哪里检查 .width.getBoundingClientRect() 对象? @guest271314 在console.log(rect) 内...我想从技术上讲你可以做到console.log(rect.width) element[0] div 元素吗? console.log(window.innerWidth)console 登录什么? “尽管宽度为618px,但返回300px 哪个元素width 设置为618px“我的项目中没有自定义 CSS” 如何将元素 width 设置为 618px element[0] is the SVG and console.log(window.innerWidth)` 返回1920。当我检查 Chrome 开发工具并将鼠标悬停在 SVG 上时,它显示为 618px.. 内部 rect svg 元素的width 在元素&lt;svg height="100%" width="100%" position&gt; 处设置为100%,而不是618pxconsole.log(document.querySelector("svg").width.animVal.valueAsString, window.getComputedStyle(document.body).width). 【参考方案1】:

我弄清楚我的问题是什么。我应该使用 angulars $scope.$watch,因为我在事件点击时生成 svg

var app = angular.module('MainDirective', []);

app.directive('position', function () 
    return 
        restrict: 'A',
        link: function ($scope, element, attrs) 
            var rect, image, text;
            $scope.$watch(element, function () 
                rect = element[0].clientWidth;
                image = element.children()[1].getBBox();
                text = element.children()[2].getBBox();
                console.log("Rect: "+rect+" image: "+image.width+" text: "+text.width)
            );
        
    ;
);

【讨论】:

以上是关于getBoundingClientRect() 返回错误的宽度的主要内容,如果未能解决你的问题,请参考以下文章

Element.getBoundingClientRect()

getBoundingClientRect();不工作..?

js中getBoundingClientRect()方法详解

js中getBoundingClientRect( )方法

JS获得元素相对位置坐标getBoundingClientRect()

getBoundingClientRect用法