你肯定会用到的CSS多行多列布局

Jacquelyn38
• 阅读 1873

你肯定会用到的CSS多行多列布局

前言:因为项目中使用flex过程中,如果采用space-between两端对齐,会遇到最后一行难以对齐的问题。本文主要对多行多列这种常见的布局,列出解决方案,方便大家日常开发使用。


话不多说,直接进入正题:

你肯定会用到的CSS多行多列布局

方案一:标签补位

我们都知道,之所以对不齐是因为最后一行的子项目没有达到4个,space-between的对齐方式,自然会把中间空出来。既然如此,何不直接补位,让元素排满4个。

<!-- 样式 -->  
<style> .list{  
        display: flex;  
        justify-content: space-between;  
        flex-wrap: wrap;  
    }  
    .item{  
        /* flex: 0 0 24% 该属性等价于 flex:none;width:24% */  
        flex: 0 0 24%;  
        height: 100px;  
        background-color: aqua;  
        margin-bottom: 10px;  
    }  
    .item-fill{  
        flex: 0 0 24%;  
        height:0;  
    }  
    /* 消除最后一行多余边距 */  
    .list .item:nth-last-child(-n+4){  
        margin-bottom: 0;  
    }</style>  

<!-- html -->  
<div class="list">  
    <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-fill"></div>  
    <div class="item-fill"></div>  
    <div class="item-fill"></div>  
</div>  

效果如下:

你肯定会用到的CSS多行多列布局

如果子元素个数不是4个怎么办?我们细心观察,不难发现,最后一行的最小值是1个,那么我们只需要补位n-1个即可。如果只有3个,也可以用伪元素::after去补最后一个位置。

方案二:计算剩余空间

如果我们知道最后一行剩余空间的话,完全可以控制最后一个元素的边距或者缩放比例去占满剩下的空间,自然就能左对齐了。要做到这一点,首先得确定宽度和边距,宽度通常是已知的,我们只需要把边距确定下来,就能确认剩余空间。

接上面的的例子,假设一行有4个, 每个占比24%,4个就是24% * 4 = 96% , 那么可以确定总边距是4%,由于一行有4个元素,而最后一个的右边距是多余的,那么可以确定单个的边距为 4% / 3 = 1.333% , 计算出来后就可以开始写代码了:

<!-- css -->  
<style> .list{  
        display: flex;  
        justify-content: space-between;  
        flex-wrap: wrap;  
    }  
    .item{  
        flex: 0 0 24%;  
        height: 100px;  
        background-color: aqua;  
        /* 边距懒得算,css函数代替 */  
        margin-right: calc(4% / 3);  
        margin-bottom: calc(4% / 3);  
    }  
    /* 去除每行尾的多余边距 */  
    .item:nth-child(4n){  
        margin-right: 0;  
    }  
    /* 使最后一个元素的边距填满剩余空间 */  
    .item:last-child{  
        margin-right: auto;  
    }  
    /* 也可以给列表增加一个占位元素,自动缩放填满剩余空间 */  
    /* .list::after{  
        content: '';  
        flex: 1;  
        height: 0;  
    } */  
    .list .item:nth-last-child(-n+4){  
        margin-bottom: 0;  
    }</style>  
<!-- html -->  
<div class="list">  
    <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>  

效果如下:

你肯定会用到的CSS多行多列布局

可能有些小伙伴觉得懒得记,那么下面直接给出封装好的sass mixin, 复制即可使用:

/**  
 * 多列布局  
 * $count 项目数量  
 * $itemWidth 项目宽度,百分比,不含百分号  
 * $itemHeight 项目高度,随意  
 */  
@mixin grid($count:4, $itemWidth:20, $itemHeight:auto) {  
    $rest: 100 - $itemWidth * $count; // 剩余空间  
    $space: percentage($rest/($count - 1)/100); // 边距  
    display: flex;  
    flex-wrap: wrap;  

    /*此处的*号建议替换成具体的布局容器(div,view...),以加快css解析*/  
    & > * {  
        flex: 0 0 #{$itemWidth + '%'};  
        height: $itemHeight;  
        margin-right: $space;  
        margin-bottom: $space;  
        box-sizing: border-box;  

        &:nth-child(#{$count}n) {  
            margin-right: 0;  
        }  

        &:nth-last-child(-n + #{$count}) {  
            margin-bottom: 0;  
        }  

        /*为了兼容space-between的布局,占满剩余空间*/  
        &:last-child {  
            margin-right: auto;  
        }  
    }  
}  

/*使用方法*/  
.list{  
    /* 一行4项,每项20%宽度 */  
    @include grid(4,20)  
}  

以上为flex版本,假如你需要兼容ie浏览器,那么可以用float布局替换,float自动左对齐,也就不需要填充最后的剩余空间了。

方案三:网格布局

网格布局,默认就是左对齐,即使使用space-between

<style> .list {  
        display: grid;  
        justify-content: space-between;  
        grid-template-columns: 1fr 1fr 1fr 1fr; /*设置等比列*/  
        gap: 10px; /*行间距*/  
    }  
    .item{  
        background-color: aqua;  
        height: 100px;  
    }</style>  

<!-- html -->  
<div class="list">  
    <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>  

效果如下:

你肯定会用到的CSS多行多列布局

上面的三个方案各有各的好处:

  1. 方案一的缺点是实现不够优雅,需要增加无用的占位标签。

  2. 方案二倒没什么缺点,除了写法会复杂点,但只要封装好mixin在sass中使用足够简单,即使需要兼容ie,也只需要换成float即可。

  3. 方案三,兼容性最差,无法在ie中正常使用,但用法最简单,布局甚至比flex还要强大。

综上,实际使用中,还是推荐使用方案二。


欢迎关注我的公众号「前端历劫之路

回复关键词「电子书」,即可获取近12本前端热门电子书。

回复关键词「红宝书第4版」,即可获取最新《JavaScript高级程序设计》(第四版)电子书。

你还可以加我微信,我拉拢了很多IT大佬,创建了一个技术交流、文章分享群,欢迎你的加入。

  • 作者:Vam的金豆之路

  • 主要领域:前端开发

  • 我的微信:maomin9761

  • 微信公众号:前端历劫之路

你肯定会用到的CSS多行多列布局


本文转转自微信公众号前端历劫之路原创https://mp.weixin.qq.com/s/WlTru34oqM9QJJaV7CRSWQ,如有侵权,请联系删除。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这