一、什么是grid布局?

网格布局(Grid)是最强大的CSS布局方案:它将网页划分成一个个网格,可以任意组合不同的网格,做出各种各样的布局。以前,只能通过复杂的 CSS 框架达到的效果,现在浏览器内置了。示例如下:

 与flex布局的差别:Flex 布局是轴线布局,只能指定"项目"针对轴线的位置,可以看作是一维布局。Grid 布局则是将容器划分成"行"和"列",产生单元格,然后指定"项目所在"的单元格,可以看作是二维布局。Grid 布局远比 Flex 布局强大。

二、相关概念

1.容器:需要添加网格布局的父元素

2.项目:项目容器内部采用网格定位的子元素

3.单元格:行和列的交叉区域,称为"单元格"(cell),正常情况下,n行和m列会产生n x m个单元格。比如,3行3列会产生9个单元格。

4.网格线:划分网格的线,称为"网格线"(grid line)。水平网格线划分出行,垂直网格线划分出列,正常情况下,n行有n + 1根水平网格线,m列有m + 1根垂直网格线,比如三行就有四根水平网格线:

 

三、display属性

div{
   display: grid;/*指定一个容器采用网格布局。*/
   display: inline-grid;/*该元素内部采用网格布局*/
}

默认情况下,容器元素都是块级元素,但也可以设成行内元素。

注意:

设为网格布局以后,容器子元素(项目)的float、display: inline-block、display: table-cell、vertical-align和column-*等设置都将失效。

四、容器属性(写在父级容器中)(以3x3的网格举例)

1.设置列columns 行的高度rows

         grid-template-columns: 100px 100px 100px;

            grid-template-rows: 100px 100px 100px;

2.repeat repeat()函数  1:重复值  2:重复模式  

        参数1:重复次数 参数2:像素值

        grid-template-columns: repeat(2,100px 200px);

            grid-template-rows: repeat(2,100px 200px);

3.fr 关键字 通过关键字划分比例

        grid-template-rows: repeat(2,1fr 2fr);

            grid-template-columns: repeat(2,1fr 2fr);

4.auto-fit 自动填充每一行 或 每一列

grid-template-columns: repeat(auto-fit,120px);

5.minmax(最小值 最大值)函数

grid-template-columns: 1fr minmax(200px 1fr) 1fr;

grid-template-rows: repeat(3, 1fr);

6.auto关键字 自动适应窗口大小(没有最大最小值)

grid-template-columns: 100px auto 100px;

7. grid-template-columns 网格线 [c1] ~[c4] 中括号内是网格线的名字

 grid-template-columns: [c1] 100px [c2] auto [c3] 100px [c4];

8. gap 间隙

            /* 列间距 */

            /* column-gap: 10px; */

             /*行间距  */

            /* row-gap: 10px; */

            /*合并写法: gap:行间距 列间距 */

            gap:10px 20px;

9.area 区域:代表单个或者多个单元格,单引号内分别是单元格的名字(3x3的网格,九个名字)

            别名一样相当于合并啊,但是要和grid-area一起用,将元素放进去

grid-template-areas: 'a b c ' 'h j k' 'd e f ';

10 grid-auto-flow 项目的放置顺序:默认横向排列 column竖着排列

grid-auto-flow: column;

11.row dense水平方向填充    column dense垂直方向填充

grid-auto-flow: row dense;

12.缩小内容宽高来使得内容居中(单元格的内容)(宽度和高度只有内容大小)

            place-items(合并写法)

        justify-items: center;

            align-items: center;

            /* place-items: center; */

 13.设置内容位置(居中)(容器内容 包括间隙)

            justify-content: center;

            align-content: center;

            /* place-content: center; */

五、项目属性(写在项目样式中)

1.用网格线定义单元格列数开始的位置和结束的位置

举例:网格线 列 从第一根开始 第三根结束

          grid-column-start: 1;

            grid-column-end: 3;

            /* grid-column: 1 / 3; */ 合并写法

/* 合并:grid-area:行的开始/列的开始/行的结束/列的结束 */

2. 将该单元格的内容移动到名字为j 的单元格 其他的往前移

grid-area: j;

3.该项目自己的对齐方式:水平居中 垂直居中

            justify-self: center;

            align-self: center;

六、网络布局练习(两种合并单元格方法)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        *{
            padding: 0;
            margin: 0;
        }
        .box{
            width: 600px;
            height: 140px;
            margin: 0 auto;
            border: 2px solid pink ;
            display: grid;
            gap: 10px;
            grid-template-columns: 102px 135px 135px 102px;
            grid-template-rows: repeat(2,55px);
            /* 方法1 */
            /* grid-template-areas: 'a b c d ' 'a k l d'; */
            justify-items: center;
            align-items: center;
            justify-content: center;
            align-content: center;
        }
        .inner:nth-of-type(1){
            /* grid-area: a; */

            /* 方法2 */
            grid-area: 1/1/3/2;
        }
        .inner:nth-of-type(6){
            grid-area: d;
            grid-area: 1/4/3/5;
        }
    </style>
</head>
<body>
    <div class="box">
        <div class="inner">
         二维码
        </div>
        <div class="inner">ps4/ps5</div>
        <div class="inner">taptap</div>
        <div class="inner">苹果</div>
        <div class="inner">安卓</div>
        <div class="inner">PC下载</div>
    </div>
</body>
</html>

结果如图:

此处我们可以看见,第一个“二维码”盒子和最后一个“PC下载”盒子上下单元格合并

七、骰子点数5练习(用网格布局)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        *{
            padding: 0;
            margin: 0;
        }

        .box{
            margin: 0 auto;
            height: 300px;
            width: 300px;
            background-color: gainsboro;
            border-radius: 10px;
            display: grid;
            grid-template-columns: repeat(3,1fr);
            grid-template-rows: repeat(3,1fr);
            justify-items: center;
            align-items: center;
            /* 方法2 (5个div)*/
            /* grid-template-areas: 'a c b ' 's d f' 'h j k'; 子元素用grid-area交换位置 */
            /* 方法3(5个div):定义每个点的位置:grid-area:行的开始/列的开始/行的结束/列的结束 */

        }
        .point{
            height: 50px;
            width: 50px;
            border-radius: 50%;
        }
    </style>
</head>
<body>
    <div class="box">
      <div class="point" style="background-color:black;"></div>
      <div class="point"></div>
      <div class="point"style="background-color: black;"></div>
      <div class="point"></div>
      <div class="point"style="background-color: black;"></div>
      <div class="point"></div>
      <div class="point"style="background-color: black;"></div>
      <div class="point"></div>
      <div class="point"style="background-color: black;"></div>
    </div>
</body>
</html>

 效果图图:

 

 

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐