Flex 列仅在包裹时居中

sho*_*dev 5 css google-chrome flexbox

我使用 flexbox 在列中显示列表项。项目应在特定高度后环绕成更多列,列应水平居中,每列中的列表项应左对齐。我正在使用max-height来限制列表高度、flex-flow: column wrap构建环绕列以及align-content: center使列居中。

我意识到多列解决方案可能更明显,但我不想定义column-widthor column-count,所以我选择了 flexbox 解决方案。


当项目换行到多列时,问题列仅水平居中。如果只有一列,则该列不居中。我在 Windows 10 Home 和 MacOS Sierra 上的 Chrome 63 中都看到了这种行为。在 Firefox 中,它看起来像我想要的那样(下面的屏幕截图)。

我错过了什么吗?
如何让列始终水平居中、跨浏览器?

.filter_drop {
  display: flex;
  flex-flow: column wrap;
  align-content: center;
  list-style: none;
  margin: 0;
  padding: 0;
  max-height: 7em;
  border-bottom: 1px solid black;
}

.filter_drop li {
  margin: 0 1em 0 0;
  line-height: 1.2;
}
Run Code Online (Sandbox Code Playgroud)
<ul class="filter_drop">
  <li>One</li>
  <li>Two </li>
  <li>Three</li>
  <li>Four</li>
  <li>Five</li>
  <li>Six</li>
  <li>Seven</li>
  <li>Eight </li>
  <li>Nine</li>
  <li>Ten</li>
  <li>Eleven</li>
  <li>Twelve</li>
</ul>
<ul class="filter_drop">
  <li>One</li>
  <li>Two</li>
  <li>Three</li>
  <li>Four</li>
  <li>Five</li>
  <li>Six</li>
  <li>Seven</li>
</ul>
<ul class="filter_drop">
  <li>One</li>
  <li>Two</li>
  <li>Three</li>
  <li>Four</li>
</ul>
<ul class="filter_drop">
  <li>One</li>
  <li>Two</li>
  <li>Three</li>
</ul>
Run Code Online (Sandbox Code Playgroud)

在 JSFiddle 上查看


铬 63:
镀铬布局

火狐 57:
火狐布局

Mic*_*l_B 2

align-content仅当 Flex 容器中有多行时才有效。

align-items或者align-self需要对齐单行。

这是完整的解释:

.filter_drop {
  display: flex;
  flex-flow: column wrap;
  align-content: center;
  align-items: center; /* NEW */
  list-style: none;
  margin: 0;
  padding: 0;
  max-height: 7em;
  border-bottom: 1px solid black;
}

.filter_drop li {
  margin: 0 1em 0 0;
  line-height: 1.2;
}
Run Code Online (Sandbox Code Playgroud)
<ul class="filter_drop">
  <li>One</li>
  <li>Two </li>
  <li>Three</li>
  <li>Four</li>
  <li>Five</li>
  <li>Six</li>
  <li>Seven</li>
  <li>Eight </li>
  <li>Nine</li>
  <li>Ten</li>
  <li>Eleven</li>
  <li>Twelve</li>
</ul>
<ul class="filter_drop">
  <li>One</li>
  <li>Two</li>
  <li>Three</li>
  <li>Four</li>
  <li>Five</li>
  <li>Six</li>
  <li>Seven</li>
</ul>
<ul class="filter_drop">
  <li>One</li>
  <li>Two</li>
  <li>Three</li>
  <li>Four</li>
</ul>
<ul class="filter_drop">
  <li>One</li>
  <li>Two</li>
  <li>Three</li>
</ul>
Run Code Online (Sandbox Code Playgroud)

  • 我明白。这些框之所以在其列中居中,是因为它们居中*并且*收缩包装其内容。要左对齐所有文本,您需要为每个框指定相同的宽度。然后所有框将居中*并且*具有相同的长度,允许文本在列中左下对齐。https://jsfiddle.net/78mb4zna/4/ (2认同)
  • 这是我的理论:“align-content”仅适用于多行柔性容器。多行 Flex 容器是启用了“wrap”的容器。Firefox 认为您的容器是多行的,并允许“align-content”工作,无论是否有多行。容器是多行的,对于FF来说就足够了。另一方面,Chrome 希望看到“wrap”启用*并且*在允许“align-content”工作之前实际上有多行。 (2认同)
  • 这似乎是对规范指南的解释问题。两者似乎都没有错,但 FF 更多地遵守了规范的字面意思:*是否启用了换行?是的。好的,然后它是多行的,并且“align-content”被设置为宽松。* Chrome 向该过程添加了另一个步骤。 (2认同)
  • 请记住,浏览器制造商可以随时进行[**干预**](https://github.com/WICG/interventions)。我以前见过 Chrome 这样做过([示例](/sf/ask/2537299831/))。 (2认同)