grid布局

作者: coderhzc | 来源:发表于2021-04-17 21:40 被阅读0次

    什么是grid布局?

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

    基本概念

    0. 容器 --- 有容器属性

    container (最外层的大盒子,盒子里面可以放很多东西)
    详细参考图:


    image.png

    1.容器属性:

    (1) /* columns:多少列 这里写了三列 /
    /
    grid布局开始: /
    display: grid;
    /
    1. columns:多少列 这里写了三列 具体的数值 /
    /
    grid-template-columns: 100px 100px 100px; */

      /* 2. repeat(3,100px):第一个参数:代表要三列,每列是100px*/
      /* grid-template-columns: repeat(3,100px);*/
    
      /* 3. repeat(auto-fill,100px) auto-fill: 有时,单元格的大小是固定的,但是容器的大小不确定,这个属性就会自动填充*/
      /* grid-template-columns: repeat(auto-fill,100px); */
    
      /* 4. repeat(fr,100px) fr: 为了方便表示比例的关系,网格布局提供了fr关键字(fraction的缩写,意为片段)*/
      /* 四列宽度平均分  */
      /* grid-template-columns: repeat(4, 1fr);  */
       /*就像flex布局的 flex:1 flex:2 flex:3*/
      /* grid-template-columns: 1fr 2fr 3fr; */
    
      /* 5. minmax(),函数产生一个长度范围,表示长度就在这个范围之中,它接受两个参数,分别为最小值和最大值 */
      /* grid-template-columns: 1fr minmax(150px,1fr); */
    
      /* 6. auto,表示浏览器自己决定长度*/
      /* grid-template-columns: 100px auto 100px; */
    
      /* 7. 网格线,可以用方括号定义网格线名称, 方便以后的引用 */
      grid-template-columns: [c1] 100px [c2] 100px [c3] 100px [c4];
    

    (2) grid-template-rows


    image.png

    (3) grid-row-gap / grid-column-gap (一句话解释:item(项目) 相互之间的距离)
    (4) grid-column-gap (一句话解释:item(项目) 相互之间的距离)
    (5) grid-gap (3和4的简写)

    注意:根据最新标准,上面的三个属性名的grid-前缀已经删除,grid-column-gap和grid-row-gap
    写成了column-gap和row-gap,grid-gap写成gap
    /* row-gap:行上面的距离 /
    /
    row-gap: 10px; */

    /* column-gap:列上面的距离 /
    /
    column-gap:10px; /
    /
    gap:是(row-gap column-gap) 行和列上面综合距离 */
    gap: 20px;

    (6) grid-template-areas (一个区域由多个单元格组成,由你决定(具体使用,需要在项目属性里面设置))

    区域不需要利用 " , " 则使用 " . " 表示
    区域的命名会影响到网格线.每个区域的起始网格线,会自动命名为区域名-start,终止网格线自动命名为区域名-end
    /* grid-template-area 划分区 /
    /
    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-template-areas: "a . c"
    "d . f"
    "g . i";
    (7) grid-auto-flow
    划分网格以后,容器的子元素会按照顺序,自动放置每一个网格,默认的放置顺序是"先行后列",
    即先填满第一行,再开始放入第二行(就是子元素的排放顺序)
    grid-auto-flow: row;

    image.png

    grid-auto-flow:column;


    image.png

    grid-auto-flow:row dense;


    image.png

    (8) justify-items(水平方向) / align-items(垂直方向)
    (9) align-items(垂直方向)
    (10) place-content

    设置单元格内容的水平和垂直的对齐方式

     justify-items: start | end | center | stretch
    
     place-items属性是align-items属性和justify-items属性的合并简写形式
    place-items:<align-items><justify-items>
    

    实际效果:


    image.png

    (11) justify-content(水平方向)
    (12) align-content(垂直方向)
    (13) place-content(11和12的简写)
    设置整个内容区域的水平和垂直的对齐方式

    image.png

    (14) grid-auto-columns (用来设置多出来的项目的宽和高)
    (15) grid-auto-rows
    效果如下:


    image.png

    2. 项目 --- 有项目属性

    详细参考图:


    image.png

    items

    1. grid-column-start
    2. grid-column-end
    3. grid-column(1和2的简写)


      image.png
    grid-column-start:1 ||  grid-column-start: span 1
    grid-column-end: 3; || grid-column-end: span 3;
    
    1. grid-row-start

    2. grid-row-end

    3. grid-row(3和4的简写形式)


      image.png
    4. grid-area (指定项目放在哪一个区域)


      image.png

      更加简写方式:


      image.png
    5. justify-self

    6. align-self

    7. place-self(8和9的简写方式)


      image.png
    <!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>
        * {
          margin: 0;
          padding: 0;
        }
    
        .main {
          width: 600px;
          height: 600px;
          border: 10px solid skyblue;
          margin: 0 auto;
          /* grid布局开始: */
          display: grid;
          /* 1. columns:多少列 这里写了三列  具体的数值 */
          /* grid-template-columns: 100px 100px 100px; */
    
          /* 2. repeat(3,100px):第一个参数:代表要三列,每列是100px*/
          /* grid-template-columns: repeat(3,100px);*/
    
          /* 3. repeat(auto-fill,100px) auto-fill: 有时,单元格的大小是固定的,但是容器的大小不确定,这个属性就会自动填充*/
          /* grid-template-columns: repeat(auto-fill,100px); */
    
          /* 4. repeat(fr,100px) fr: 为了方便表示比例的关系,网格布局提供了fr关键字(fraction的缩写,意为片段)*/
          /* 四列宽度平均分  */
          /* grid-template-columns: repeat(4, 1fr);  */
          /*就像flex布局的 flex:1 flex:2 flex:3*/
          /* grid-template-columns: 1fr 2fr 3fr; */
    
          /* 5. minmax(),函数产生一个长度范围,表示长度就在这个范围之中,它接受两个参数,分别为最小值和最大值 */
          /* grid-template-columns: 1fr minmax(150px,1fr); */
    
          /* 6. auto,表示浏览器自己决定长度*/
          /* grid-template-columns: 100px auto 100px; */
    
          /* 7. 网格线,可以用方括号定义网格线名称, 方便以后的引用 */
          grid-template-columns: [c1] 100px [c2] 100px [c3] 100px [c4];
    
          /* rows:多少行 这里写了四行 */
          grid-template-rows: 100px 100px 100px 100px;
    
          /* row-gap:行上面的距离 */
          /* row-gap: 10px; */
    
          /* column-gap:列上面的距离 */
          /* column-gap:10px; */
    
          /* gap:是(row-gap column-gap) 行和列上面综合距离 */
          gap: 20px;
    
          /*  grid-template-area 划分区 */
          /* 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-template-areas: "a . c""d . f""g . i"; */
    
          /* 划分网格以后,容器的子元素会按照顺序,自动放置每一个网格,默认的放置顺序是"先行后列",
            即先填满第一行,再开始放入第二行(就是子元素的排放顺序) */
          /* grid-auto-flow: row; */
          /* grid-auto-flow: column; */
          grid-auto-flow: row dense;
    
          /* 对齐方式 */
          /* justify-items:center;
          align-items: center; */
          /* place-items (justify-items)(align-items)集合 */
          /* place-items: center center; */
    
          /* 设置整个内容区域的水平和垂直的对齐方式 */
          /* justify-content: center;
          align-content: center; */
          /* place-content (justify-content)(align-content)集合*/
        }
    
        .item {
          font-size: 20px;
          background-color: red;
          color: #fff;
        }
    
        .item-1 {
          background-color: red;
          /*列的开始 和列的结束  */
          /* grid-column-start: 1;
          grid-column-end: 3; || grid-column-end: span 3;
         */
          /* 简写方式 第一个开始 第三个结束*/
          /* grid-column: 1 / 3; */
    
          /*  grid-area (指定项目放在哪一个区域) */
          grid-area: b;
        }
    
        .item-2 {
          background-color: orange;
        }
    
        .item-3 {
          background-color: burlywood;
        }
    
        .item-4 {
          background-color: pink;
        }
    
        .item-5 {
          background-color: salmon;
        }
    
        .item-6 {
          background-color: aqua;
        }
    
        .item-7 {
          background-color: red;
        }
    
        .item-8 {
          background-color: lightpink;
        }
    
        .item-9 {
          background-color: purple;
        }
    
        .item-10 {
          background-color: orangered;
        }
      </style>
    </head>
    
    <body>
      <div class="main">
        <div class="item item-1">1</div>
        <div class="item item-2">2</div>
        <div class="item item-3">3</div>
        <div class="item item-4">4</div>
        <div class="item item-5">5</div>
        <div class="item item-6">6</div>
        <div class="item item-7">7</div>
        <div class="item item-8">8</div>
        <div class="item item-9">9</div>
        <div class="item item-10">10</div>
      </div>
    </body>
    
    </html>
    

    相关文章

      网友评论

        本文标题:grid布局

        本文链接:https://www.haomeiwen.com/subject/tyjelltx.html