【问题标题】:flex-basis: Webkit / Blink ignore intrinsic aspect ratioflex-basis:Webkit / Blink 忽略固有纵横比
【发布时间】:2015-04-18 06:14:26
【问题描述】:

给定一个弹性容器

figure {
  display: flex;
  align-items: flex-start;
}

还有一个 300x300 的图像,其 flex-basis 设置为其固有宽度的一半:

figure img {
  flex: 0 0 150px;
}

Chrome 41 和 Safari 7 会忽略纵横比并将其显示为 150px x 300px:

另一方面,Firefox 35 保持固有纵横比不变:

figure {
  display: -webkit-box;
  display: -moz-box;
  display: box;
  display: -webkit-flex;
  display: -moz-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-align: start;
  -moz-box-align: start;
  box-align: start;
  -webkit-align-items: flex-start;
  -moz-align-items: flex-start;
  -ms-align-items: flex-start;
  -o-align-items: flex-start;
  align-items: flex-start;
  -ms-flex-align: start;
  
  width: 100%;
  border: 1px solid black;
}

figure img {
  -webkit-box-flex: 0;
  -moz-box-flex: 0;
  box-flex: 0;
  -webkit-flex: 0 0 150px;
  -moz-flex: 0 0 150px;
  -ms-flex: 0 0 150px;
  flex: 0 0 150px;
}

figure figcaption {
  -webkit-box-flex: 1;
  -moz-box-flex: 1;
  box-flex: 1;
  -webkit-flex: 1 1 auto;
  -moz-flex: 1 1 auto;
  -ms-flex: 1 1 auto;
  flex: 1 1 auto;
}
<figure>
  <img src="//placekitten.com/g/300/300" />
  <figcaption>
    I'm the caption
  </figcaption>
</figure>

谁是正确的?我相信规范的相关部分是Cross-size determination,但我很难解释它。

【问题讨论】:

  • 我是 猜测 Chrome/Safari 是对的,bc flex 孩子不再是图像。它们是具有设定高度(bc 内容)和现在宽度的块。虽然很烦人...
  • @Rudie,是的,这会很烦人,因为 Firefox 的行为对我来说更有意义。规范中让我怀疑你可能是对的部分是通过使用使用的主要尺寸和可用空间执行布局来确定每个项目的假设交叉尺寸,将自动视为适合内容。另一方面,在我的示例中,没有其他内容适合 - 图像 flex 子项是确定 flex 行高度的那个。
  • 基于most recent spec 支持项目比率的坚持,似乎 Firefox 实现部分正确,但我希望在这种情况下它将图像大小调整为 150x150。
  • @Rudie:虽然弹性项目可以是弹性容器,但它们永远不能内联。弹性项目上的display: inline-flex 将改为display: flex。项目总是在 flex 格式化上下文中格式化,它既不是块 FC 也不是内联 FC,但行为更像前者。此外,作为对您的第一条评论的回应:img 是一个替换元素,无论它是内联元素还是弹性项目,都不应该改变。出于这个原因,它应该保持其内在维度。但我对 flexbox 不够熟悉,无法完全回答这个问题。
  • 我倾向于认为 Webkit/Blink 渲染引擎在这里是错误的。去年我写了一个类似的演示,它更简单(图像不是 flex 容器),看看在最后一个示例中添加 object-fit 属性时会发生什么:codepen.io/cimmanon/pen/Azone?editors=110

标签: css flexbox


【解决方案1】:

根据当前 Flexbox 规范的 editors draft这些浏览器都不能正确呈现此内容

当我看到这里发布的这个问题时,我在 www 风格的邮件列表中询问了这个问题,这是discussion it prompted(来自 readable-email.org):

一致认为,对当前草案的严格解释会建议图像大小为 300x300 像素,因为这是弹性项目的最小内容大小,并且如果弹性项目的最小内容大小不应该缩小到其最小内容大小以下-size 属性是 auto (默认值,在您的示例中也是如此)。

Daniel Holbert(Firefox 上的 Flexbox 实现者)继续在 another thread 上进行此讨论,他建议具有内在纵横比的项目应该被允许缩小到其最小内容大小以下。他说:

对于具有纵横比的弹性项目,最小内容大小并不是一个有用的下限。这些 flex 项目可以缩小(尊重它们的固有纵横比)低于它们的最小内容大小,而不会溢出。

无论如何,正如我所说,您的问题的答案是,这两个浏览器都没有正确呈现(根据当前规范),但规范可能会更改以处理这种情况以及 Firefox 当前呈现它的方式将来会被认为是正确的。

【讨论】:

  • 非常感谢您的回答,更感谢您将此问题带到 www-style。我希望规范会根据 Daniels 的提议进行修改; flex-basis 在这种情况下基本上被忽略是非常违反直觉的。
  • 不客气。我同意 Daniel 的提议是一个更好的方法,所以我也希望如此。
  • 如果这是真的,那么 Opera (Presto) 是唯一能正确执行此操作的浏览器。
  • @cimmanon 如果 Opera (Presto) 正确执行此操作,则它是偶然这样做的。自从 Opera 改用 Blink 以来,关于这个问题的规范已经改变了好几次。
猜你喜欢
  • 2013-10-31
  • 2011-10-26
  • 2015-05-06
  • 2018-11-10
  • 2014-06-15
  • 2019-06-29
  • 1970-01-01
  • 1970-01-01
  • 2021-12-24
相关资源
最近更新 更多