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:autoflex: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,所以不会影响垂直方向上的布局。