尝试一个flexbox导航,最多有5个项目,最多只有3个,但它没有在所有元素之间平均划分宽度。

小提琴

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

SASS

* { 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: ""; } <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>


当前回答

要使用Flex创建相同宽度的元素,你应该设置为你的子元素(Flex元素):

flex-basis: 25%;
flex-grow: 0;

它会给行中所有元素25%的宽度。它们不会一个接一个地生长和消失。

其他回答

正如@James Montagne回答flex-basis中所解释的:0将确保flexxbox列均匀分布,在这种情况下工作,因为列内容可以自动换行,并且不会强制设置宽度。然而,在强制设置列内容宽度的情况下(例如使用图像宽度或white-space: nowrap),解决方案是设置min-width: 0…

li {
  flex-grow: 1;
  flex-basis: 0;
  min-width: 0;
}

https://codeply.com/p/sLZxZRFduI

解决方案:

flex: 1;

OR

.flex-child-items{
   flex-grow: 1;
} 

解释:

如果你只放display: flex它只是水平对齐所有项目,宽度将是子项目宽度的和(取决于内容,有时也取决于width属性)。

例如:

//一个正常的flex

++++++++++   ++++++++++   ++++++++++
+        +   +        +   +        +
+   A    +   +   B    +   +   C    +
+  10px  +   +  10px  +   +  10px  +
+        +   +        +   +        +
++++++++++   ++++++++++   ++++++++++

现在假设你想要把空间平均分配给它们。 为此,在flex的所有子元素中添加flex-grow: 1。(在本例中是A,B和C)

.A, .B, .C {
    flex-grow: 1;
}

之后是这样的:

++++++++++                              ++++++++++                              ++++++++++
+        +                              +        +                              +        +
+   A    +                              +   B    +                              +   C    +
+  10px  +                              +  10px  +                              +  10px  +
+        +                              +        +                              +        +
++++++++++                              ++++++++++                              ++++++++++

*顺便说一句,如果上面的例子框看起来不像中心,对不起,但代码工作尝试在项目中。

Flex可能不会在所有情况下都给子节点相同的宽度。

等宽元素使用CSS网格。

.el{
 display: grid;
 grid-auto-flow: column;
 grid-auto-columns: 1fr
}

参考https://css-tricks.com/equal-columns-with-flexbox-its-more-complicated-than-you-might-think/

如果你希望只使用CSS flex,那么有几个选项

弹性基础:100%的孩子,这将是一个接近的匹配。 或 弹性基准:0这没有第一个选项有用

要使用Flex创建相同宽度的元素,你应该设置为你的子元素(Flex元素):

flex-basis: 25%;
flex-grow: 0;

它会给行中所有元素25%的宽度。它们不会一个接一个地生长和消失。

有一个重要的部分在你链接的文章中没有提到,那就是弹性基础。默认情况下,flex-basis是auto。

来自规范:

如果指定的伸缩基准为auto,则使用的伸缩基准为伸缩项的主大小属性的值。(这本身可以是关键字auto,它根据伸缩项的内容来调整伸缩项的大小。)

每个伸缩项都有一个伸缩基础,这有点像它的初始大小。然后,剩余的空闲空间按比例(基于flex-grow)分配到各个项目中。对于auto,这个基础是内容大小(或定义宽度的大小等)。因此,在您的示例中,包含较大文本的项总体上被赋予了更大的空间。

如果你想让你的元素完全均匀,你可以设置flex-basis: 0。这将把弹性基底设置为0,然后任何剩余空间(将是所有空间,因为所有基底都是0)将基于flex-grow按比例分布。

li {
    flex-grow: 1;
    flex-basis: 0;
    /* ... */
}

说明书中的这张图很好地说明了这一点。

这里有一个小提琴的例子。