Flexbox没有给予元素相同的宽度

its*_*rke 321 html css html5 css3 flexbox

尝试最多包含5个项目且少至3个的flexbox导航,但它并未在所有元素之间平均分配宽度.

小提琴

我正在建模的教程是http://www.sitepoint.com/responsive-fluid-width-variable-item-navigation-css/

上海社会科学院

* {
  font-size: 16px;
}

.tabs {
  max-width: 1010px;
  width: 100%;
  height: 5rem;
  border-bottom: solid 1px grey;
  margin: 0 0 0 6.5rem;
  display: table;
  table-layout: fixed;
}
.tabs ul {
  margin: 0;
  display: flex;
  flex-direction: row;
}
.tabs ul li {
  flex-grow: 1;
  list-style: none;
  text-align: center;
  font-size: 1.313rem;
  background: blue;
  color: white;
  height: inherit;
  left: auto;
  vertical-align: top;
  text-align: left;
  padding: 20px 20px 20px 70px;
  border-top-left-radius: 20px;
  border: solid 1px blue;
  cursor: pointer;
}
.tabs ul li.active {
  background: white;
  color: blue;
}
.tabs ul li:before {
  content: "";
}
Run Code Online (Sandbox Code Playgroud)
<div class="tabs">
  <ul>
    <li class="active" data-tab="1">Pizza</li>
    <li data-tab="2">Chicken Noodle Soup</li>
    <li data-tab="3">Peanut Butter</li>
    <li data-tab="4">Fish</li>
  </ul>
</div>
Run Code Online (Sandbox Code Playgroud)

Jam*_*gne 797

您链接的文章中没有提到重要的一点,即flex-basis.默认flex-basisauto.

规格:

如果指定的flex-basis为auto,则使用的flex基础是flex项的main size属性的值.(这本身就是关键字auto,它根据其内容调整flex项的大小.)

每个弹性项目都有一个flex-basis类似于其初始大小的项目.然后,从那里,任何剩余的自由空间按比例(基于flex-grow)在项目中分配.有auto,那个基础是内容大小(或定义的大小width等).因此,在您的示例中,具有较大文本的项目将被赋予更多空间.

如果您希望元素完全均匀,则可以进行设置flex-basis: 0.这将将flex基础设置为0,然后任何剩余空间(由于所有基础都为0将是所有空间)将基于比例分布flex-grow.

li {
    flex-grow: 1;
    flex-basis: 0;
    /* ... */
}
Run Code Online (Sandbox Code Playgroud)

来自规范的这个图表很好地说明了这一点.

这里是工作示例与你的小提琴.

  • 只是提到`flex:1;`是'flex-grow:1`,`flex-basis:0`组合的简写. (79认同)
  • 关于这个答案的令人敬畏的事情是,你可以比整个互联网上的任何其他地方更好地解释这个例子的flex-basis.我打算联系麻省理工学院,给你一个荣誉教授. (57认同)
  • `min-width: 0` 绝对是让它为我工作的关键 (8认同)
  • 您可能还需要将最小宽度重置为零(`min-width: 0`),因为对于 flex 来说,默认情况下它是`auto`,并且在某些情况下不允许正确调整大小。 (6认同)
  • 这个废墟在Safari上包裹着我. (3认同)
  • 以防万一如果有人想深入了解,我在网上看到了这篇很棒的文章:https://css-tricks.com/flex-grow-is-weird/ (2认同)
  • 如果这对您不起作用,请检查一个项目是否具有与另一个项目不同的水平填充,然后此解决方案不会使它们具有相同的宽度。 (2认同)

Zim*_*Zim 44

正如 @James Montagne 中所解释的,答案flex-basis: 0将确保 Flexbox 列均匀分布,这在这种情况下有效,因为列内容可以换行并且不会强制宽度。但是,在强制列内容宽度的情况下(例如图像宽度或空白:nowrap),解决方案是设置min-width: 0...

li {
  flex-grow: 1;
  flex-basis: 0;
  min-width: 0;
}
Run Code Online (Sandbox Code Playgroud)

https://codeply.com/p/sLZxZRFduI

  • 最小宽度:0;使我的项目具有相同的宽度以实现溢出 (4认同)

Roh*_*had 12

解决方案:

flex: 1;
Run Code Online (Sandbox Code Playgroud)

或者

.flex-child-items{
   flex-grow: 1;
} 
Run Code Online (Sandbox Code Playgroud)

解释:

如果您只将display: flex其水平对齐所有项目,并且宽度将是sum子项的宽度(取决于内容或有时width取决于属性)。

例如:

// 正常的弯曲

++++++++++   ++++++++++   ++++++++++
+        +   +        +   +        +
+   A    +   +   B    +   +   C    +
+  10px  +   +  10px  +   +  10px  +
+        +   +        +   +        +
++++++++++   ++++++++++   ++++++++++
Run Code Online (Sandbox Code Playgroud)

现在假设您想将空间平均分配给所有这些。为此,请添加flex-grow: 1到 flex 的所有子项中。(本例中为 A、B 和 C)

.A, .B, .C {
    flex-grow: 1;
}
Run Code Online (Sandbox Code Playgroud)

之后它看起来像这样:

++++++++++                              ++++++++++                              ++++++++++
+        +                              +        +                              +        +
+   A    +                              +   B    +                              +   C    +
+  10px  +                              +  10px  +                              +  10px  +
+        +                              +        +                              +        +
++++++++++                              ++++++++++                              ++++++++++
Run Code Online (Sandbox Code Playgroud)

*顺便说一句,如果上面的示例框看起来不像中心,对此表示抱歉,但代码工作可以在项目中尝试一下。


小智 9

要使用相等的宽度创建元素Flex,您应该设置为您的孩子(flex元素):

flex-basis: 25%;
flex-grow: 0;
Run Code Online (Sandbox Code Playgroud)

它将给行25%宽度的所有元素.他们不会一个接一个地成长.

  • 这非常尴尬,因为它完全降低了flex的好处.如果您要对列大小进行硬编码,则可以更轻松地解决问题. (60认同)
  • 这根本没有错.如果你想拥有相同长度的盒子并且在排满了时就会折断......你可以很容易地达到这样的目的.如果你需要最小宽度,也可以设置最小宽度 (3认同)
  • @Kloar 你是说它是 flexboxes 的唯一好处......当你需要相等的宽度时,它们当然仍然是有益的,例如响应性。另外,这不是说 flexboxes 不容易吗? (2认同)