css之grid布局

Grid 布局与 Flex 布局有一定的相似性,都可以指定容器内部多个项目的位置。但是,它们也存在重大区别。Flex 布局是轴线布局,只能指定"项目"针对轴线的位置,可以看作是一维布局。Grid 布局则是将容器划分成"行"和"列",产生单元格,然后指定"项目所在"的单元格,可以看作是二维布局。

Grid 布局远比 Flex 布局强大。

基本概念

  • 网格容器:采用网格布局的区域,称为"容器"(container)。通过设置display: grid或display: inline-grid定义容器,其直接子元素成为网格项目。
  • 网格项目:容器内部采用网格定位的子元素,称为"项目"(item)
  • 网格区域:通过grid-template-areas命名单元格组合区域,实现复杂布局
  • 网格轨道:由grid-template-columns和grid-template-rows定义的行和列,支持固定值(如px)、百分比(%)及弹性单位(fr)。容器里面的水平区域称为"行"(row),垂直区域称为"列"(column)。
  • 网格线:隐含的垂直线和水平线,用于定位项目(如grid-column: 1/3表示跨越第1至3条垂直线)。水平网格线划分出行,垂直网格线划分出列。正常情况下,n行有n + 1根水平网格线,m列有m + 1根垂直网格线。

grid-template-columns、grid-template-rows

grid-template-columns属性定义每一列的列宽,grid-template-rows属性定义每一行的行高。

grid-template-columns: 280px auto;
grid-template-columns: repeat(3, 33.33%);
grid-template-columns: repeat(2, 100px 20px 80px);

有时单元格的大小是固定的,但是容器的大小不确定。如果希望每一行(或每一列)容纳尽可能多的单元格,这时可以使用auto-fill关键字表示自动填充。
grid-template-columns: repeat(auto-fill, 100px);

fr单位被用于在一系列长度值中分配剩余空间,如果已指定其它部分,则剩下的空间根据各自的数字按比例分配。
grid-template-columns: 150px 1fr 2fr;

minmax(min, max):用来定义一个范围,最小值为min,最大值为max
`grid-template-columns: 40px 50px minmax(50px, 2fr) 1fr 40px; 

grid-template-areas

grid-template-areas 属性用于定义区域,如果某些区域不需要利用,则使用"点"(.)表示

grid-gap、grid-row-gap、grid-column-gap

grid-row-gap属性设置行与行的间隔(行间距),grid-column-gap属性设置列与列的间隔(列间距)。
grid-gap: 10px;
grid-gap: 10px 10px;
grid-column-gap: 10px;grid-row-gap: 10px;

grid-auto-flow

划分网格以后,容器的子元素会按照顺序,自动放置在每一个网格。默认的放置顺序是"先行后列" ,row dense和column dense这两个值主要用于,某些项目指定位置以后,剩下的项目怎么自动放置。
grid-auto-flow: row | column | row dense | column dense

justify-content、align-content

justify-content属性是整个内容区域在容器里面的水平位置,align-content属性是整个内容区域的垂直位置。
justify-content: start | end | center | stretch | space-around | space-between | space-evenly;
align-content: start | end | center | stretch | space-around | space-between | space-evenly;

justify-items、align-items

justify-items属性设置单元格内容的水平位置,align-items属性设置单元格内容的垂直位置 。
align-items: start | end | center | stretch;
justify-items: start | end | center | stretch;

stretch:拉伸,占满单元格的整个宽度(默认值)

grid-area、grid-row、grid-column

grid-area属性指定项目放在哪一个区域。数字代表第n条网格线。
grid-area: logo;
grid-area: <row-start> / <column-start> / <row-end> / <column-end>;
grid-area: 2/ 1 / 4 / 2;

grid-row: 2 / 4; 等同于
grid-row: 2 / span 2;
grid-row-start: 2; grid-row-end: 4;

grid-column: 1 / 2; 等同于
grid-column-start: 1; grid-column-end: 2;

grid-row-start属性:上边框所在的水平网格线
grid-row-end属性:下边框所在的水平网格线
grid-column-start属性:左边框所在的垂直网格线
grid-column-end属性:右边框所在的垂直网格线

justify-self、align-self

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

简单布局

<style>
  .parent {
    display: grid;
    grid-template-columns: 25% 75%;
    /* grid-template-columns: 1fr 3fr;  */     /* 同上 */
    height: 100px;
  }
  .child {
    border: 1px solid red;
  }
</style>

<div class="parent">
  <div class="child">1</div>
  <div class="child">2</div>
</div>
<style>
  .parent {
    display: grid;
    grid-template-columns: 1fr 3fr;
    height: 100px;
    gap: 10px;
  }
  .child {
    border: 1px solid red;
  }
</style>

<div class="parent">
  <div class="child">1</div>
  <div class="child">2</div>
</div>
<style>
  .parent {
    display: grid;
    grid-template-columns: 1fr 3fr;
    grid-template-rows: 20px 1fr;
    border: 1px solid silver;
    gap: 10px;
    height: 100px;
  }
  .child {
    border: 1px solid red;
  }
</style>

<div class="parent">
  <div class="child">1</div>
  <div class="child">2</div>
  <div class="child">3</div>
  <div class="child">4</div>
</div>
<!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: 100px auto 100px;
        grid-template-rows: 100px 100px 100px;
        grid-gap: 20px 20px;
        grid-auto-flow: column;
      }

      .item {
        font-size: 4em;
        text-align: center;
        border: 1px solid #e5e4e9;
      }

      .item-1 {
        background-color: #ef342a;
      }

      .item-2 {
        background-color: #f68f26;
      }

      .item-3 {
        background-color: #4ba946;
      }

      .item-4 {
        background-color: #0376c2;
      }

      .item-5 {
        background-color: #c077af;
      }

      .item-6 {
        background-color: #f8d29d;
      }
    </style>
  </head>
  <body>
    <div id="container">
      <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>
  </body>
</html>

常用网页布局

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      * {
        margin: 0;
        padding: 0;
      }
      body {
        min-height: 100vh;
        height: auto;
      }
      .container {
        min-height: 100vh;
        height: auto;
        display: grid;

        grid-template-columns: 280px auto;
        grid-template-rows: 50px auto 25px;

        grid-template-areas:
          "logo header"
          "sidebar main"
          ". footer";

        grid-column-gap: 10px;
        grid-row-gap: 10px;

        justify-content: stretch;
        align-content: stretch;
      }
      .container > div {
        border: 1px solid silver;
      }
      .logo {
        grid-area: logo;
      }
      .header {
        grid-area: header;
      }
      .sidebar {
        grid-column: 1 / 2;
        grid-row: 2 / 4;
      }
      .main {
        grid-area: main;
      }
      .footer {
        grid-area: footer;
      }
    </style>
  </head>
  <body>
    <div class="container">
      <div class="logo">logo</div>
      <div class="header">header</div>
      <div class="sidebar">sidebar</div>
      <div class="main">main</div>
      <div class="footer">footer</div>
    </div>
  </body>
</html>
<!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>
      * {
        padding: 0;
        margin: 0;
      }
      body {
        min-height: 100vh;
        height: auto;
      }

      .container {
        width: 100%;
        height: 100vh;
        display: grid;
        grid-template-columns: auto 200px;
        grid-template-rows: 60px auto;
        grid-template-areas: "nav ." "content sidebar";
        gap: 20px 20px;
      }
      .navbar {
        grid-row: 1 / 1;
        grid-column: 1 / 3;
        border: 1px silver solid;
      }

      .content {
        grid-area: content;
        border: 1px silver solid;
      }

      .sidebar {
        grid-area: "sidebar";
        border: 1px silver solid;
      }
    </style>
  </head>
  <body>
    <div class="container">
      <div class="navbar">navbar</div>
      <div class="content">content</div>
      <div class="sidebar">sidebar</div>
    </div>
  </body>
</html>

网格布局日历

<style>
  .calendar {
    display: grid;
    grid-template-columns: repeat(7, 1fr);
    gap: 0.25rem;
    width: 14.5rem;
  }
  .day {
    border: 1px solid silver;
    height: 2rem;
    width: 2rem;
    line-height: 2rem;
    text-align: center;
  }
</style>

<div class="calendar">
  <div class="day">1</div>
  <div class="day">2</div>
  <div class="day">3</div>
  <div class="day">4</div>
  <div class="day">5</div>
  <div class="day">6</div>
  <div class="day">7</div>
  <div class="day">8</div>
  <div class="day">9</div>
  <div class="day">10</div>
  <div class="day">11</div>
  <div class="day">12</div>
  <div class="day">13</div>
  <div class="day">14</div>
  <div class="day">15</div>
  <div class="day">16</div>
  <div class="day">17</div>
  <div class="day">18</div>
  <div class="day">19</div>
  <div class="day">20</div>
  <div class="day">21</div>
  <div class="day">22</div>
  <div class="day">23</div>
  <div class="day">24</div>
  <div class="day">25</div>
  <div class="day">26</div>
  <div class="day">27</div>
  <div class="day">28</div>
  <div class="day">29</div>
  <div class="day">30</div>
  <div class="day">31</div>
</div>
posted @ 2023-07-26 15:46  carol2014  阅读(46)  评论(0)    收藏  举报