CSS - 填充(或边距)不调整容器大小

CSS - padding (or margin) not resizing the container

感谢您花时间阅读本文。

我正在尝试使用 CSS 进行一些简单的布局,其中我有一个容器 div,并且两个 children 使用 inline-block 并排设置:

<div class="info-window">
    <img class="image" src="myURL"/>
    <div class=description">some content</div>
</div>

在 CSS 中,我设置了我的容器高度,自动调整图像大小,使其高度为 100% 并保持比例,并且我没有为描述指定任何大小(我希望它将由它的内容)。

.info-window .image {
  display: inline-block;
  vertical-align: top;
  height: 100%;
  width: auto;
}

.info-window .description {
  display: inline-block;
  vertical-align: top;
}

这工作得很好,直到我尝试在两个元素之间添加一些填充或边距。示例:在描述中添加padding-left,即右侧的项目。请注意,行为与图像上的 padding-ight 或边距相同。

.info-window .description {
  display: inline-block;
  vertical-align: top;
  padding-left: 5%;
}

当我这样做时,容器的大小不适合其 children 的总宽度。看起来大小是在添加填充之前计算出来的。

您可以在此处查看 fiddle:https://jsfiddle.net/tot22292/ 看右边的文字是怎么裁剪的。

我确实搜索了一些修复程序,但是 box-sizing:border-box;在描述的总大小中包含填充和边框并不能解决问题。

我可能错过了一些简单的东西,但这让我发疯了,所以我来了:)

谢谢!

您可以将 width 元素更改为基于百分比而不是 auto,并使用基于像素的填充而不是使用百分比。

.info-window .image {
  display: inline-block;
  vertical-align: top;
  width:50%;
  height: auto;
}

.info-window .description {
  display: inline-block;
  vertical-align: top;
  width:50%;
  padding-left: 10px;
}

Fiddle: https://jsfiddle.net/wrt9v9xs/2/

(决定把这个做成答案。希望有人可以填写 "why" 浏览器如何确定填充。)

我没有任何规格的 link 但这绝对是因为填充是百分比值。这也是有道理的。填充或边距的百分比值是相对于父级宽度的。如果样式的行为符合您的预期,则它必然会更改父宽度。

基本上,对于您当前的代码,填充会影响宽度,而宽度会影响填充。为了解决这个问题,浏览器的渲染引擎似乎只使用预填充的宽度来避免无限循环。 "solution" 将使用静态填充值而不是百分比。

.info-window {
  display: inline-block;
  white-space: nowrap;
  overflow-x: hidden;
}

.info-window .image {
  display: inline-block;
  vertical-align: top;
  height: 100%;
  width: auto;
}

.info-window .description {
  display: inline-block;
  vertical-align: top;
  padding-left: 2em;
}

.info-window .title {
  font-size: 24px;
  font-weight: bold;
  color: #000;
  white-space: nowrap;
}
<div id="test" style="height:150px;">
  <div class="info-window">
    <img class="image" src="//placehold.it/312" />
    <div class="description">
      <span class="title">Some text</span>
      <br/> 5
    </div>
  </div>
</div>

编辑:
好的,这是规范中解决的地方。

If the containing block's width depends on this element, then the resulting layout is undefined in CSS 2.1.

8.4 Padding properties

值未定义意味着它取决于渲染引擎,因此听起来 chrome 至少只是决定使用值的预填充宽度进行故障转移。