弹性列只有在换行时居中。

7
我正在使用flexbox将列表项显示在列中。当高度达到特定值时,项目应该换行到更多的列中,列应该在水平方向上居中,每个列内的列表项应该左对齐。我使用max-height来限制列表高度,使用flex-flow: column wrap来构建换行列,并使用align-content: center来居中列。
我意识到多列布局可能更为明显,但我不想定义column-widthcolumn-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;
}
<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上查看


Chrome 63:
Chrome布局

Firefox 57:
Firefox布局


注:上述内容涉及IT技术。

1
如果您感兴趣,可以通过以下链接解决“左对齐”问题,而无需分配固定宽度: https://jsfiddle.net/gznyyegn/ ... 如果需要,我可以将其发布为答案。需要使用 translate 来解决另一个 Flexbox 的 bug:https://dev59.com/questions/aVsX5IYBdhLWcg3wY-kh - Asons
谢谢@LGSon。有趣的想法,但是我无法使居中工作(https://jsfiddle.net/gznyyegn/3/)。也许是因为你链接的问题? - showdev
是的,没错...在元素中没有检查更广泛的文本,但是我知道它不会完全动态工作。不过,在Edge浏览器中(版本16,秋季创作者更新)它运行得非常完美,已经修复了这个错误 :) - Asons
1个回答

2

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>


2
我明白。方框在它们的列中居中的原因是因为它们居中并收缩其内容。要使所有文本左对齐,您需要给每个框相同的宽度。然后所有框将居中且长度相同,允许文本沿列向左对齐。https://jsfiddle.net/78mb4zna/4/ - Michael Benjamin
嗯,我明白你的意思。这并不理想,因为我不想显式设置列宽。但是使用flexbox可能需要这样做才能实现该布局。你有什么想法,为什么FF甚至在单列时似乎也会对align-content生效?谢谢Michael。 - showdev
2
这是我的理论:align-content仅适用于多行弹性容器。多行弹性容器是启用了wrap的容器。Firefox看到您的容器是多行的,并允许align-content工作,无论是否有多行。容器是多行的事实足以让FF生效。另一方面,Chrome希望在允许align-content工作之前,看到启用了wrap并且实际上有多行。 - Michael Benjamin
2
这似乎是规范指南解释的问题。两者都似乎没有错,但 FF 更加遵循规范的字面意思:是否启用了换行?是。好的,那么它是多行的,align-content 被设置为松散状态。 Chrome 对此过程添加了另一步。 - Michael Benjamin
2
请记住,浏览器制造商随时可以参与干预。我之前见过Chrome这样做(例子)。 - Michael Benjamin
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接