在 Chrome 中查看元素大小

Posted

技术标签:

【中文标题】在 Chrome 中查看元素大小【英文标题】:Watch element size in Chrome 【发布时间】:2014-01-07 18:56:49 【问题描述】:

因此,当手动调整元素大小时,Chrome apparently has a bug 无法使用 MutationObserver 观察元素的大小。

在修复错误之前,我应该使用什么来代替或补充它才能在 Chrome 中进行这项工作?我应该使用deprecated mutation events 还是有其他更好的选择?

有没有办法在 AngularJS 中做到这一点而不使用元素对象?

【问题讨论】:

【参考方案1】:

要查看元素的大小,您有以下选项:

使用MutationObserver,您可以观察手动调整元素大小时元素的属性变化。这个is a bug in Chrome。

您可以使用 javascript 在计时器间隔内不断轮询元素大小,但您已表明这不是您希望使用的东西。

我知道的最后一个选项是使用CSS element queries。

最后一个选项的工作原理是所有浏览器都支持元素的溢出事件。它将改变您现有页面的布局,强制您正在调整的元素相对或绝对定位。如果你有一个简单的页面和简单的 css 完全没有问题,但更复杂的布局可能会遇到问题。

【讨论】:

用 Angular 做这件事只是可选的。我的主要问题是如何在没有 MutationObserver 的情况下做到这一点,如果可能的话,可能没有突变事件。必须有比使用超时更好的方法。 好吧,那么没有角度。用我找到的marcj.github.io/css-element-queries 的链接修改了我的答案。 我倾向于相信这里使用 css 元素查询的所有答案是MutationObserver 的唯一有效替代方案,谢谢。【参考方案2】:

在 Angular 的作用域上使用观察器

$scope.$watch(function() 
  // whatever element you want to watch
  return $element.height();
, function(newVal, oldVal) 
  // do something
);

我的最佳出价是,当您调整任何元素的大小时,如果您在页面上完全使用 Angular,则可能会在另一个摘要周期内完成。要解决此问题,您可以在手动调整元素或窗口大小时使用 $scope.$apply() 手动触发消化。

// example to manual trigger digest with $apply()
app.run(function($window, $rootScope) 
  angular.element($window).on('resize', function() 
    $rootScope.$apply();
  );
);

这比setTimeout 好,因为它确实浪费了很多函数调用来检索高度。它仅在状态可能发生变化时检索。在跨浏览器使用时,这也比MutationObserverMutationEvents 更可靠。更何况我 不要相信MutationObserverMutationEvents 会监控元素的尺寸。

【讨论】:

如果我使用$element[0].clientHeight,这是否也有效,或者我是否会遇到跨浏览器问题?它只需要在较新的 Chrome/Firefox 中运行。 @Mouagip 你可以使用clientHeight,我知道没有任何问题。 正如here 所说,这种方法的问题是,手动调整元素大小不会触发摘要。 @Mouagip 我最好的出价是,当您调整任何元素的大小时,如果您在页面上完全使用角度,则很可能在另一个摘要周期内完成。要解决此问题,您可以在手动调整元素或窗口大小时使用 $scope.$apply() 手动触发消化。 我可以告诉你,MutationObserver 和突变事件可以在手动调整元素大小的情况下监控元素的尺寸。我认为MutationObserver 将是这里介绍的所有其他解决方案中最好的解决方案,如果不是因为 Chrome 中的错误...【参考方案3】:

我的建议,

首先,为要观察高度的元素设置一个指令

其次,在指令中添加一个空的观察者,如doc 所说的这样

If you want to be notified whenever $digest is called, 
you can register a watchExpression function with no listener.(Since 
watchExpression can execute multiple times per $digest cycle when a 
change is detected, be prepared for multiple calls to your listener.)

指令

scope.$watch( function()
  scope.elHeight = element.height(); // or element.offsetHeight;
;

第三,在控制器中为这个高度设置一个观察者

控制器

$scope.$watch('elHeight',  function(newVal, oldVal)
  console.log(newVal, oldVal)
;

每一个 $digest 意味着范围内每一个 Angular 相关的变化。

--- 编辑 --- 这涵盖了大多数 angular-js 相关事件。但是它不包括手动调整大小,即窗口大小调整、香草 JavaScript 大小调整等。

如果我使用 AngularJS,我会在整个页面中完全使用 Angular。因此, 对于这种情况,我会触发小事件来调用 $digest。

【讨论】:

如果我可以在不使用 jQuery 的情况下获得元素的高度,这将起作用(请参阅我的 comments here)。 手动调整元素大小时不会触发摘要 如果没有 jquery,我会使用 element[0].offsetHeight。对于手动调整大小,我会使用 $element.on(...) 触发事件 $element.on() 将使用已弃用的突变事件。但也许我会在 Chrome 中的错误修复之前使用它。 @allenhwkim 你会使用哪些事件?【参考方案4】:

我在制作一些响应式元素时遇到了类似的问题,所以我最终使用了 window.onresize:

window.onresize = function()
        //do element changes here
        $scope.$apply();
    ;

不确定这是否是您正在寻找的,但这种方法对我来说效果很好。

【讨论】:

如果您想查看窗口大小,这将是一个解决方案。但是我必须注意可以独立于窗口调整大小的元素的大小。

以上是关于在 Chrome 中查看元素大小的主要内容,如果未能解决你的问题,请参考以下文章

查找导致在 Google Chrome 中显示水平滚动条的元素

在 chrome 开发工具/firebug 中保留 DOM 元素突出显示

Chrome中的Flexbox——如何限制嵌套元素的大小? [复制]

Chrome 开发工具可以显示元素大小的来源或原因吗?

chrome 开发者工具,查看元素 hover 样式

如何在 chrome 开发工具中同时查看元素选项卡和源选项卡