css flex布局列表最后一行左对齐的几种方式

在开发需求的过程中,会碰到一种需求,是一种列表,两端对齐,但是列表的最后一行要左对齐

列数不固定,每列的宽度固定

列表的宽度是自适应的,所以列数一般也不固定,或者列表的数量不固定,导致列数也不固定,这种情况如果要满足要需求,可以有两种方法

  1. 用空的html标签填充进去,来满足最后一行也填满最后一列(列数固定也可以满足需求)

    .box{
      border:1px solid #000;
      width:750px;
      margin:0 auto;
      margin-top:10px;
      color:white;
      font-size:30px;
    }
    .listBox{
      display:flex;
      flex-wrap:wrap;
      justify-content:space-between;
      margin-right:-10px;
      margin-top:-10px;
    }
    .listBox div{
      background:red;
      width:100px;
      height:100px;
      margin-top:10px;
      margin-right:10px;
    }
    .listBox span{
      width:100px;
      margin-right:10px;
    }
    
    <div class="box">
      <div class="listBox">
        <div class="div1">1</div>
        <div class="div2">2</div>
        <div class="div3">3</div>
        <div class="div4">4</div>
        <div class="div5">5</div>
        <div class="div6">6</div>
        <div class="div7">7</div>
        <div class="div8">8</div>
        <div class="div9">9</div>
        <div class="div10">10</div>
        <span></span>
        <span></span>
        <span></span>
        <span></span>
      </div>
    </div>
    

    假如列表最后一行最多缺少4列,html就添加4个span标签,让空的span标签来填充最后一行,并且css设置和div一样,但是不设置高度,这样就不占高度的空间,来达到效果,如图所示

    填充html来达到最后一行两端对齐

  2. grid布局,因为grid有天然的左对齐的功能和设置列自动填满空间的auto-fill属性,并且可以设置间距

    .box{
      border:1px solid #000;
      width:750px;
      margin:0 auto;
      margin-top:10px;
      color:white;
      font-size:30px;
    }
    
    .listBox{
      display:grid;
      grid-template-columns:repeat(auto-fill,100px);
      grid-gap:10px;
      justify-content:space-between;
    }
    .listBox div{
      background:red;
      width:100px;
      height:100px;
    }
    
    <div class="box">
      <div class="listBox">
        <div class="div1">1</div>
        <div class="div2">2</div>
        <div class="div3">3</div>
        <div class="div4">4</div>
        <div class="div5">5</div>
        <div class="div6">6</div>
        <div class="div7">7</div>
        <div class="div8">8</div>
        <div class="div9">9</div>
        <div class="div10">10</div>
      </div>
    </div>
    

    利用gridrepeat属性auto-fill来自动填充到容器的最右侧,并且换行,还左对齐,如果所示

    设置grid来达到需求效果

每一行的列数固定

  1. 因为每一行的列数固定,所以可以用margin来代替justify-content实现单元格的间隙

    .box{
      border:1px solid #000;
      width:700px;
      margin:0 auto;
      margin-top:10px;
      color:white;
      font-size:30px;
    }
    
    .listBox{
      display:flex;
      flex-wrap:wrap;
      margin-top:-10px;
    }
    .listBox div{
      background:red;
      width:24%;
      height:100px;
      margin-top:10px;
    }
    .listBox div:not(:nth-child(4n)){
      margin-right:calc(4% / 3);/* 不设置最后一列的margin-right */
    }
    

    如果所示,


    margin代替justify-content实现最后一列左对齐
  2. 因为每一行的列数固定,所以可以用最后一个itemmargin-right来控制最后一行左对齐

    .box{
      border:1px solid #000;
      width:700px;
      margin:0 auto;
      margin-top:10px;
      color:white;
      font-size:30px;
    }
    
    .listBox{
      display:flex;
      flex-wrap:wrap;
      margin-top:-10px;
      justify-content:space-between;
    }
    .listBox div{
      background:red;
      width:24%;
      height:100px;
      margin-top:10px;
    }
    .listBox div:last-child:nth-child(4n-2){
      margin-right:calc(48% + 4% / 3 * 2);/* 最后一行有两个元素的情况*/
    }
    /*
    .listBox div:last-child:nth-child(4n-1){
      margin-right:calc(24% + 4% / 3); 最后一行有两个元素的情况
    } */
    

    .listBox div:last-child:nth-child(4n-2)最后一行有两个元素的情况
    .listBox div:last-child:nth-child(4n-1)最后一行有三个元素的情况

    利用justify-content和最后一个单元格的margin来实现最后一行左对齐

每一列的宽度不一样

因为需要两端对齐,并且每一列的宽度不一样,所以导致每一行的列与列的间距是不一样的

  1. 最后一个单元格设置margin-right:auto,使最后一行左对齐

    .box{
      border:1px solid #000;
      width:700px;
      margin:0 auto;
      margin-top:10px;
      color:white;
      font-size:30px;
    }
    
    .listBox{
      display:flex;
      flex-wrap:wrap;
      margin-top:-10px;
      justify-content:space-between;
    }
    .listBox div{
      background:red;
      height:100px;
      margin-top:10px;
      margin-right:10px;
    }
    .listBox div:last-child{
      margin-right:auto;
    }
    .div1{
      width:100px;
    }
    .div2{
      width:50px;
    }
    .div3{
      width:70px;
    }
    .div4{
      width:120px;
    }
    .div5{
      width:20px;
    }
    .div6{
      width:40px;
    }
    .div7{
      width:80px;
    }
    .div8{
      width:180px;
    }
    .div9{
      width:60px;
    }
    .div10{
      width:90px;
    }
    

    如果所示,效果如下


    最后一个单元格设置margin-right:auto
  2. 利用容器的伪元素after,然后放大填满容器,使最后一行左对齐

    .box{
      border:1px solid #000;
      width:700px;
      margin:0 auto;
      margin-top:10px;
      color:white;
      font-size:30px;
    }
    
    .listBox{
      display:flex;
      flex-wrap:wrap;
      margin-top:-10px;
      justify-content:space-between;
    }
    .listBox div{
      background:red;
      height:100px;
      margin-top:10px;
      margin-right:10px;
    }
    .listBox::after{
      content:"";
      flex:1;/* 或者flex:auto,只要设置flex-grow的值大于0的正整数就可以 */
    }
    
    利用容器的伪元素after放大填满容器

这种需求很常见,所以总结记录一下。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. 前言 前端圈有个“梗”:在面试时,问个css的position属性能刷掉一半人,其中不乏工作四五年的同学。在...
    YjWorld阅读 10,154评论 5 15
  • 一.左右布局 1.使用float:left,父元素添加clearfix,且左右盒子宽之中不能大于父盒子大小。 2....
    b9973d078544阅读 5,077评论 0 1
  • 布局就是把页面分成一块一块,按左中右,上中下等排列 布局一般分为3类 1’固定宽度布局,一般宽度为960/1000...
    珍惜时间小李阅读 3,627评论 0 0
  • 一、居中布局 居中布局通常分为两种,一种是固定宽高,另一种是非固定宽高。 非固定宽高通常都是靠里面的内容来撑起盒子...
    0清婉0阅读 1,805评论 0 1
  • 资料 让CSS flex布局最后一行列表左对齐的N种方法 -- 张鑫旭博客[https://www.zhangxi...
    sunxiaochuan阅读 5,519评论 0 0

友情链接更多精彩内容