【问题标题】:Flex columns only center when wrappedFlex 列仅在包裹时居中
【发布时间】:2018-06-02 05:13:12
【问题描述】:

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

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

问题
仅当项目换行到多列时,列才水平居中。如果只有一列,则该列不居中。我在 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;
}
<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:

火狐 57:

【问题讨论】:

  • 如果您有兴趣,可以修复 left align 不指定固定宽度:jsfiddle.net/gznyyegn ...如果您愿意,我可以将其发布为一个答案。需要translate 来克服另一个 Flexbox 错误:stackoverflow.com/questions/33891709/…
  • 感谢@LGSon。有趣的想法,但我couldn't quite get the centering to work。也许是因为您链接的问题?
  • 是的,它是...没有检查其中一个元素中更宽的文本,但请注意它不会完全动态地工作。它在 Edge 中运行良好(版本 16,Falls Creators Update),它已经修复了这个错误 :)

标签: css google-chrome flexbox


【解决方案1】:

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>

【讨论】:

  • 这似乎有帮助。但我希望列表项与左侧文本对齐,因此每一列都是左对齐的。抱歉,我应该提到这一点。
  • 我明白了。框在其列中居中的原因是因为它们居中 并且 收缩包装其内容。要使所有文本左对齐,您需要为每个框提供相同的宽度。然后所有框将居中长度相同,允许文本左对齐列。 jsfiddle.net/78mb4zna/4
  • 这是我的理论:align-content 仅适用于多行弹性容器。多行弹性容器是启用了wrap 的容器。 Firefox 看到您的容器是多行的,并允许 align-content 工作,无论是否有多行。容器是多行的事实对于FF来说已经足够了。另一方面,Chrome 希望看到 wrap 启用 并且 在它允许 align-content 工作之前实际上有多行。
  • 这似乎是规范指南的解释问题。两者似乎都没有错,但 FF 更遵循规范的字母:是否启用了换行?是的。好的,然后它是多行的,align-content 被设置为松散。 Chrome 为该过程增加了另一个步骤。
  • 请记住,浏览器制造商可以随时使用intervention。我以前见过 Chrome 这样做 (example)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-12
  • 2021-08-27
  • 2019-07-12
  • 2013-12-18
  • 2020-11-23
相关资源
最近更新 更多