【问题标题】:Remove excess width on parent when child elements wrap子元素换行时删除父元素上的多余宽度
【发布时间】:2015-09-04 02:07:35
【问题描述】:

我有一个带有背景颜色的display: inline-block; div 容器。

在这个 div 中,我添加了更多的矩形 div 与 float:left 并排。

当一行的所有 div 没有足够的空间时,下一个被添加到其他的下面,在页面的右侧留下一个空白空间。剩下的空白区域具有容器背景的颜色,但我希望它是白色的。

左边的图像是它目前的样子。右边的图像是它应该看起来的样子;父母的背景应该收缩围绕它的孩子:

这是下面的jsfiddle

.bigDiv {
  background-color: #aaa;
  display: inline-block;
}
.item {
  height: 50px;
  width: 150px;
  background-color: #000;
  float: left;
  margin: 10px;
}
<div class="bigDiv">
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
</div>

【问题讨论】:

  • 你要连续四个吗?
  • 所以你想拉伸行中的最后一个 div 以填充空间直到行尾?你尝试了什么?
  • 只使用百分比并将它们放在一起?
  • 你能发布一些 CSS 和 HTML 吗?这些东西是可变宽度还是固定宽度?
  • 在 SO 上的某处存在一个重复的问题,该问题提供了 javascript 解决方案。只有这样才有可能。我记得大约一年前。

标签: html css


【解决方案1】:

创建“伪背景”

我刚刚想出了一个有点……创造性的解决方案:

  • 父级没有背景,只有填充和overflow: hidden

  • 每个子 div 都有一个 ::before 伪元素,它将创建一个“伪背景”(z-index: -1 将其移动到 div 背景后面)

  • 伪背景以topleftright 定位,负值会将它们拖到 div 填充中。

  • height: 1000% 可以是任何荒谬的数字,只要它足够高以覆盖每一行 div。多余的部分被父 div 上的overflow: hidden 干净地切断

这是每个 div 的样子,黑色边框是父级的边缘,也就是黄色“伪背景”被切断的地方:

变成这样:

注意:这是一个纯粹的视觉思维实验,在某些情况下可能有用。 div 仍然占据相同的宽度,只是没有背景颜色。

示例

调整它的大小,看看“伪背景”如何在所有宽度下工作。

.wrapper {
  overflow: hidden;
  padding: 10px 0 0 10px;
  width: 70%;
}
.wrapper > div {
  height: 40px;
  background: #F00;
  margin: 0 10px 10px 0;
  width: 200px;
  float: left;
  position: relative;
}
.wrapper > div::before {
  content: '';
  position: absolute;
  background: rgba(255, 255, 0, 1);
  left: -10px;
  right: -10px;
  top: -10px;
  z-index: -1;
  height: 1000%;
}
<div class="wrapper">
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>

</div>

【讨论】:

  • 显然这只是一个视觉解决方案,因为实际容器仍将具有 extra 宽度。不过很有趣。
  • 正是我想要的。我不想使用额外的宽度,所以它对我来说是完美的!谢谢。如果有人可以给我一个链接,解释为什么这样做如此复杂,我会喜欢的!
【解决方案2】:

这是&lt;table&gt; 或更好的完美用例,FlexBox

预览:

片段:

.flex-container {
  margin: 10px;
  display: -ms-flexbox;
  display: -webkit-flex;
  display: flex;
  -webkit-flex-direction: row;
  -ms-flex-direction: row;
  flex-direction: row;
  -webkit-flex-wrap: wrap;
  -ms-flex-wrap: wrap;
  flex-wrap: wrap;
  -webkit-justify-content: flex-start;
  -ms-flex-pack: start;
  justify-content: flex-start;
  -webkit-align-content: stretch;
  -ms-flex-line-pack: stretch;
  align-content: stretch;
  border: 1px solid #999;
}

.flex-item {
  -webkit-order: 1;
  -ms-flex-order: 1;
  order: 1;
  -webkit-flex: 1 1 auto;
  -ms-flex: 1 1 auto;
  flex: 1 1 auto;
  -webkit-align-self: auto;
  -ms-flex-item-align: auto;
  align-self: auto;
  border: 1px solid #99f;
  margin: 5px;
  min-width: 30%;
}
<div class="flex-container">
  <div class="flex-item">Hello</div>
  <div class="flex-item">Hello</div>
  <div class="flex-item">Hello</div>
  <div class="flex-item">Hello</div>
</div>

<div class="flex-container">
  <div class="flex-item">Hello</div>
  <div class="flex-item">Hello</div>
  <div class="flex-item">Hello</div>
</div>

<div class="flex-container">
  <div class="flex-item">Hello</div>
  <div class="flex-item">Hello</div>
</div>

相同的 CSS,无限的条目。

【讨论】:

  • 在这种情况下,我不认为......这不是他想要的,......至少据他所知。
  • @Paulie_D 查看我更新的 sn-p。刚刚更新。
  • 我想你误解了我的问题。我不希望所有的 div 都排成一行,我对它们的定位方式很好。我想要的是带有背景颜色的封闭 div 不填充页面的所有宽度,而是停在第一行的第三个 div 处,右侧没有灰色边距,如屏幕截图所示
  • @PraveenKumar 我做了一个小提琴并添加了一个截图来更好地解释我做了什么以及我想要什么
  • 在 SO 上的某处存在一个重复的问题,该问题提供了 javascript 解决方案。只有这样才有可能。我记得大约一年前。
猜你喜欢
  • 2022-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
相关资源
最近更新 更多