flex布局和grid布局的使用和区别

250 阅读6分钟

一、Flex布局

flex布局是轴线一维弹性布局

display:flex;生成一个块状的flex容器盒子

diplay:inline-flex;生成一个行内flex容器盒子

容器属性

flex-direction排列方向

属性含义
row(默认)主轴为水平方向,起点在左端
row-reverse主轴为水平方向,起点在右端
cloumn主轴为垂直方向,起点在上沿
cloumn-reverse主轴为垂直方向,起点在下沿

image.png

flex-wrap是否排在一条线上,默认排在一条线上

属性含义
nowrap(默认)不换行
wrap换行,第一行在上方
wrap-reverse换行,第一行在下方

image.png

justify-content 元素的对其方式

属性含义
flex-start(默认)左对齐
flex-end右对齐
center居中
space-between两端对齐,项目之间间隔相等
space-around每个项目两侧的间隔相等。项目之间的间隔比项目与边框的间隔大一倍

image.png

align-items 上下如何对齐

属性含义
flex-start交叉轴的起点对齐(上对齐)
flex-end交叉轴的终点对齐。(底部对齐)
center交叉轴的中点对齐 (上下居中)
baseline项目的第一行文字的基线对齐。
stretch(默认值)如果项目未设置高度或设为auto,将占满整个容器的高度

image.png

align-content 多根轴线的对齐方式,如果只有一根轴线,该属性不起作用。

属性含义
flex-start交叉轴的起点对齐(上对齐)
flex-end交叉轴的终点对齐。(底部对齐)
center交叉轴的中点对齐 (上下居中)
space-around每根轴线两侧的间隔都相等。所以,轴线之间的间隔比轴线与边框的间隔大一倍。
space-between与交叉轴两端对齐,轴线之间的间隔平均分布
stretch(默认值)轴线占满整个交叉轴

image.png

flex-sharink 默认为1,空间不足时自动收缩,如果设置为0,则不会收缩;负值无效;

image.png

flex flex属性是flex-growflex-shrink 和 flex-basis的简写,默认值为0 1 auto。后两个属性可选。 flex:1;每个占有的空间相同

image.png

align-self设置单个元素有与其他元素不一样的对齐方式

属性含义
auto(默认值)表示继承父元素的align-items属性,如果没有父元素,则等同于stretch
flex-start交叉轴的起点对齐(上对齐)
flex-end交叉轴的终点对齐。(底部对齐)
center交叉轴的中点对齐 (上下居中)
baseline项目的第一行文字的基线对齐。
stretch如果项目未设置高度或设为auto,将占满整个容器的高度

image.png

二、Grid布局

Grid布局是可以分为行和列的二维布局,比flex布局强大

display:grid;生成一个块状的grid容器盒子

diplay:inline-grid;生成一个行内grid容器盒子

image.png

注意:设为网格布局以后,容器子元素(项目)的floatdisplay: inline-blockdisplay: table-cellvertical-aligncolumn-*等设置都将失效。

grid-template-columns 定义有几列以及每一列的宽度;grid-template-rows 定义有几行以及每一行的宽度;

//定义四列,每一列的宽度是80px(也可使用百分比),每一列可自定义宽度
grid-template-columns:80px 80px 80px 80px;
grid-template-columns:25% 25% 25% 25%;

//定义四行,每一行的宽度是80px,每一行可自定义高度
grid-template-rows:80px 80px 80px 80px;
grid-template-rows:25% 25% 25% 25%;

repeat() 定义多个重复的行或者列;

//定义四列,每一列的宽度是80px(也可使用百分比),每一列可自定义宽度
grid-template-columns:repeat(4,80px);
grid-template-columns:repeat(4,25%);

//定义四行,每一行的宽度是80px,每一行可自定义高度
grid-template-rows:repeat(4,80px);
grid-template-rows:repeat(4,25%);

image.png

auto-fill 自适单元格,让一行或者一列中尽可能的容纳更多的单元格;

除了auto-fill,还有一个关键字auto-fit,两者的行为基本是相同的。只有当容器足够宽,可以在一行容纳所有单元格,并且单元格宽度不固定的时候,才会有行为差异auto-fill会用空格子填满剩余宽度,auto-fit则会尽量扩大单元格的宽度。

display: grid; 
grid-template-columns: repeat(auto-fill, 80px);
 grid-gap: 8px;

image.png

fr 按比例分配宽度,如果两列的宽度分别为1fr2fr,就表示后者是前者的两倍。

display: grid; 
grid-template-columns: 1fr 2fr 2fr 2fr;
//也可搭配定值宽度使用
grid-template-columns: 80px 1fr 2fr 1fr;

 grid-gap: 8px;

image.png

minmax(最小值,最大值) 可对单元格设置最大和最小宽度;minmax(20px,1fr)代表列宽不小于20px 最大不大于1fr

display: grid; 
grid-template-columns: 1fr 2fr 2fr minmax(20px,1fr);
grid-gap: 8px;

auto:自适应剩余宽度;

display: grid; 
grid-template-columns: 80px auto 80px;

image.png

grid-gap设置行列间距,grid-row-gap设置行间距,grid-column-gap设置列间距

display: grid; 
grid-template-columns: 80px auto 80px;
grid-gap: 8px 2px;
//相当于
grid-row-gap:8px;
grid-colume-gap:2px;

image.png

grid-template-areas 属性用于定义区域,一个区域由一个或者多个单元格组成

<div class="box">
        <ul>
            <li class="item1">1</li>
            <li class="item2">2</li>
            <li class="item3">3</li>
            <li class="item4">4</li>
            <li class="item5">5</li>
            <li class="item6">6</li>
            <li class="item7">7</li>
            <li class="item8">8</li>
            <li class="item9">9</li>
            <li class="item10">10</li>
        </ul>
    </div>
     .item1 {
            grid-area: item1;
        }

        .item2,
        .item3,
        .item4 {
            grid-area: item2;
        }

        .item5 {
            grid-area: item3;
        }

        .item6,
        .item7,
        .item8 {
            grid-area: item4;
        }
        .box ul {
            overflow: hidden;
            display: grid;
            grid-gap: 8px 2px;
            grid-template-columns: 80px 80px 80px 80px;
            grid-template-areas:
                "item1 item2  item2 item2"
                "item3 item4 item4 item4";
            background-color: #fff;
        }
    

image.png

grid-auto-flow 网格按顺序排列默认是row,即“先行后列”,colounm先列后行 grid-auto-flow: column dense; 先列后行并尽可能的填满空格

image.png

.box ul {
            overflow: hidden;
            display: grid;
            grid-gap: 8px 2px;
            grid-template-columns: 80px 80px 80px 80px;
            grid-template-rows: 80px 80px 80px 80px;
            grid-auto-flow: column;
           
        }

image.png

justify-items 设置单元格内容水平位置

属性含义
start对其单元格起始边缘
end对其单元格结束位置
center单元格内容居中
stretch(默认)拉伸,占满单元格整个宽度

stretch

image.png

start

image.png

end

image.png

cneter

image.png

align-items 设置单元格内容垂直位置

属性含义
start对其单元格起始边缘
end对其单元格结束位置
center单元格内容居中
stretch(默认)拉伸,占满单元格整个宽度

stretch

image.png

start

image.png

end

image.png

center

image.png

place-items属性是align-items属性和justify-items属性的合并简写形式。

place-items: <align-items> <justify-items>;

justify-content属性是整个内容区域在容器里面的水平位置(左中右),align-content属性是整个内容区域的垂直位置(上中下)。 place-content属性是align-content属性和justify-content属性的合并简写形式。

place-content: <align-content> <justify-content>
属性含义
start对齐容器起始边框
end对齐容器结束边框
center容器内居中
space-around每个项目两侧的间隔相等。所以,项目之间的间隔比项目与容器边框的间隔大一倍。
space-between每个项目两侧的间隔相等。所以,项目之间的间隔比项目与容器边框的间隔大一倍。
space-evenly项目与项目的间隔相等,项目与容器边框之间也是同样长度的间隔
stretch(默认)拉伸,占满单元格整个宽度

image.png

image.png

image.png

image.png

image.png

image.png

image.png