【问题标题】:Flexed child with overflow respects parent's max-height in Chrome, not in Firefox带有溢出的弯曲孩子在 Chrome 中尊重父母的最大高度,而不是在 Firefox 中
【发布时间】:2017-06-27 17:20:40
【问题描述】:

我有一个带有 max-height 的 flexbox 容器。它有两个孩子,水平弯曲,其中一个有overflow: auto。在 Chrome 中,溢出的子元素一旦达到容器的最大高度就会停止增长并滚动。在 Firefox 中,它会溢出容器。

我正在针对最新的 Chrome(目前为 59)进行开发,但必须支持 Firefox 40+,因此我正在使用 Firefox 40 进行测试。作为参考,caniuse.com 报告为 FF40 fully supports flexbox

这显然在较新的 FF 版本中正常工作,但在我正在使用的 FF40 中却不能正常工作,所以对于那些无法访问旧 FF 的人,这里是我看到的行为的屏幕截图:

Firefox 40

Chrome 59

我可以通过消除左侧的孩子并在容器上设置flex-direction: column 来解决此问题,但不幸的是,我的实际应用程序需要左侧的内容并且需要水平弯曲。

为什么会出现跨浏览器的差异?有什么跨浏览器解决方案可以让溢出的孩子像在 Chrome 中那样停止增长?

div { padding: 10px; }

#container {
  border: 1px solid green;
  display: flex;
  max-height: 200px;
}

#left {
  border: 1px solid purple;
  flex: 1;
}

#right {
  border: 1px solid orange;
  flex: 3;
  overflow: auto;
}
<div id="container">
  <div id="left">
    Left content
  </div>
  <div id="right">
    I stop growing at 200px tall in Chrome, but not in Firefox
    <ul>
      <li>Stuff</li>
      <li>Stuff</li>
      <li>Stuff</li>
      <li>Stuff</li>
      <li>Stuff</li>
      <li>Stuff</li>
      <li>Stuff</li>
      <li>Stuff</li>
      <li>Stuff</li>
      <li>Stuff</li>
      <li>Stuff</li>
      <li>Stuff</li>
      <li>Stuff</li>
    </ul>
  </div>
</div>

【问题讨论】:

  • 我在 Chrome、Firefox 和 Edge 上得到了完全相同的行为。看不出有什么不同。
  • 我应该报告我正在使用 Firefox 40 和 Chrome 58。所以我的 FF 版本有点旧,但 caniuse.com 确实说完全支持 flexbox。
  • 考虑这种可能性:stackoverflow.com/q/36247140/3597276
  • @dippas 您的建议没有帮助。我的问题是我必须支持那个浏览器版本,这意味着这不是我的决定。更多背景知识:我无法控制此特定应用程序的最低浏览器要求。这是我的客户规定的。我无权更改或提出更改建议。
  • @Michael_B:不同的问题。您链接到的问题描述了内容溢出其弹性项目父级的最小尺寸约束(以及您建议的解决方法),这与弹性项目溢出其父级弹性容器并具有最大尺寸约束有关。

标签: html css cross-browser flexbox


【解决方案1】:

为什么会出现跨浏览器的差异?

直到 2014 年,当前的行为(即 flex 项 do 尊重其父 flex 容器的最大尺寸限制)才在规范中,这解释了为什么 Firefox 的行为最初与 IE 相匹配。这首先由 IE 团队here 提出,并解决了here。这也意味着 Chrome 的行为在技术上与当时的规范有偏差,即使它是明智的。

该规范此后一直是updated to match Chrome's sensible behavior,这使得 IE 和 Firefox 的原始行为不兼容。不幸的是,Firefox 的实现直到今年随着 Firefox 51 的发布(甚至 Microsoft Edge 首次发布新行为)才更新,这就是旧行为的原因仍然存在于 Firefox 40 中。这就是为什么我倾向于不依赖 flexbox 的兼容性表的原因——三年前的情况远不如现在稳定。

请参阅 Bugzilla 中的 bug 1000957(也在 Fx 51 发行说明中链接到)。

有什么跨浏览器解决方案可以让溢出的孩子像在 Chrome 中一样停止增长?

正如您所发现的,在弹性项目而不是弹性容器上设置max-height 是您能做的最好的事情,因为弹性项目要么尊重或不尊重其弹性容器的宽度/高度限制。请注意,您的 flex 容器和 flex 项目中存在边框和填充,因此在为您的 flex 项目确定适当的max-height 时,您必须考虑这些因素。

【讨论】:

  • 堆栈溢出:最深奥和最晦涩的信息可以得到一些爱。大声笑..很好的答案。
  • @Michael_B:你甚至可以说……专家信息。
  • 哇,谢谢@BoltClock。这些是一些严肃的研究项目。欣赏它。你赚了那 100。
  • @Matt Powell:没问题。假设我确切地知道在哪里看;)
猜你喜欢
  • 2012-12-25
  • 2013-10-06
  • 1970-01-01
  • 1970-01-01
  • 2020-01-18
  • 1970-01-01
  • 2017-11-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多