为了解释这一点,我将从一个更简化的示例开始,它会产生相同的输出:
<div style="display:inline-block">
<img src="https://via.placeholder.com/1000x100">
</div>
<div style="display:inline-block">
<img src="https://via.placeholder.com/1000x100" style="max-width:100%">
</div>
<div style="display:inline-block">
<!-- even a big explicit width specified won't change the behavior -->
<img src="https://via.placeholder.com/1000x100" style="wdith:2000px;max-width:100%">
</div>
<div style="display:inline-block">
<img src="https://via.placeholder.com/1000x100" style="width:100%">
</div>
我们有一个inline-block 元素,所以它的宽度取决于它的内容,使用max-width:100%(或width:100%)会给我们带来奇怪的结果。
要理解这一点,我们需要参考规范,更准确地说是Percentage Sizing 部分,我们可以阅读:
有时,百分比大小的盒子的包含块的大小取决于盒子本身的内在尺寸贡献,从而产生循环依赖 .当计算这样一个盒子的内在尺寸贡献时(包括任何基于内容的自动最小尺寸的计算),一个循环百分比 - 即一个百分比值,它将针对本身取决于该百分比的包含块大小进行解析 - 是特别解决:
我们的盒子是图片,包含块是inline-block div。图片是替换元素,所以我们需要按照 (b) 和 (c) 来识别 最大内容贡献 和 最小内容贡献
b.同样,如果盒子被替换,那么任何最大尺寸属性或首选尺寸属性的整个值都被处理为包含循环百分比的表达式以计算盒子的最大内容贡献 仅作为该属性的初始值。
将max-width/width 视为自动将保持最大内容贡献相同(在我们的例子中为1000px)。将改变的是 min-content 贡献:
c。如果盒子被替换,任何最大尺寸属性或首选尺寸属性(width/max-width/height/max-height)的值中的循环百分比,在计算 min-content 贡献时解决为零对应的轴。
因此图像的最小内容贡献将变为0,不再是1000px,这是基于其内在维度的初始最小内容贡献(相关:https://www.w3.org/TR/css-sizing-3/#intrinsic-sizes),所有技巧都在这里!
现在我们的 inline-block 是一个收缩到适合的元素,下面的算法适用:
那么收缩到适合的宽度是:min(max(preferred minimum width, available width), preferred width)。 ref
图像的贡献从0 到1000px 不等,因此浏览器将选择避免任何溢出的值(可用宽度部分)并且不大于1000px (min 部分)
如果不使用百分比,图像的最小内容为1000px,因此浏览器必须使用1000px 和1000px 之间的值作为首选最小宽度 div 图像的固有尺寸宽度。
这一切只是div宽度的计算。在此之后,我们将计算出的宽度作为百分比值的参考。
我们也可以考虑不同的值,逻辑是一样的:
div {
border:2px solid red;
margin:5px;
}
<div style="display:inline-block">
<img src="https://via.placeholder.com/1000x100">
</div>
<div style="display:inline-block">
<img src="https://via.placeholder.com/1000x100" style="max-width:80%">
</div>
<div style="display:inline-block">
<img src="https://via.placeholder.com/1000x100" style="width:50%">
</div>
上述逻辑以相同的方式应用于您的代码,因为您的列设置为auto,这意味着它的大小取决于其内容,也是图像的包含块。