flex 布局最后一行列表左对齐

150 阅读2分钟

justify-content 对齐问题描述

flex 布局中,justify-content 属性可以控制列表的水平对齐方式,例如 space-between 值可以实现两端对齐。

如果最后一行的列表的个数不满,则就会出现最后一行没有完全垂直对齐的问题。

image.png

解决这个问题需要分为多种情况

  • 如果每一行个数确定
    • 模拟 space-between 和间隙
    • 根据个数最后一个元素动态 margin
  • 如果每一子项宽度不固定
    • 最后一项 margin-right:auto
    • 创建伪元素并设置 flex:autoflex:1
  • 如果每一行列数不固定
  • 如果列数不固定 HTML 又不能调整

解决方案

如果每一行列数是固定的

通过 margin 模拟间隙

计算 margin-right (整体宽度 - 子项宽度 * 个数) / 间隙个数

<div id="wrap"></div>
* {
  margin: 0;
  padding: 0;
}

:root {
  --width24: 24%;
  --width48: 48%;
  --width100: 100%;
}

#wrap {
  display: flex;
  flex-wrap: wrap;
}

.list {
  width: var(--width24);
  height: 100px;
  background-color: skyblue;
  margin-top: 15px;
}

.list:not(:nth-child(4n)) {
  margin-right: calc(((100% - var(--width24) * 4) / 3));
}
const wrap = document.getElementById("wrap");
const fragment = document.createDocumentFragment();
for (let i = 0; i < 7; i++) {
  const div = document.createElement("div");
  div.setAttribute("class", "list");
  fragment.appendChild(div);
}
wrap.appendChild(fragment);

如果考虑不同设备情况

<div id="wrap"></div>
* {
  margin: 0;
  padding: 0;
}

:root {
  --width24: 24%;
  --width48: 48%;
  --width100: 100%;
}

#wrap {
  display: flex;
  flex-wrap: wrap;
}

.list {
  height: 100px;
  background-color: skyblue;
  margin-top: 15px;
}

@media screen and (min-width: 1024px) {
  .list {
    width: var(--width24);
    margin-top: 15px;
  }
  .list:not(:nth-child(4n)) {
    margin-right: calc(((100% - var(--width24) * 4) / 3));
  }
}

@media screen and (min-width: 768px) and (max-width: 1024px) {
  .list {
    width: var(--width48);
    margin-top: 15px;
  }
  .list:not(:nth-child(2n)) {
    margin-right: calc(100% - var(--width48) * 2);
  }
}

@media screen and (min-width: 375px) and (max-width: 768px) {
  .list {
    width: var(--width100);
  }
}
const wrap = document.getElementById("wrap");
const fragment = document.createDocumentFragment();
for (let i = 0; i < 7; i++) {
  const div = document.createElement("div");
  div.setAttribute("class", "list");
  fragment.appendChild(div);
}
wrap.appendChild(fragment);

根据个数最后一个元素动态margin

如果每一子项宽度不固定

最后一项margin-right:auto

创建伪元素并设置flex:auto或flex:1

如果每一行列数不固定

如果列数不固定HTML又不能调整