Flexbox挑战与局限
挑战在于将一组弹性项目居中并在包装上将它们左对齐。但是,除非每行有固定数量的框,并且每个框都是固定宽度,否则flexbox目前无法做到这一点。
使用问题中发布的代码,我们可以创建一个新的flex容器,该容器包装当前的flex容器(ul
),这将使我们可以将ul
with居中justify-content: center
。
然后,的flex项目ul
可以与左对齐justify-content: flex-start
。
#container {
display: flex;
justify-content: center;
}
ul {
display: flex;
justify-content: flex-start;
}
这将创建一组左对齐的弹性项目居中。
此方法的问题在于,在某些屏幕尺寸下,的右侧将有一个缝隙ul
,使其不再居中。
发生这种情况是因为在Flex布局(实际上是CSS)中,容器:
- 不知道元素何时包装;
- 不知道以前占用的空间现在是空的,并且
- 不会重新计算其宽度以收缩包装较窄的布局。
右边空白的最大长度是容器预期在其中的flex项目的长度。
在下面的演示中,通过水平调整窗口大小,您可以看到空白来去去去。
演示
更实用的方法
无需flexbox使用inline-block
和 媒体查询就可以实现所需的布局。
的HTML
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
<li>6</li>
</ul>
的CSS
ul {
margin: 0 auto;
width: 1200px;
padding-left: 0;
font-size: 0;
}
li {
display: inline-block;
font-size: 18px;
list-style-type: none;
width: 150px;
height: 50px;
line-height: 50px;
margin: 15px 25px;
box-sizing: border-box;
text-align: center;
}
@media screen and (max-width: 430px) { ul { width: 200px; } }
@media screen and (min-width: 431px) and (max-width: 630px) { ul { width: 400px; } }
@media screen and (min-width: 631px) and (max-width: 830px) { ul { width:600px; } }
@media screen and (min-width: 831px) and (max-width: 1030px) { ul { width: 800px; } }
@media screen and (min-width: 1031px) and (max-width: 1230px) { ul { width: 1000px; } }
上面的代码渲染了一个水平居中的容器,其子元素向左对齐,如下所示:
演示
其他选择