html - Firefox 和 Chrome 中 Flexbox 的不同实现
问题描述
以下代码在 Firefox 中按预期工作,但在 Chrome 中,图像变得比 flex 容器大得多。
.r {
width: 100%;
height: auto;
min-width: unset;
max-width: 100%;
}
.container {
display: flex;
width: 600px;
}
<div class="container">
<img src="https://via.placeholder.com/1000x500" class="r" >
<img src="https://via.placeholder.com/1000x500" class="r" >
<img src="https://via.placeholder.com/1000x500" class="r" >
<img src="https://via.placeholder.com/1000x500" class="r" >
</div>
解决方案
以下代码在 Firefox 中按预期工作
我不同意这一点,因为对我来说,Chrome 的行为符合预期有两个原因:
您将图像的宽度设置为
100%
100% 的包含由 定义的块(容器)600px
。所以每张图片都会600px
由于默认配置,图像无法缩小到其内容大小
min-width
(请注意,在这种情况下 usingunset
等效于initial
,因此它在某种程度上是无用的)。所以图像将保持在600px
如果添加min-width:0
图像只会缩小宽度:
.r {
width: 100%;
/*height: auto; useless */
min-width: 0;
max-width: 100%;
}
.container {
display: flex;
width: 600px;
}
<div class="container">
<img src="https://via.placeholder.com/1000x500" class="r" >
<img src="https://via.placeholder.com/1000x500" class="r" >
<img src="https://via.placeholder.com/1000x500" class="r" >
<img src="https://via.placeholder.com/1000x500" class="r" >
</div>
chrome 的行为似乎已经改变,因此在上一个版本中不再需要以下内容
现在,如果我们考虑您所面临的高度,那么stretch
两个浏览器中的效果也不相同。解释1有点棘手,但是如果您更改默认对齐方式,您将在 chrome 中获得预期的结果:
.r {
width: 100%;
/*height: auto; useless */
min-width: 0;
max-width: 100%;
}
.container {
display: flex;
width: 600px;
align-items:flex-start;
}
<div class="container">
<img src="https://via.placeholder.com/1000x500" class="r" >
<img src="https://via.placeholder.com/1000x500" class="r" >
<img src="https://via.placeholder.com/1000x500" class="r" >
<img src="https://via.placeholder.com/1000x500" class="r" >
</div>
或者,如果您使用百分比值更改高度,您将使其失败并获得您想要的(这有点 hacky,因为我们正在触发另一个问题来修复实际问题)
.r {
width: 100%;
height:658%; /*any value here with %*/
min-width: 0;
max-width: 100%;
}
.container {
display: flex;
width: 600px;
}
<div class="container">
<img src="https://via.placeholder.com/1000x500" class="r" >
<img src="https://via.placeholder.com/1000x500" class="r" >
<img src="https://via.placeholder.com/1000x500" class="r" >
<img src="https://via.placeholder.com/1000x500" class="r" >
</div>
为什么 Firefox 会有这样的行为?
具体我不知道,但合乎逻辑的解释是,Firefox 没有考虑默认min-width
配置,而是优先考虑保持比例而不是拉伸效果。
1最初,您的图像定义了容器的高度,因为它们很大(大约 700 像素的高度),这个高度由容器使用,然后我们将属性应用于我们的图像,因此它们的宽度会缩小,并且由于默认对齐方式是拉伸它们将拉伸到最初由它们自己的初始高度定义的容器的高度,从而创建此渲染。
如果我们移除拉伸效果,图像将尝试保持它们的比例,因为我们移除了高度约束。
如果我们考虑高度的百分比值,则相同的逻辑。这将失败auto
,我们回到默认行为(保持纵横比)
另一种选择
该问题是由于使用图像替换元素而产生的,这些元素具有固有尺寸,其中宽度/高度的计算不像其他元素那么简单。
为了避免这种行为,最好将图像包装在 adiv
中,并避免将它们作为弹性项目。
.r {
width: 100%;
max-width: 100%;
}
.container {
display: flex;
width: 600px;
}
img {
max-width: 100%;
}
<div class="container">
<div class="r"><img src="https://via.placeholder.com/1000x500"></div>
<div class="r"><img src="https://via.placeholder.com/1000x500"></div>
<div class="r"><img src="https://via.placeholder.com/1000x500"></div>
<div class="r"><img src="https://via.placeholder.com/1000x500"></div>
</div>
推荐阅读
- audio - 通过css或js隐藏html5音频标签上的volumeControl
- yii - 试图找到一个不存在 Yii2 的文件
- python - 解决 HTTP 错误 400:在 Google Chrome 中使用工作链接的错误请求
- c++ - 如何处理具有未知数量参数的用户函数以进行性能测量?
- bash - 为什么詹金斯胜过简单的 bash 脚本?
- angular - 如何将数据从订阅存储/设置到外部变量并从Angular 7中的其他类再次读取
- javascript - 如何根据 JavaScript 条件更改标题颜色
- javascript - 使用 Javascript Range 使用键盘右/左移动输入文本的光标
- laravel - 从 centos 托管的 laravel 应用程序连接 db2 数据库
- android - 设计时视图属性作为图像问题