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

时间:2014-07-31 18:19:59

标签: html css html5 css3 flexbox

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

Fiddle

我正在建模的教程是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>

4 个答案:

答案 0 :(得分:702)

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

来自the spec

  

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

每个弹性项目都有一个flex-basis,有点像它的初始大小。然后,从那里,任何剩余的可用空间按比例分配(基于flex-grow)项目。对于auto,该基础是内容大小(或使用width定义的大小等)。因此,在您的示例中,文本较大的项目总体上会获得更多空间。

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

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

This diagram from the spec可以很好地阐明这一点。

here is a working example和你的小提琴。

答案 1 :(得分:7)

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

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

它将为行中25%宽度的所有元素提供。他们不会一个接一个地成长。

答案 2 :(得分:1)

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

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

https://codeply.com/p/sLZxZRFduI

答案 3 :(得分:0)

解决方案:

flex: 1;

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

说明:

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

例如:

// 一个普通的 flex

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

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

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

之后它看起来像这样:

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

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