最高身高的孩子:100%溢出父母

iam*_*eir 123 css

我试图了解对我来说似乎是出乎意料的行为:

我在容器内部有一个最大高度为100%的元素,该元素也使用了最大高度,但是,出乎意料的是,子元素溢出了父元素:

测试用例:http://jsfiddle.net/bq4Wu/16/

.container {  
    background: blue; 
    padding: 10px; 
    max-height: 200px; 
    max-width: 200px; 
}

img { 
    display: block;
    max-height: 100%; 
    max-width: 100%; 
}
Run Code Online (Sandbox Code Playgroud)

但是,如果父级具有明确的高度,则这是固定的:

测试用例:http://jsfiddle.net/bq4Wu/17/

.container {  
    height: 200px;
}
Run Code Online (Sandbox Code Playgroud)

有谁知道为什么孩子在第一个例子中不会尊重其父母的最大身高?为什么需要明确的高度?

Bol*_*ock 177

当您为max-height孩子指定百分比时,它是父母的实际身高的百分比,而不是父亲的百分比max-height,奇怪的是.这同样适用于max-width.

因此,当您没有在父级上指定显式高度时,则没有用于max-height计算子级的基本高度,因此max-height计算none,允许子级尽可能高.现在作用于孩子的唯一其他约束是max-width它的父,并且因为图像本身比它宽,所以它向上溢出容器的高度,以便保持其纵横比,同时仍然尽可能大.

当你指定家长一个明确的高度,那么孩子知道它是在显式高度的至多100%.这允许它被约束到父亲的身高(同时仍然保持其纵横比).

  • 我不确定接受哪个答案 - 这个答案是'为什么'. (7认同)
  • 就我而言,执行“display: flex;” flex-direction: column` 解决了问题并添加了我想要的滚动条。 (5认同)
  • 这是一个有用的解释,尤其是与我朋友输入的内容混合在一起:“最大高度:100%(子代),最大高度:100%(父代)= 0-这就是为什么您的孩子不尊重其父代价值”。 (3认同)
  • 我只回答了“为什么”,因为我不确定你的目标是什么,因为没有明确提及。也许如果你详细说明一下,我可以回答。 (2认同)
  • 接受这个,因为它回答了我的实际问题,谢谢。请注意@Daniel 下面的回答提供了解决方案。 (2认同)

Dan*_*iel 62

.container {
  background: blue;
  padding: 10px;
  max-height: 200px;
  max-width: 200px;
  float: left;
  margin-right: 20px;
}

.img1 {
  display: block;
  max-height: 100%;
  max-width: 100%;
}

.img2 {
  display: block;
  max-height: inherit;
  max-width: inherit;
}
Run Code Online (Sandbox Code Playgroud)
<!-- example 1  -->
<div class="container">
  <img class='img1' src="http://via.placeholder.com/350x450" />
</div>

<!-- example 2  -->

<div class="container">
  <img class='img2' src="http://via.placeholder.com/350x450" />
</div>
Run Code Online (Sandbox Code Playgroud)

我玩了一下.在firefox中的较大图像上,使用inherit属性值得到了很好的结果.这对你有帮助吗?

.container {
    background: blue;
    padding: 10px;
    max-height: 100px;
    max-width: 100px;
    text-align:center;
}

img {
    max-height: inherit;
    max-width: inherit;
}
Run Code Online (Sandbox Code Playgroud)

  • 我不确定要接受哪个答案 - 这个答案是“修复”。 (2认同)
  • 除了@BoltClock之外,我的回答就是按照他说的去做。CSS 只是告诉计算机如何处理一个元素,但在计算之后,它会将所有值分隔为渲染所需的基本值,例如高度、宽度、颜色、坐标……继承属性告诉 img取父级的“计算”值。因此,您可以在 max-height 和 max-width css 属性中获得高度和宽度的计算值。 (2认同)
  • 当`max:height:100%`而不是固定高度时,这不起作用:http://jsfiddle.net/umbreak/n6czk9xt/1/ (2认同)
  • 我不能将宽度和高度声明为固定因为我的布局响应`显示:flex;`.我打开了一个新线程:我打开了我的新线程:http://stackoverflow.com/questions/29732391/make-img-responsive-and-fill-into-a-div但是,在更糟糕的情况下,我可以使用Jquery来获取img的实际宽度和高度,并将它们设置在父图像的div中. (2认同)

小智 7

我在这里找到了解决方案:http : //www.sitepoint.com/maintain-image-aspect-ratios-sensitive-web-design/

之所以可行,是因为它存在于元素的宽度和填充底部之间的关系。所以:

父母:

container {
  height: 0;
  padding-bottom: 66%; /* for a 4:3 container size */
  }
Run Code Online (Sandbox Code Playgroud)

子级(删除与width有关的所有CSS,即width:100%):

img {
  max-height: 100%;
  max-width: 100%;
  position: absolute;     
  display:block;
  margin:0 auto; /* center */
  left:0;        /* center */
  right:0;       /* center */
  }
Run Code Online (Sandbox Code Playgroud)


Tia*_*Lin 6

与 max-height: 100%/100% 不同,填充所有空间的另一种方法是将position: absolutetop/bottom/left/right 设置为 0。

换句话说,HTML 将如下所示:

<div class="flex-content">
  <div class="scrollable-content-wrapper">
    <div class="scrollable-content">
      1, 2, 3
    </div>
   </div>
</div>
Run Code Online (Sandbox Code Playgroud)
.flex-content {
  flex-grow: 1;
  position: relative;
  width: 100%;
  height: 100%;
}

.scrollable-content-wrapper {
  position: absolute;
  left: 0;
  right: 0;
  top: 0;
  bottom: 0;
  overflow: auto;
}

.scrollable-content {
}
Run Code Online (Sandbox Code Playgroud)

您可以在Codesandbox 中看到一个实时示例- CSS Flex/Grid 中的溢出

  • 如果您需要容器能够在溢出时滚动,并且是其父级的大小而不增加父级的高度,那么这是唯一有效的解决方案。惊人的。 (2认同)

Lui*_*ira 5

您可以使用属性object-fit

.cover {
    object-fit: cover;
    width: 150px;
    height: 100px;
}
Run Code Online (Sandbox Code Playgroud)

喜欢这里建议

Chris Mills 在 Dev.Opera中对该属性完整解释

还有一个更好的 CSS-Tricks

它支持

  • 铬 31+
  • Safari 7.1+
  • 火狐 36+
  • 歌剧 26+
  • 安卓 4.4.4+
  • iOS 8+

我刚刚检查了 vivaldi 和 Chromium 也支持它(这并不奇怪)

目前 IE 不支持它,但是...谁在乎?此外,iOS 支持 object-fit,但不支持 object-position,但很快就会支持。