css - flex 列仅在包裹时居中

标签 css google-chrome flexbox

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

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

问题
当元素换行到多列时,列仅水平居中。如果只有一列,则该列不居中。我在 Windows 10 家庭版和 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;
}
<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>

View on JSFiddle


Chrome 63:
Chrome Layout

火狐 57:
Firefox Layout

最佳答案

align-content 仅在 flex 容器中有多行时才有效。

align-itemsalign-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;
}
<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>

关于css - flex 列仅在包裹时居中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47892546/

相关文章:

javascript - 'production' 代码中不推荐使用 jQuery .css

javascript - Chrome 书签可以包含大量 JavaScript 吗?

javascript - 即使我在不​​同的选项卡上,您能否让 Javascript 在浏览器上以最佳性能运行?

javascript - 有没有办法在 chrome 调试器中暂停卡住的脚本?

html - Zurb Foundation 6 XY Grid 在 Flex-Container 中使用 Grid Container

PHP 用户样式不符合现有样式

html - 如何在可变宽度的较小 div 内水平居中较大的可变宽度 div

php - 使用 PHP 在动态创建表格中应用表格样式

html - 带过渡的垂直居中文本

html - 如何使 inline-flex 不影响其中一个 child