CSS flex 布局实现最后一行居左对齐
CSS flex 布局实现最后一行居左对齐
April 1, 2025
在 CSS flex 布局中,要实现元素水平方向上的平均布局,通常我们会使用 justify-content: space-between 实现两端对齐,但如果最后一行元素不满,就会出现下面这种问题。
如下代码:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width">
<title>JS Bin</title>
</head>
<body>
<div class="item-wrapper">
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
</div>
</body>
</html>.item-wrapper {
display: flex;
justify-content: space-between;
flex-wrap: wrap;
}
.item {
height: 50px;
width: 50px;
background: #51C3F1;
margin: 10px;
}可以看到最后一行只有四个元素,垂直方向没有对齐。

那么怎么去处理这种尴尬的情况呢,下面有几种解决办法。
当列数固定,可以模拟 space-between
如果列数是确定的,可以通过 margin 来模拟 gap 间隙,比如固定4列,可以这样写:
.item-wrapper {
display: flex;
flex-wrap: wrap;
}
.item {
height: 100px;
width: 24%;
background: #51C3F1;
margin-top: 10px;
}
.item:not(:nth-child(4n)) {
margin-right: calc(4%/3);
}效果如下:

当元素间隙不确定时
当元素宽度不一,水平两端对齐时,间隙大小也不一,可以简单的撑开最后一个元素右侧的空间,下面提供两种方法:
1. 可以为最后一项加 margin-right: auto
当元素的宽度不确定,列数不确定时,元素间的间隙大小也不确定,这时可以直接给最后一个子元素加 margin-right: auto 属性来实现左对齐。
代码如下:
.item-wrapper {
display: flex;
justify-content: space-between;
flex-wrap: wrap;
}
.item {
height: 100px;
background: #51C3F1;
margin: 10px;
}
.item:last-child {
margin-right: auto;
}效果如下:

创建伪元素并设置 flex:auto 或 flex:1
原理和上面的方法相同,给 .item-wrapper 加伪元素辅助左对齐,代码如下:
.item-wrapper {
display: flex;
justify-content: space-between;
flex-wrap: wrap;
}
.item {
height: 100px;
background: #51C3F1;
margin: 10px;
}
.item-wrapper::after {
content: '';
flex: 1;
}当列数不固定时
当列数不固定时,上面这些方法均不适用,可以用特殊的技巧来实现。
用足够的空白标签来占位,比如该布局最多7列,就写7个空白标签填充占位,最多10列,就写10个空白标签。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width">
<title>JS Bin</title>
</head>
<body>
<div class="item-wrapper">
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<i></i><i></i><i></i><i></i><i></i>
</div>
</body>
</html>.item-wrapper {
display: flex;
justify-content: space-between;
flex-wrap: wrap;
}
.item {
height: 100px;
width: 100px;
background: #51C3F1;
margin: 10px 10px 0 0;
}
.item-wrapper > i {
width: 100px;
margin-right: 10px;
}原理也很简单,占位的 <i> 元素宽度与 item 一致,由于 <i> 元素高度为0,所以不会影响垂直方向上的布局。
