确定哪个 DOM 元素导致父元素的尺寸增加

Posted

技术标签:

【中文标题】确定哪个 DOM 元素导致父元素的尺寸增加【英文标题】:Determining which DOM element is causing the dimensions to increase for a parent element 【发布时间】:2021-06-03 17:46:00 【问题描述】:

当网站未包含在移动视口中时,有时我会遇到此问题,我需要确定导致宽度超出的原因。

通常我会通过反复试验来隐藏不同的元素,直到元素重置为所需的 100% 宽度。然后我对每个子元素重复,直到找到导致它的那个。

在 Firefox 或 Chrome 开发工具(或使用插件)中是否有办法查看哪个 DOM 子元素决定了当前元素的尺寸?

【问题讨论】:

【参考方案1】:

确定是什么定义了元素的计算宽度和高度可能非常棘手。 Chrome 和 Firefox DevTools 都没有提供在所有情况下获取该信息的简单方法。据我所知,也没有任何扩展可以使这更容易。不过,Firefox DevTools team started a discussion on this 是前段时间。

元素可能比预期更宽或更高的原因有两个:元素本身或其后代元素之一上的某些 CSS 或某些文本。

在没有其他解决方案的情况下,隐藏或移除元素的解决方案可能是最快的解决方案。

不过,这里有一些提示如何使用 DevTools 来确定定义元素的宽度和高度:

    选择元素并在 Computed 侧面板中检查计算值是否通过 CSS 规则定义。展开 widthheight 的条目以查看应用了哪些 CSS 规则。还要检查min-widthmax-widthmin-heightmax-height 以及其他与布局相关的属性,如marginborderpadding,还有`line-height 等! 检查元素内的文本是否影响其宽度或高度。像空格这样没有中断机会的长词可能是罪魁祸首,还有像white-space: nowrap这样的CSS属性定义。 当您检查了上述元素本身并找不到原因时,宽度或高度受到一个或多个后代元素的影响。所以你需要为他们重复这两个步骤。 a) 要快速查看直接子元素的尺寸,首先按 展开元素(如果尚未展开),然后按 切换它们。在逐步浏览它们时,检查它们的 CSS 和文本,如第 1 步和第 2 步中所述。 b) 当您看到一个与您正在观察的元素一样宽的元素时,重复上一步以在 DOM 结构中再向下一层。

上述步骤也可以通过使用一些 javascript 遍历树并检查元素宽度或高度来自动化。一个相对简单的 sn-p(可以在 DevTools 控制台中执行)是

rootElement = $0;
rootWidth = rootElement.getBoundingClientRect().width;
walker = document.createTreeWalker(rootElement, NodeFilter.SHOW_ELEMENT, 
  acceptNode: element =>
    element.getBoundingClientRect().width === rootWidth ?
      NodeFilter.FILTER_ACCEPT :
      NodeFilter.FILTER_SKIP
);

currentNode = walker.currentNode;
while (currentNode) 
  console.log(currentNode);
  currentNode = walker.nextNode();

$0 指的是当前选定的元素。

【讨论】:

root应该是JS代码中的rootElement。 正确!修复。非常感谢您的提示!

以上是关于确定哪个 DOM 元素导致父元素的尺寸增加的主要内容,如果未能解决你的问题,请参考以下文章

子元素初始化后,父组件对子 DOM 的操作导致 ExpressionChangedAfterItHasBeenCheckedError

父相子绝导致父元素没有高度,坍塌问题

如何将元素移动到 DOM 中的下一个父元素?

Vue.js 获得兄弟元素,子元素,父元素(DOM操作)

Vue.js 获得兄弟元素,子元素,父元素(DOM操作)

DOM元素尺寸与位置