html - 如何让 flexbox 容器只延伸到最长的内部元素?

标签 html css flexbox

我正在尝试创建一行 flex 容器,每个容器都有几行,其中一些可能是 1 或 2 列宽:https://jsfiddle.net/f6ot3vce/1/

这就是我配置样式的方式(1 个水平行的 infoboxes,每个 infobox 包含 1 行或多行单列或 2 列(2x 50% 宽)项。

.infoboxes {
  display: flex;
  flex-direction: row;
  align-items: flex-start;
}

.infobox {
  border: 2px solid;
  margin: 2px;
  display: flex;
  flex-direction: row;
  flex-wrap: wrap;
  padding: 1px;
}

.infobox_item {
  flex-basis: 50%;
  align-self: flex-start;
}

.single_col {
  flex-basis: 100%;
}

但是我遇到了一个问题,即每个整体 flex 容器的宽度正在扩展以适合页面,而我更希望它适合每个容器的最长内部元素 - 而不再是(如果我清楚的话)示例)。

我需要做什么/改变什么? (以保持每个容器的 2 列彼此对齐的方式)。

最佳答案

恐怕如果不借助 hack 和/或 JavaScript 辅助手段,纯粹使用 display: flex 实现这样的布局是不可能的。这是因为这里有两个“冲突”的规则:信息框项希望是父项的 100% 或 50%(因此子项宽度取决于父项宽度),同时您希望信息框 (父级)以适应最长的信息框元素(因此父级宽度取决于子级宽度)

幸运的是,这种布局可以通过使用 css grid 实现.如果你可以不用 supported older browsers , 然后你可以得到如图所示的布局 a fork of your example ,或在下面的片段中:

.infoboxes {
  display: flex;
  flex-direction: row;
  background-color:orangered;
  align-items: flex-start;
}

.infobox {
  border: 2px solid;
  margin: 2px;
  display: grid;
  padding: 1px;
  background-color: cyan;
  grid-template-columns: repeat(2, 1fr);
  align-items: start;
}

.infobox_item {
  margin: 1px;
  background-color: yellow;
}

.single_col {
  grid-column: span 2;
}

.center {
  text-align:center;
}

body {
  margin: 0;
  padding: 0;
  font-family: monospace;
  font-size: 12px;
}
  <section class="infoboxes">
    <div class="infobox">
      <a class="infobox_item single_col center" href="localhost">Infobox Item (Single Column) (Centered)</a>
      <div class="infobox_item single_col">Infobox Item (Single Column)</div>
      <div class="infobox_item">Infobox Item</div>
      <div class="infobox_item">Infobox Item</div>
      <div class="infobox_item">A Really Really Really Really long Infobox Item</div>
      <div class="infobox_item">Infobox Item</div>
      <div class="infobox_item">Infobox Item</div>
      <div class="infobox_item">Infobox Item</div>
      <div class="infobox_item single_col center">Infobox Item (Single Column) (Centered)</div>
      <div class="infobox_item single_col center">Infobox Item (Single Column) (Centered)</div>
      <a class="infobox_item center" href="localhost">Infobox Item (Centered)</a>
      <a class="infobox_item center" href="localhost">Infobox Item (Centered)</a>
    </div>
    <div class="infobox">
      <a class="infobox_item single_col center" href="localhost">Infobox Item (Single Column) (Centered)</a>
      <div class="infobox_item">Infobox Item</div>
      <div class="infobox_item">Infobox Item</div>
      <div class="infobox_item">Infobox Item</div>
      <div class="infobox_item">Infobox Item</div>
      <a class="infobox_item center" href="localhost">Infobox Item (Centered)</a>
      <a class="infobox_item center" href="localhost">Infobox Item (Centered)</a>
    </div>
  </section>

它基本上将 .infobox 类的 flex 布局更改为 grid,将其设置为具有两个等宽的列,删除 flex-basis 的 child 和全宽 child 设置网格列占用 2 个空格 (span 2)

关于html - 如何让 flexbox 容器只延伸到最长的内部元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54969937/

相关文章:

html - 如何使 flex 元素正确对齐?

javascript - 单击鼠标更改(切换)html 按钮的图像(在 Internet Explorer 中)

html - 无法对齐标签,在表单中输入

c# - 如何在 C# 中将 html 转换为 BBcode

css - 将固定元素定位在 float 元素之上

html - CSS 背景附件 :fixed hiding image

html - 防止 flex item 收缩

html - 扩展 <TD> 导致内容换行到下一行

html - 根据图像定制设计

html - 具有 flex-grow 的相同宽度容器不起作用