经验:align-content 解决纵轴多行布局问题

14 篇文章 1 订阅
2 篇文章 0 订阅
文章讲述了在flex布局中,如何使用align-content属性解决在切换一行显示一个或两个item时的布局问题。当默认的align-content:stretch导致布局不符合预期时,可以通过设置align-content:flex-start或者调整容器高度来达到预期效果。提供了两种解决方案,并附带了代码示例。
摘要由CSDN通过智能技术生成

经验:align-content 解决纵轴多行布局问题

1,问题描述

1,问题表现

需求如下:

  1. 在 flex 布局中,默认1行1个 item,可切换为1行2个 item。
  2. item 的数量不固定,当1行1个 item 时最多展示4个(1行2个则8个),超出滚动。

代码实现:

<script setup>
import { ref } from "vue";
const isMore = ref(false);
</script>

<template>
  <ul class="box" :class="{ more: isMore }">
    <li v-for="n in 4" class="item">{{ n }}</li>
  </ul>
  <button @click="isMore = !isMore">切换</button>
</template>

<style lang="scss">
.box {
  box-sizing: border-box;
  height: 500px; // 算上间距
  padding: 20px;
  overflow: auto;
  background-color: #fff;
  .item {
    height: 100px;
    margin-bottom: 20px;
    background-color: salmon;
    &:last-child {
      margin-bottom: 0;
    }
  }
  &.more {
    display: flex;
    flex-wrap: wrap;
    .item {
      width: calc((100% - 20px) / 2);
      &:nth-child(2n + 1) {
        margin-right: 20px;
      }
    }
  }
}
</style>

效果展示,一行2个时不符合预期:

在这里插入图片描述

2,正常预期

当一行2个时,排列方式如下:

在这里插入图片描述

2,原因分析

猜测:纵轴(交叉轴)的对齐方式有问题。但给 box 设置 align-items: flex-start;,没有任何变化。

查阅资料后发现了一个属性 aligin-content。简单介绍:

  1. 只对多行 item 有效,也就是说当 item 不换行时,此属性无效。
  2. 效果和 justify-content 类似,但针对的是纵轴。
  3. 默认值 aligin-content: stretch :每一行 item 都等比例拉伸,占满整个纵轴

默认值的效果:以上面的需求为例,如果没有设置 item height :100px,则效果如下:

在这里插入图片描述

所以,问题的原因就是 aligin-content: stretch 默认值的原因。

3,解决方案

方案1:设置多行 item 与纵轴的起点对齐

.box {
  align-content: flex-start;
}

方案2:flex 布局,和容器固定高度滚动的需求分开。

可以看到,如果 box 没有给定固定高度,即便 aligin-content: stretch 默认值也没有关系,因为纵轴没有多余的空间来让它搞事。

所以,可以在 box 外套一层来设置容器高度相关 css 即可。

<template>
  <div class="wrap">
    <ul class="box" :class="{ more: isMore }">
      <li v-for="n in 4" class="item">{{ n }}</li>
    </ul>
  </div>
  <button @click="isMore = !isMore">切换</button>
</template>
<style lang="scss">
.wrap {
  height: 500px;
  overflow: auto;
  background-color: #fff;
}
.box {
  padding: 20px;
  /* ... */
}
</style>


参考
阮一峰-flex教程
张鑫旭-flex教程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

下雪天的夏风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值