前端开发那些事儿

grid布局

2021-04-17  本文已影响0人  coderhzc

什么是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>
上一篇下一篇

猜你喜欢

热点阅读