Flexbox 大小像表格单元格一样?

Kum*_*mar 5 html css html-table flexbox

我遇到了 Flexbox 的问题。我尝试了很多变体但还没有找到解决方案。

我需要子元素与父容器一起拉伸

第一行的宽度还可以,但背景也应该根据内容拉伸。

关于第二行,背景拉伸很好,但它需要相等的宽度,并且我需要宽度取决于内容,例如自动宽度......

我需要它像在变体 3 中使用 , 时一样拉伸display: table

.row {
  display: flex;
  justify-content: space-around;
  margin: 20px;
  color: #fff;
}

.row .col {
  min-height: 40px;
  background: #333;
  padding: 10px;
}

.row-v2 {
  flex-wrap: wrap;
}

.row-v2 .col {
  flex: 1;
}

.row-table {
  width: 100%;
  display: table;
}

.col:nth-child(2) {
  background: #666;
}

.row-table .col {
  display: table-cell;
  padding: 10px;
  background: #333;
  color: #fff;
}
Run Code Online (Sandbox Code Playgroud)
<h1>Variant 1</h1>
<div class="row">
  <div class="col">test</div>
  <div class="col">test 1234</div>
  <div class="col">e</div>
</div>

<h1>Variant 2</h1>
<div class="row row-v2">
  <div class="col">test</div>
  <div class="col">test 1234</div>
  <div class="col">t</div>
</div>

<h1>Variant with table method</h1>
<div class="row-table">
  <div class="col">test</div>
  <div class="col">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Dolore, sit repellendus iste doloremque architecto est et voluptate, blanditiis culpa neque!</div>
  <div class="col">Lorem ipsum dolor sit amet.</div>
</div>
Run Code Online (Sandbox Code Playgroud)

LGS*_*Son 2

很难准确匹配,因为当分配可用空间时,它使用与 Flexbox 不同的算法,可以在此处找到table更深入的工作原理解释:table


简而言之,table使用每个单元格的内容大小来计算增长,而 Flexbox 在计算增长之前减去内容大小。

因此,要匹配示例 1/2 中的文本,您需要提前知道弹性项目是否应该比另一个项目小一些。

这里有 3 个样本,其中第一个使用等增长 ( flex-grow: 1),第二个使用调整。

堆栈片段

.row {
  display: flex;
}
.col {
  background: #333;
  padding: 10px;
  color: #fff;
}
.row-v1 .col {
  flex-grow: 1;                    /*  equal  */
}
.row-v2 .col:nth-child(1) {
  flex-grow: 1.6;                  /*  adjusted  */
}
.row-v2 .col:nth-child(2) {
  flex-grow: 3;                    /*  adjusted  */
}
.row-v2 .col:nth-child(3) {
  flex-grow: 1;                    /*  adjusted  */
}
.row-table {
  display: table;
  width: 100%;
}
.row-table .col {
  display: table-cell;
}
.col:nth-child(2) {
  background: #999;
}
h3 {
  margin: 5px;
}
Run Code Online (Sandbox Code Playgroud)
<h3>Flex - equal</h3>
<div class="row row-v1">
  <div class="col">test</div>
  <div class="col">test 1234</div>
  <div class="col">t</div>
</div>

<h3>Flex - adjusted</h3>
<div class="row row-v2">
  <div class="col">test</div>
  <div class="col">test 1234</div>
  <div class="col">t</div>
</div>

<h3>Table</h3>
<div class="row-table">
  <div class="col">test</div>
  <div class="col">test 1234</div>
  <div class="col">t</div>
</div>
Run Code Online (Sandbox Code Playgroud)


我建议这样思考,较小的获取 1,中间的获取 2,较大的获取 3,另外设置为flex-basis0仅依赖于flex-grow定义宽度,因此第二行将与第一行匹配,即使其内容不同,就像 atable一样。

堆栈片段

.row {
  display: flex;
}
.col {
  background: #333;
  padding: 10px;
  color: #fff;
}
.row .col.sm {
  flex: 1 1 0;
}
.row .col.md {
  flex: 2 2 0;
}
.row .col.lg {
  flex: 3 3 0;
}
.col:nth-child(even) {
  background: #999;
}
.row + .row {
  margin-top: 2px;
}
Run Code Online (Sandbox Code Playgroud)
<div class="row">
  <div class="col md">test</div>
  <div class="col lg">test 1234</div>
  <div class="col sm">t</div>
  <div class="col md">test</div>
  <div class="col lg">test 1234</div>
  <div class="col sm">t</div>
</div>

<div class="row">
  <div class="col md">test</div>
  <div class="col lg">test 1234 with more text</div>
  <div class="col sm">t</div>
  <div class="col md">a</div>
  <div class="col lg">1234</div>
  <div class="col sm">bcd</div>
</div>
Run Code Online (Sandbox Code Playgroud)