CSS基础(九) --- 网格布局

网格布局(Grid)

  • 含义: 将网页划分成一个个网格,可以任意组合不同的网格,从而实现各种组合布局

  • 与flex布局异同

    • 相同点: 都可以指定容器内多个项目的位置

    • 不同点:

      • flex布局是轴线布局,只能指定项目针对轴线的位置(一维布局)

      • Grid布局则是将容器划分成'行'和'列',产生单元格,然后把单元格分配给项目(二维布局)

  • CSS属性

    • 容器属性

    • 项目属性

display:grid /*容器从上而下排列(经常使用)*/

display:inline-grid /*容器从左向右排列(很少用到)*/
......
<style type="text/css">
   
    div {
        width: 200px;
        height: 200px;
        background: red;
        display: grid; /*用调试工具可以看出效果*/
    }

</style>
......
<body>
    <div></div>
</body>

  • 注意事项:

    • 若元素使用 grid 布局,则该元素自动变成块级元素(可以对其设置宽高)

    • 若元素使用 inline-grid 布局,则该元素自动变成行内元素(但可以对其设置宽高)

......
<style type="text/css">
    .box { /*对span设置宽高*/
        width: 200px;
        height: 200px;
        background: red;
        display: grid;
    }
</style>
......
<body>
    <span>1</span>
    <span class="box">2</span> <!--独占一行-->
    <span>3</span>
</body>


......
<style type="text/css">
    .box { /*对行内元素span设置宽高*/
        width: 200px;
        height: 200px;
        background: red;
        display: inline-grid;
    }
</style>
......
<body>
    <span>1</span>
    <span class="box">2</span> <!--三个元素在同一行-->
    <span>3</span>
</body>
  • 行和列的划分
- 规定行属性: grid-template-row

- 规定列属性: grid-template-column

- 三行三列示例:

    grid-template-row: 200px 200px 200px
    grid-template-column: 200px 200px 200px
......
div {
    width: 600px;
    height: 600px;
    border: 5px solid gray;
    display: grid;
    
    grid-template-rows:200px 200px 200px; /*调试工具可以看出3行3列的效果*/
    grid-template-columns: 200px 200px 200px;
}
......
<div></div>
......
div.box {
    width: 600px;
    height: 600px;
    border: 5px solid gray;
    display: grid;
    
    grid-template-rows:200px 200px 200px; 
    grid-template-columns: 200px 200px 200px;
}
......
<div class="box">
    <div>1</div>
    <div>2</div>
    <div>3</div>
    <div>4</div>
    <div>5</div>
    <div>6</div>
    <div>7</div>
    <div>8</div>
    <div>9</div>
</div>
  • 调用 repeat函数,实现'简写'
div.box {
    width: 600px;
    height: 600px;
    border: 5px solid gray;
    display: grid;
   
    /* grid-template-rows:200px 200px 200px; 
    grid-template-columns: 200px 200px 200px; */

    grid-template-rows:repeat(3,200px); /*简写*/
    grid-template-columns:repeat(3,200px);
}
  • auto-fill(常用),指定行/列像素,让表格自己计算
......
div.box {
    width: 600px;
    height: 600px;
    border: 5px solid gray;
    display: grid;
   
    grid-template-columns:repeat(3,200px); */
    grid-template-rows:repeat(auto-fill,200px);
    grid-template-columns:repeat(auto-fill,200px);
}
  • fr片段(单位),类似于"flex:1",占满剩余的空间
......
div.box {
    width: 600px;
    height: 600px;
    border: 5px solid gray;
    display: grid;
   
    grid-template-rows:100px 1fr 300px; /*中间部分占满剩余的空间*/
    grid-template-columns: 100px 1fr 300px;

    /*grid-template-rows:100px 1fr 1fr;第一行100px,剩下的空间其他两行均分*/
}
  • minmax(),最小和最大像素
div.box {
            width: 600px;
            height: 600px;
            border: 5px solid gray;
            display: grid;
            
            /*第一行最小占100px,最大占200px(根据其他行自动选择哪个值)*/
            grid-template-rows:minmax(100px,200px) 200px 300px;
            grid-template-columns: repeat(3,200px);

            /*如果是下面这种情况,第三行会超出容器,溢出(因为空间不够分)*/
            grid-template-rows:minmax(100px,200px) 200px 400px;
        }
  • auto,类似"1fr",占满剩余的空间
......
div.box {
    width: 600px;
    height: 600px;
    border: 5px solid gray;
    display: grid;
    
    /*auto占满剩余的空间*/
    grid-template-rows:100px auto 200px;
    grid-template-columns: 100px auto 200px;
}

列间距与行间距

  • 引入demo,行列之间挤在一起
......
div.box {
    width: 600px;
    height: 600px;
    border: 5px solid gray;
    display: grid;
    
    grid-template-rows:repeat(3,200px);
    grid-template-columns:repeat(3,200px);
}

.box div {
    border: 1px solid red; /*单元格之间添加边框*/
}
......
<body>
    <div class="box">
        <div>1</div>
        <div>2</div>
        <div>3</div>
        <div>4</div>
        <div>5</div>
        <div>6</div>
        <div>7</div>
        <div>8</div>
        <div>9</div>
    </div>
</body>
  • 设置行/列之间的"间距"
......
div.box {
   ......
    grid-template-rows:repeat(3,200px);
    grid-template-columns:repeat(3,200px);
    
    grid-row-gap:20px; /*设置间距,第三行被挤出容器*/
    grid-column-gap:20px;
  
}
.box div {
    border: 1px solid red;
}

- 如何解决被挤出的问题? 行/列像素减少20px即可

......
div.box {
    width: 600px;
    height: 600px;
    border: 5px solid gray;
    display: grid;
   
    /*第二/三行由之前的200px修改为180px,刚好占满容器*/
    grid-template-rows:200px 180px 180px; 
    grid-template-columns: 200px 180px 180px;
  
    grid-row-gap:20px;
    grid-column-gap:20px;


    /*grid-template-rows:200px 200px auto; 也可以使用auto,让系统自己占满剩余空间
    grid-template-columns: 200px 200px auto;*/
}
  • 行/列 间距简写
/* grid-row-gap:20px;
grid-column-gap:20px; */

grid-gap: 20px 20px;

- 或者

row-gap:20px;
column-gap:20px;

- 或者(推荐写法)

gap:20px 20px;

网格之间的合并: grid-template-areas

  • 骨架:三行三列均分
div.box {
    width: 600px;
    height: 600px;
    border: 5px solid gray;
    display: grid;
   
    grid-template-rows:repeat(3,200px);
    grid-template-columns:repeat(3,200px);
    
}
......
<div class="box">
    <div>1</div>
    <div>2</div>
    <div>3</div>
    <div>4</div>
    <div>5</div>
    <div>6</div>
    <div>7</div>
    <div>8</div>
    <div>9</div>
</div>

  • 单元格合并demo演示
 div.box {
    width: 600px;
    height: 600px;
    border: 5px solid gray;
    display: grid;
   
    grid-template-rows:repeat(3,200px);
    grid-template-columns:repeat(3,200px);

    grid-template-areas: 'a b c'
                         'e e g' /*4,5网格合并在一起*/
                         'h i j';
}

.box div:nth-child(5) {
            grid-area:e; /*占位,注意字母 e 不是字符串形式,格式易错*/
        }
  • 案例演示: 3行6列,图片占据不同的网格(合并),骨架如下
......
div.box {
    width: 600px;
    height: 600px;
    border: 5px solid gray;
    margin: 0 auto;
    display: grid;
   
    grid-template-rows:repeat(3,100px); /*3行6列*/
    grid-template-columns:repeat(6,100px);
}
......
<div class="box">
   
</div>
......
<style type="text/css">
     
    div.box {
        width: 600px;
        height: 300px;
        border: 5px solid gray;
        margin: 0 auto;
        display: grid;
    
        grid-template-rows:repeat(3,100px);
        grid-template-columns:repeat(6,100px);
        
        grid-template-areas: 'a a a a b b'
                             'a a a a c c'
                             'd d e f c c';
    }
    
    .box img { /*子图片的宽高,自适应父容器*/
        width: 100%;
        height: 100%;
    }
    
    .box img:nth-child(1) {
        grid-area:a;
    }
    .box img:nth-child(2) {
        grid-area:b;
    }
    .box img:nth-child(3) {
        grid-area:c;
    }
    .box img:nth-child(4) {
        grid-area:d;
    }
    .box img:nth-child(5) {
        grid-area:e;
    }
    .box img:nth-child(6) {
        grid-area:f;
    }

</style>
......
<body>
    <div class="box">
        <img src="./img/2.jpg" alt="">
        <img src="./img/3.jpg" alt="">
        <img src="./img/4.jpg" alt="">
        <img src="./img/5.jpg" alt="">
        <img src="./img/6.jpg" alt="">
        <img src="./img/7.jpg" alt="">
    </div>
</body>

posted @ 2022-11-15 11:18  清安宁  阅读(281)  评论(0)    收藏  举报