【CSS属性】Grid 布局

2023/07/25 15:11:14
本文为转载文章,原文地址:https://www.ruanyifeng.com/blog/2019/03/grid-layout-tutorial.html

Flex 布局是轴线布局,只能指定项目在轴线上的布局方式,可以看作是一维布局。Grid 布局则是将容器划分为,形成若干个单元格,然后指定项目所在的单元格,可以看做是二维布局

容器属性

display

设置容器采用 grid 布局。

/* 指定容器为块级 grid 布局(容器为块级元素)*/
display: grid;

/* 指定容器为行级 grid 布局(容器为行级元素)*/
display: inline-grid;

grid-template-columns && grid-template-rows

设置行宽和列高。

  • 简单定义。

    /* 指定一个三行三列的网格,列宽和行高都是 100px。 */
    grid-template-columns: 100px 100px 100px;
    grid-template-rows: 100px 100px 100px;
    
  • 使用 repeat() 简化代码。

    /* 定义四列,每行列宽为 25% */
    grid-template-columns: repeat(4, 25%);
    
    /* 定义四列,列宽分别为 100px、200px、100px、200px */
    grid-template-columns: repeat(2, 100px 200px);
    
  • auto-fill 关键字,容器存在剩余空间时,用空白单元格填满剩余空间。

    /* 定义列宽为 100px,列数自动填充,直到不能放置更多的列 */
    grid-template-columns: repeat(auto-fill, 100px);
    
  • fr 关键字,如果两列的宽度分别为 1fr 和 2fr,就表示后者是前者的两倍。

    /* 第一列宽度为 150px,第二列和第三列瓜分剩余空间,且第二列的宽度是第三列的一半 */
    grid-template-columns: 150px 1fr 2fr;
    
  • minmax() 设置长度范围,接收最小值和最大值。

    /* 
      第三列宽度最小值为 100px,如果容器宽度大于 300px(3fr),则三列宽度一样,
      否则第三列为 100px,前两列平分剩余宽度
    */
    grid-template-columns: 1fr 1fr minmax(100px, 1fr);
    
  • 网格线可以用方括号命名,方便以后引用,允许有多个名字,如 [fifth-line row-5]

    /* 指定容器拥有三行三列,因此有四根垂直网格线和四根水平网格线 */
    grid-template-columns: [c1] 100px [c2] 100px [c3] auto [c4];
    grid-template-rows: [r1] 100px [r2] 100px [r3] auto [r4];
    

grid-row-gap && grid-column-gap && grid-gap

设置行和列之间的间距。

  • grid-row-gap,设置行间距。
  • grid-column-gap,设置列间距。
  • grid-gap,复合属性 grid-gap: <grid-row-gap> <grid-column-gap>;,如果省略第二个值,浏览器认为第二个值等于第一个值。
/* 行间距、列间距都是 20px */
grid-gap: 20px;

grid-auto-flow【可交互】

设置容器子元素的排列方式。

【点击按钮修改 grid-auto-flow 】
*
(默认)先行后列,先填满第一行,再开始放第二行
先行后列,剩余项目尽可能紧密填满,尽量不出现空格
先列后行,先填满第一列,再开始放第二列
先列后行,剩余项目尽可能紧密填满,尽量不出现空格
1
2
3
4
5
6
7
8
9

justify-content && align-content && place-content

设置整个内容区域在容器中的排列方式,默认为 start 左上。

  • justify-content,设置整个内容区域的水平排列方式(左中右)。
  • align-content,设置整个内容区域的垂直排列方式(上中下)。
  • place-content,复合属性 place-content: <align-content> <justify-content>;,如果省略第二个值,则浏览器认为与第一个值相等。

取值为 start | end | center | stretch | space-around | space-between | space-evenly,效果与 flex 布局的同名属性类似。

justify-content: start; 效果如下:

justify-start

justify-content: space-around; 效果如下:

justify-around

justify-content: stretch; 效果如下:

justify-stretch

justify-items && align-items && place-items

设置单元格内容在单元格中的排列方式,默认为 stretch 占满单元格的区域。

  • justify-items,设置单元格内容的水平排列方式(左中右)。
  • align-items,设置单元格内容的垂直排列方式(上中下)。
  • place-items,复合属性 place-items: <align-items> <justify-items>;,如果省略第二个值,则浏览器认为与第一个值相等。

取值为 start | end | center | stretch

align-items: start; 效果如下:

align-start

justify-items: start; 效果如下:

justify-start

grid-template-areas

设置区域,一个区域由单个或多个单元格组成。

grid-template-areas:
  "a b c"
  "d e f"
  "g h i";

多个单元格合并:

grid-template-areas:
  "a a a"
  "b b b"
  "c c c";

项目(子元素)属性

grid-column && grid-row【可交互】

设置项目的位置,具体方法就是指定项目的四个边框,分别定位在哪根网格线,

  • grid-column-start:左边框所在的垂直网格线。
  • grid-column-end:右边框所在的垂直网格线。
  • grid-row-start:上边框所在的水平网格线。
  • grid-row-end:下边框所在的水平网格线。
  • grid-column:复合属性 grid-column: <start-line> / <end-line>
  • grid-row:复合属性 grid-row: <start-line> / <end-line>

这四个属性的值,除了指定为第几个网格线,还可以指定为网格线的名字

设置第一个元素的位置
grid-column-start
左边框所在的垂直网格线
grid-column-end
右边框所在的垂直网格线
grid-row-start
上边框所在的水平网格线
grid-row-end
下边框所在的水平网格线
1
2
3
4
5
6
7
8
9

justify-self && align-self && place-self

设置当前单元格内容的排列方式。

justify-itemsalign-selfplace-self 用法一致,但是只作用于单个项目。

grid-area

设置项目放在哪个区域,取值为 grid-template-areas 中定义的值。

grid-area: e;

参考

CSS Grid 网格布局教程open in new window