网格(grid)布局

目录

概述

使用网格布局水平垂直居中盒子

基本使用

1. 定义一个网格

 2. 操控列

 3. 操控行

4. 网格间隙

 5. 基于线号放置元素

 6. 使用 grid-template-areas 属性放置元素

 7. 控制元素如何排列

总结


概述

网格是由一系列水平(row 行)及垂直的线构(column 列)成的一种布局模式,  也就是说网格布局主要是操控行和列,面试呢常常会问到如何使一个盒子水平垂直居中是css中的一种布局方式,网格布局就是答案之一。

使用网格布局水平垂直居中盒子

<!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>
    .box {
      width: 100px;
      height: 100px;
      background: skyblue;
    }

    body {
      display: grid;
      justify-content: center;
      align-items: center;
      height: 100vh;
      margin: 0;
    }

    .box {
      grid-area: box;
    }
  </style>
</head>

<body>
  <div class="box"></div>
</body>

</html>

基本使用

1. 定义一个网格

设置元素的 display 值为 grid 或者 inline-grid,仅设置display为grid,而不控制行和列是没有任何效果的。其子元素依旧按照从上至下的默认布局进行排列。

............
<head>
  .............
  <style>
    .container {
      display: grid;
    }
    .item {
      background-color: orange;
      word-break: break-all;
    }
  </style>
</head>
<body>
  <div class="container">
    <div class="item">aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa</div>
    <div class="item">bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb</div>
    <div class="item">ccccccccccccccccccccccccccccccccccccccccccccccc</div>
    <div class="item">dddddddddddddddddddddddddddddddddddddddddd</div>
    <div class="item">eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee</div>
    <div class="item">fffffffffffffffffffffffffffffffffffffffff</div>
    <div class="item">gggggggggggggggggggggggggggggggggggggg</div>
    <div class="item">hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh</div>
    <div class="item">iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii</div>
</body>
..............

 2. 操控列

通过设置 grid-template-columns,大致分为三种形式

  • 不同列宽:grid-template-columns: 100px 200px 100px;  一个一个设置每一列的宽度,几个宽度即为几列

  • 相同列宽:grid-template-columns: repeat(3, 200px); 对于列宽相等的情况可以使用repeat函数,参数6为6列,200px为列宽

  • 自适应列宽:grid-template-columns: 1fr 1fr 1fr;  将父元素的空间瓜分为3份,每个子元素占据一份

 

 

    .container {
      display: grid;
      /* 设置网格的列宽 */
      grid-template-columns: 100px 200px 100px;
      grid-template-columns: repeat(3, 200px);
      grid-template-columns: 1fr 1fr 1fr;
    }

 3. 操控行

通过设置 grid-template-row,基本同上

  • 不同行宽:grid-template-row: 100px 200px 100px

  • 相同行宽:grid-template-row: repeat(3, 200px)

  • 自适应列宽:grid-template-row: 1fr 1fr 1fr;由于我们没给父盒子加高度,所以父盒子的高度是由其子元素撑开的,故1fr即子元素累计高度的1/3,需要注意的是在没有设置子元素高度的时候,每个子元素的高度以最高的(内容最多的)那个子元素为准

 

 

    .container {
      display: grid;
      grid-template-columns: 1fr 1fr 1fr;
      /* 设置网格的行宽 */
      grid-template-rows: 100px 200px 100px;
      grid-template-rows: repeat(3, 100px);
      grid-template-rows: 1fr 1fr 1fr;
    }

4. 网格间隙

grid-gap: 20px(垂直方向) 10px(水平方向); 用于设置每个网格之间的间隙,是 grid-column-gap, grid-row-gap的简写形式

    .container {
      display: grid;
      /* 设置网格的列宽 */
      grid-template-columns: repeat(3, 150px);
      grid-template-rows: 1fr 1fr 1fr;
      grid-gap: 20px 10px;
    }

 5. 基于线号放置元素

单单控制行和列往往是满足不了需求的。我们可以通过线号手动设置某个子元素的位置。

  • grid-column: grid-column-start/ grid-column-end;
  • grid-row: grid-column-end/ grid-row-end; 
<!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>
    .container {
      display: grid;
      grid-template-columns: repeat(3, 150px);
      grid-template-rows: 1fr 1fr 1fr 1fr 1fr;
      grid-gap: 20px 10px;
    }

    .item {
      background-color: orange;
      word-break: break-all;
    }

    .start {
      grid-column: 1/4;
      grid-row: 1/2;
    }

    .end {
      grid-column: 1/4;
      grid-row: 4/5;
    }
  </style>
</head>

<body>
  <div class="container">
    <div class="item start">我是header</div>
    <div class="item">bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb</div>
    <div class="item">ccccccccccccccccccccccccccccccccccccccccccccccc</div>
    <div class="item">dddddddddddddddddddddddddddddddddddddddddd</div>
    <div class="item">eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee</div>
    <div class="item">fffffffffffffffffffffffffffffffffffffffff</div>
    <div class="item">gggggggggggggggggggggggggggggggggggggg</div>
    <div class="item end">我是footer</div>
  </div>

</body>

</html>

 6. 使用 grid-template-areas 属性放置元素

grid-template-areas 属性用于设置区域

给将要放置在区域内的元素设置 grid-area: areaname

<!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>
    #page {
      display: grid;
      grid-template-columns: 150px 1fr; 设置网格为两列,第一列150px,第二列自适应
      grid-template-rows: 100px 500px 100px; 设置网格为三行,第一行150px,第二列500px,...
      grid-template-areas: "header  header" 
                 // 给这三行两列设置区域,第一行第一列是header,第一行第二列是header
                           "nav  main"
                 //                     第二行第一列是nav,第二行第二列是main
                           "footer  footer";
                 //                     第三行第一列是footer,第三行第二列是footer
      grid-gap: 20px 10px;
    }

    #page>header {
      grid-area: header;
      background-color: #8ca0ff;
    }

    #page>nav {
      grid-area: nav;
      background-color: #ffa08c;
    }

    #page>main {
      grid-area: main;
      background-color: #ffff64;
    }

    #page>footer {
      grid-area: footer;
      background-color: #8cffa0;
    }
  </style>
</head>

<body>
  <section id="page">
    <header>Header</header>
    <nav>Navigation</nav>
    <main>Main area</main>
    <footer>Footer</footer>
  </section>

</body>

</html>

 

 7. 控制元素如何排列

grid-auto-flow属性用于控制元素如何排列

  • row 逐行填充。

  • column 逐列填充

  • dense 填充空白

 

 

 可以看到 row 是从左至右逐行排列的,如果某个网格占据空间较大,可能会流白

column 是从上至下逐列排的

dense 可以填充留白的空间

总结

display: grid / inline-grid 开启网格布局

grid-template-column 控制列

grid-template-row 控制行

grid-gap 控制间隙

grid-column 控制元素占几列

grid-row 控制元素占几行

grid-template-area 设置网格区域 ,grid-area 设置元素占据哪个网格区域

grid-auto-flow 设置网格如何排列

详细信息查阅官网 网格布局 - CSS(层叠样式表) | MDN

 

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值