CSS

flex 容器属性之 align-content

align-content属性定义了多根轴线的对齐方式。如果项目只有一根轴线,该属性不起作用。
flex 布局有主轴和交叉轴, 也就是 flex 布局默认的两根轴。那怎么才算是定义了多根轴线呢?经过反复实践, 终于发现了规律, 原来需要显式的定义一下布局方向, 比如:

  1. <div class="flex-container">
  2. <div class="flex-item flex-item-1">1</div>
  3. <div class="flex-item flex-item-1">1</div>
  4. <div class="flex-item flex-item-2">2</div>
  5. <div class="flex-item flex-item-2">2</div>
  6. <div class="flex-item flex-item-3">3</div>
  7. <div class="flex-item flex-item-3">3</div>
  8. <div class="flex-item flex-item-4">4</div>
  9. <div class="flex-item flex-item-4">4</div>
  10. <div class="flex-item flex-item-5">5</div>
  11. <div class="flex-item flex-item-5">5</div>
  12. </div>

横向主轴:定义容器的布局方向flex-direction: row;

  1. .flex-container {
  2. height: 400px;
  3. display: flex;
  4. flex-flow: row wrap; /*必须定义某一个方向, 才会形成多根轴线*/
  5. align-content: flex-end;/*更改 align-content 的值,体验不同的效果*/
  6. background: gray;
  7. }
  8. .flex-item {
  9. white-space: nowrap;
  10. margin-right: 10px;
  11. margin-bottom: 10px;
  12. text-align: end;
  13. }
  14. .flex-item-1, .flex-item-3 {
  15. width: 60px;
  16. height: 80px;
  17. background: lightcoral;
  18. }
  19. .flex-item-2, .flex-item-4 {
  20. width: 90px;
  21. height: 40px;
  22. background: lightblue;
  23. }
  24. .flex-item-5 {
  25. width: 105px;
  26. height: 20px;
  27. background: lightgreen;
  28. }

align-content: flex-start 效果

2022-01-06-08-38-38-522770.png

align-content: flex-end 效果

2022-01-06-08-38-38-658115.png

align-content: center 效果

2022-01-06-08-38-38-792610.png

align-content: space-around 效果

2022-01-06-08-38-38-928593.png

align-content: space-between 效果

2022-01-06-08-38-39-063592.png

align-content: stretch 效果

2022-01-06-08-38-39-181940.pngstretch 不是要占满容器的吗, 为啥没有效果!看了一眼 align-items 的值, 里面也有一个 stretch,如果项目未设置高度或设为 auto,将占满整个容器的高度。align-content 的 stretch 属性跟这里应该是一个意思, 验证一下!把这些高度去掉或者改为 auto 试一下:

子项目高度改为 auto 时,align-content: stretch 效果

2022-01-06-08-38-39-476578.png
只改了 item-1 和 item-3 的高度为 auto, 发现他们得到了延伸 stretch, 而其他没有修改高度的子项还是没有延伸。终于发现其中的奥秘了!!
加以思索, 这个是设置了横向的布局方向, 纵向的是什么表现?也来看一看。

纵向交叉轴:定义容器的布局方向flex-direction: column;

align-content: flex-start 效果

2022-01-06-08-38-39-600788.png

align-content: flex-end 效果

2022-01-06-08-38-39-745930.png说明设置布局方向为 column 的时候, align-content 表现体现在水平方向上?如果是 center, 那就是水平居中了?试试!

align-content: center 效果
2022-01-06-08-38-39-893588.png

align-content: space-around 效果

2022-01-06-08-38-40-035478.png

align-content: space-between 效果

2022-01-06-08-38-40-180598.png

align-content: stretch 效果
2022-01-06-08-38-40-323685.png

总结

对于容器属性align-content, 要让它生效的条件是:必须显式的设置布局方向

  • 如果布局方向为横向主轴:flex-direction: row;
    • 1、此时 align-content 的变化体现在竖直方向
    • 2、如果要让 align-content: stretch;生效,这个时候应该去掉子项的高度或者设置子项的高度为 auto
  • 如果布局方向为纵向交叉轴:flex-direction: column;
    • 1、此时 align-content 的变化体现在水平方向
    • 2、如果要让 align-content: stretch;生效,这个时候应该去掉子项的宽度或者设置子项的宽度为 auto