容器属性 display:grid 网格布局

381 阅读5分钟

容器属性 display:grid 网格布局

前言:

​ 看到一个大佬做了一个chrome tab页(itab.link/)的插件,被这个布局吸引了,拖动换位置后还可以填充,了解到display:grid这个布局,的确强大灵活,学习下

image-20211103180029131.png

image-20211103180745204.png

先来看一下容器的属性

/* 定义每一行的行高,个数代表几行 */
grid-template-rows: 50px 50px;
grid-template-rows: repeat(2 50px);

/* 定义每一列的宽,个数代表几列 */
grid-tempalate-columns:20px 20px 20px;
grid-tempalate-columns:repeat(3 20px);

/* repeat(个数,内容) */
grid-template-columns:repeat(2, 100px 20px 80px);
repeat与auto-fill一起使用。
如果希望每一行(或每一列)容纳尽可能多的单元格,这时可以使用auto-fill关键字表示自动填充。
grid-template-columns:repeat(auto-fill,100px) ;

/* fr  单位,可以用来设置倍数,可以与绝对长度的单位结合使用 */
grid-template-columns: 150px 1fr 2fr;把整体减去150px的区域平均分成fr和的份数

/* minmax(200px,2fr) 长度范围,表示长度就在这个范围之中 */
grid-template-columns:100px 1fr 2fr minmax(100px,1fr);

/* grid-row-gap属性设置行与行的间隔(行间距) */
/* grid-column-gap属性设置列与列的间隔(列间距)
如果grid-gap省略了第二个值,浏览器认为第二个值等于第一个值 */
grid-gap: <grid-row-gap> <grid-column-gap>;

/* grid-template-areas定义区域,用来合并单元格 如果某些区域不需要利用,则使用"点"(.)表示。见下面圣杯布局使用例子👇 */
grid-template-areas: 'a b c'
                     'd e f'
                     'g h .';

/* grid-auto-flow
设置容器的子元素顺序,默认的放置顺序是"先行后列",即先填满第一行,再开始放入第二行
设为row dense,表示"先行后列",并且尽可能紧密填满,尽量不出现空格
*/
grid-auto-flow: row | column | row dense |column dense;

/* justify-items属性设置单元格内容的水平位置(左中右) */
/* stretch 拉伸,占满单元格的整个宽度(默认值)*/
justify-items: start | end | center | stretch;

/* align-items属性设置单元格内容的垂直位置(上中下) */
justify-items: start | end | center | stretch;

/* justify-content 整个内容水平对齐方向 start | end | center | stretch space-around | space-between | space-evenly */
/* space-evenly 项目与项目的间隔相等,项目与容器边框之间也是同样长度的间隔 */
justify-items:center

/* align-content 整个内容垂直对齐方向 start | end | center | stretch 
space-around | space-between | space-evenly */
align-items:center


圣杯布局

image-20211102180001455.png

<section class="grid">
  <div class="title">title</div>
  <div class="nav">nav</div>
  <div class="main">main</div>
  <div class="aside">aside</div>
  <div class="footer">footer</div>
</section>
<style>
  body {
    margin: 0;
    padding: 0;
  }
  .grid {
    display: grid;
    width: 100vw;
    height: 100vh;
    grid-template-columns: 80px 1fr 1fr 1fr 80px;
    grid-template-rows: 80px 1fr 1fr 80px;
    grid-template-areas:
      "title title title title title"
      "nav main main main aside"
      "nav main main main aside"
      "footer footer footer footer footer";
    font-size: 30px;
    text-align: center;
  }
  .title {
    grid-area: title;
    background-color: aquamarine;
  }
  .nav {
    grid-area: nav;
    background-color: rgb(22, 245, 171);
  }
  .main {
    grid-area: main;
    background-color: rgb(22, 24, 23);
  }
  .aside {
    grid-area: aside;
    background-color: rgb(9, 54, 39);
  }
  .footer {
    grid-area: footer;
    background-color: rgb(157, 177, 170);
  }
</style>

再来看一下item的一些属性

/* 项目的位置是可以指定的,具体方法就是指定项目的四个边框,分别定位在哪根网格线 */
grid-column-start:左边框所在的垂直网格线
grid-column-end:右边框所在的垂直网格线
grid-row-start:上边框所在的水平网格线
grid-row-end:下边框所在的水平网格线

/* 还可以使用span关键字,表示"跨越",即左右边框(上下边框)之间跨越多少个网格 */
grid-column-start: span 2; 
grid-row-start: span 3; 

/* grid-column属性是grid-column-start和grid-column-end的合并简写形式,
grid-row属性是grid-row-start属性和grid-row-end的合并简写形式。 */
grid-column: <start-line> / <end-line>;
grid-row: <start-line> / <end-line>;

/* grid-area属性指定项目放在哪一个区域。先用grid-template-areas创建区域*/
/* grid-area属性还可用作grid-row-start、grid-column-start、grid-row-end、grid-column-end的合并简写形式,直接指定项目的位置。 */
grid-area: nav;
grid-area: <row-start> / <column-start> / <row-end> / <column-end>;

/* justify-self属性设置单元格内容的水平位置(左中右),跟justify-items属性的用法完全一致,但只作用于单个项目。
align-self属性设置单元格内容的垂直位置(上中下),跟align-items属性的用法完全一致,也是只作用于单个项目。 */
justify-self: start | end | center | stretch;
align-self: start | end | center | stretch;

总结

参考csdn上的这篇文章,总结挺不错的,只是文章篇幅太长(传送👇 blog.csdn.net/m0_53161190…

容器的属性
  • 定义网格的行与列 grid-templete-rows定义每一行的高度 grid-templete-columns定义每一列的宽度 取值:

  • 固定的像素px
    定义百分比
    repeat进行重复 repeat(重复的次数,具体的值) auto-fill根据容器大小确定重复
    fr关键字  平均分配
    minmax(min,max)
    auto 自动
    
  • 定义网格的间距gap

     grid-row-gap定义行与行间距    简写为row-gap
     grid-column-gap定义列与列间距  简写为:column-gap
     复合写法grid-gapgrid-row-gap grid-column-gap;   简写为:gap
    
  • 定义网格的区域 (合并单元格)

  •  grid-template-areas定义区域  合并的单元格名字必须相同  不需要的则使用.代替
        注意:配合grid-area只给子项目使用
    
  • 定义网格的排列顺序

  • grid-auto-flow定义网格的排列顺序
    row先行后列
    column先列后行
    注意:dense添加后可以减少空格出现  让其尽量紧密排列
    
  • 定义网格内容的对齐方式(水平垂直)

  • justify-items定义网格内容中水平对齐方式 align-items(垂直方向)
    start:对齐单元格的起始边缘。
    end:对齐单元格的结束边缘。
    center:单元格内部居中。
    stretch:拉伸,占满单元格的整个宽度(默认值)
    复合写法 place-items:align-items justify-items;
    
  • 定义网格整体的位置

  • justify-content: start | end | center | stretch | space-around | space-between | space-evenly;
    align-content: start | end | center | stretch | space-around | space-between | space-evenly;  
    
项目的属性:
  • 设置项目起始和结束显示位置
  • grid-row-start
    grid-row-end
    grid-column-start
    grid-column-end
    复合属性 grid-row:start/end; grid-column:start/end;
    注意关键字:span
    
  • grid-area属性指定项目放在哪一个区域
  • 需要先在容器里用grid-template-areas定义区域
    
  • 定义项目自己在单元格的位置
  • justify-self align-self
    start:对齐单元格的起始边缘。
    end:对齐单元格的结束边缘。
    center:单元格内部居中。
    stretch:拉伸,占满单元格的整个宽度(默认值)。
    复合写法 place-self
    

个人练手示例

image-20211103181309490.png

<body>
  <div class="box">
    <div class="child">1</div>
    <div
         class="child"
         style="
                grid-row-start: span 2;
                grid-column-start: span 4;
                background: bisque;
                "
         >
      2
    </div>
    <div class="child">3</div>
    <div class="child">4</div>
    <div class="child">5</div>
    <div
         class="child"
         style="
                grid-row-start: span 2;
                grid-column-start: span 2;
                background: bisque;
                "
         >
      6
    </div>
    <div class="child">7</div>
    <div class="child">8</div>
    <div class="child">9</div>
    <div class="child">10</div>
    <div
         class="child"
         style="
                grid-row-start: span 2;
                grid-column-start: span 4;
                background: bisque;
                "
         >
      11
    </div>
    <div class="child">12</div>
    <div class="child">13</div>
    <div class="child">14</div>
    <div class="child">15</div>
    <div class="child">16</div>
    <div class="child">17</div>
    <div class="child">18</div>
    <div class="child">19</div>
    <div class="child">20</div>
    <div class="child">21</div>
  </div>
</body>
<style>
  .box {
    height: 400px;
    display: grid;
    grid-template-columns: repeat(8, 50px); /* 每行展示8个空 */
    grid-template-rows: repeat(6, 50px); /* 在盒子内一共6行 */
    /* grid-auto-flow:row column; */
    grid-auto-flow: row dense; /* 可以紧凑的填左上空子 实现布局最重要的一点 */
    justify-content: center; /* 盒子水平居中 */
    align-content: center; /* 盒子垂直居中 */
    gap: 10px;
  }
  .child {
    background-color: aquamarine;
  }
</style>