【发布时间】: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