【CSS】最强大的布局之grid布局精讲

简介: 【CSS】最强大的布局之grid布局精讲

 前言

   介绍

网格布局(Grid)是最强大的 CSS 布局方案。

它将网页划分成一个个网格,可以任意组合不同的网格,做出各种各样的布局。

Grid 布局则是将容器划分成 “行” 和 “列” 产生单元格,然后指定 “项目所在” 的单元格,可以看作是二维布局。Grid 布局远比 Flex 布局强大。

 基本概念

       容器和项目

       采用网格布局的区域,称为 “容器”(container)。容器内部采用网格定位的子元素,称为 “项目”(item)。

       

<div>
  <div><p>1</p></div>
  <div><p>2</p></div>
  <div><p>3</p></div>
</div>

image.gif

       

       上面代码中,最外层的 <div> 元素就是容器,内层的三个 <div> 元素就是项目。

注意:项目只能是容器的顶层子元素,不包含项目的子元素,比如上面代码的 <p> 元素就不是项目。Grid 布局只对项目生效。

       行和列

       整个grid页面布局是由行和列构成的,在使用grid布局时,需要单独设计行和列。

       单元格

       每行每列都会分布单元格,在单元格内我们可以添加想要的内容。

       网格线

       image.gif编辑

       格子的边框为网格线,分为上下网格线和左右网格线。

属性

       父容器属性

               display 属性

               只对直接子元素有效。

               

display: grid;
display: inline-grid;

image.gif

               给父元素添加display: grid;属性,块样式网格布局。

               还可以使用display: inline-grid属性,行内样式网格布局。

              注意,设为网格布局以后,容器子元素(项目)的 floatdisplay: inline-blockdisplay: table-cellvertical-aligncolumn-* 等设置都将失效。

                grid-template-columns 属性,grid-template-rows 属性

                       当我们设置了grid布局之后,我们需要设置行和列的大小。

                        grid-template-columns 设置列的数量 以及大小

                       grid-template-rows  设置行的数量以及大小

<style>
        .container {
            display: grid;
            /* 设置列数 同时设置了列的宽度 */
            grid-template-columns: 100px 100px 100px;
            /* 设置行数 同时设置了行的宽度 如果没有设置行数将会自动根据
            元素数量自动设置*/
            grid-template-rows: 100px 100px 100px;
        }
        .item {
            border: 1px solid black;
        }
    </style>
</head>
<body>
    <div class="container">
        <div class="item">1</div>
        <div class="item">2</div>
        <div class="item">3</div>
        <div class="item">4</div>
        <div class="item">5</div>
        <div class="item">6</div>
        <div class="item">7</div>
        <div class="item">8</div>
        <div class="item">9</div>
    </div>
</body>

image.gif

                       image.gif编辑

       不设置行,只设置列时。

image.gif编辑

除了设置绝对值之外,也能设置百分比数(根据父级大小的百分比)等。

.container {
  display: grid;
  grid-template-columns: 33.33% 33.33% 33.33%;
  grid-template-rows: 33.33% 33.33% 33.33%;
    /* repeat 两个值第一个值是重复次数  第二个是具体指
    上下两个效果是一样的 */
  grid-template-columns: repeat(3, 33.33%);
  grid-template-rows: repeat(3, 33.33%);
    /* auto-fill 表示自动填充   可以最大限度的填满 父级容器
    用多个100px的大小填满宽度*/
  grid-template-columns: repeat(auto-fill, 100px);
    /* fr 是一个相对单位 大家可以理解为所占的份数  
        将宽度分成两份占满  类似flex布局的里的flex属性。*/
    grid-template-columns: 1fr 1fr;
    /* minmax()表示一个范围 第一个值为最小多长  第二个数为最大*/
    grid-template-columns: 1fr 2fr minmax(200px, 3fr);
    /* auto关键字 填充剩余空间
    下面这两个相等*/
    grid-template-columns: 100px auto 100px;
    grid-template-columns: 100px 1fr 100px;
}

image.gif

        还可以给网格线命名,每个【名字】相当于一条线。

.container {
  display: grid;
  grid-template-columns: [c1] 100px [c2] 100px [c3] auto [c4];
  grid-template-rows: [r1] 100px [r2] 100px [r3] auto [r4];
}

image.gif

row-gap 属性,column-gap 属性,gap 属性

row-gap 属性,设置行与行的距离。

column-gap 属性,设置列与列的距离。

gap 属性是上面两个属性的合并属性,第一个值是行,第二个是列。

.container {
            row-gap: .625rem;
            column-gap: .625rem;
            /* 上面两个的效果等于下面这一个属性  
                如果只写一个值,第二个值则等于第一个 */
            gap: 0.625rem 0.625rem;
        }

image.gif

grid-template-areas 属性

定义表格区域

.container {
一个格子一个区域
  grid-template-areas: 'a b c'
                       'd e f'
                       'g h i';
定义三个区域
 rid-template-areas: 'a a a'
                     'b b b'
                     'c c c';
 .item1 {
            grid-area: a;
            background-color: blue;
        }
        .item {
            border: 1px solid black;
            background-color: red;
        }
如果某些区域不需要利用,则使用 “点”(.)表示。
grid-template-areas: 'a . c'
                     'd . f'
                     'g . i';
}

image.gif

      image.gif编辑

如果父级设置了高度  那么第四行则会拉伸占满

 grid-auto-flow 属性

grid-auto-flow修改排列方向

子元素默认会按顺序排列  从左向右 行排列

grid-auto-flow: column;

image.gif

这样就变成了列排序

justify-items 属性,align-items 属性,place-items 属性

justify-items 属性设置所有单元格内容的水平位置,

align-items 属性设置单元格内容的垂直位置。

.container {
     开头 |结尾|居中|拉伸
  justify-items: start | end | center | stretch;
  align-items: start | end | center | stretch;
}

image.gif

justify-content 属性,align-content 属性,place-content 属性

justify-content 属性是整个内容区域在容器里面的水平位置,

align-content 属性是整个内容区域的垂直位置。

.container {
  justify-content: start | end | center | stretch | space-around | space-between | space-evenly;
  align-content: start | end | center | stretch | space-around | space-between | space-evenly;  
}

image.gif

    • start - 对齐容器的起始边框。
    • end - 对齐容器的结束边框。
    • center - 容器内部居中。
    • stretch - 项目大小没有指定时,拉伸占据整个网格容器
    • space-around - 每个项目两侧的间隔相等。所以,项目之间的间隔比项目与容器边框的间隔大一倍。
    • space-between - 项目与项目的间隔相等,项目与容器边框之间没有间隔。
    • space-evenly - 项目与项目的间隔相等,项目与容器边框之间也是同样长度的间隔。

    .container {
                height: 100vh;
                display: grid;
                grid-template-columns: 100px 100px 100px;
                grid-template-rows: 100px 100px 100px;
                row-gap: .625rem;
                column-gap: .625rem;
                gap: 0.625rem 0.625rem;
                grid-template-areas: "a a ." "b b ." "c c c";
                justify-items: center;
                align-items: center;
                justify-content: center;
                align-content: center;
            }
            .item1 {
                grid-area: a;
                background-color: blue;
            }
            .item2 {
                grid-area: b;
            }
            .item {
                width: 50%;
                height: 50%;
                border: 1px solid black;
                background-color: red;
            }

    image.gif

    image.gif编辑

    单元格内的红色背景块儿,在100px*100px内的方格内水平垂直居中,整个网格 也水平居中在了页面中,如果不设置红色方块大小的话 里面的文字将会水平垂直居中。

    image.gif编辑

    place-content 属性是 align-content 属性和 justify-content 属性的合并简写形式。

    place-content: <align-content> <justify-content>

    image.gif

           子元素属性

                            grid-column-start 属性,grid-column-end 属性,grid-row-start 属性,grid-row-end 属性

                           这几个属性可以通过表格线来修改子元素的位置。

      • grid-column-start 属性:左边框所在的垂直开始网格线
      • grid-column-end 属性:右边框所在的垂直终点网格线
      • grid-row-start 属性:上边框所在的水平开始网格线
      • grid-row-end 属性:下边框所在的水平终点网格线
      .container {
                  height: 100vh;
                  display: grid;
                  grid-template-columns: 100px 100px 100px;
                  grid-template-rows: 100px 100px 100px 100px;
                  row-gap: .625rem;
                  column-gap: .625rem;
                  grid-template-areas: "a a ." "b b ." "c c c";
              }
              .item1 {
                  grid-row-start: 2;
                  grid-row-end: 3;
                  grid-column-start: 1;
                  grid-column-end: 3;
                  /* grid-area: a; */
                  background-color: blue;
              }
              /* .item2 {
                  grid-area: b;
              } */
              .item {
                  border: 1px solid black;
                  background-color: red;
              }

      image.gif

      image.gif编辑

      一号方块 移动到了第二根到第三根水平表格线和第一根到第三根垂直表格线。

      注:如果移动到了,使用了area属性,分了区域的子元素的话,子元素不会移动位置, 而是产生层叠的浮动效果,可以使用z-index属性来改变层级。

      对于这个属性 我们还可以使用span关键字,他表示跨越的网格数量,而不是线的数量。

      .item-1 {
        grid-column-start: span 2;
      效果是一样的 start end都可以
        grid-column-end: span 2;
      }

      image.gif

      表示左右两条线之间,有两个方格,也就是占了两个位置。

      image.gif编辑

      此外grid-column 属性和grid-row 属性分别是列开始结尾和行开始结尾的结合属性。

      justify-self 属性,align-self 属性,place-self 属性

      设置某个单元格里的内容的水平垂直位置。

      .item {
          justify-self: start | end | center | stretch;
          align-self: start | end | center | stretch;
      }

      image.gif

      .item3 {
                  height: 30px;
                  align-self: center;
                  grid-area: c;
              }

      image.gif

      image.gif编辑

      place-self 属性是上面两个属性的和冰属性

      place-self: <align-self> <justify-self>;
      这个属性是 先垂直后水平

      image.gif


      目录
      相关文章
      |
      11天前
      |
      前端开发 UED 容器
      在 CSS 中使用 Flex 布局实现页面自适应时需要注意什么?
      【10月更文挑战第22天】在使用 Flex 布局实现页面自适应时,需要对其基本原理和特性有深入的理解,同时结合具体的布局需求和场景,进行细致的调整和优化。通过合理的设置和注意事项的把握,才能实现理想的自适应效果,提升用户体验。还可以根据实际情况进行更深入的探索和实践,以不断提升 Flex 布局的应用能力。
      |
      5天前
      |
      前端开发 容器
      实现CSS品字布局
      【10月更文挑战第27天】
      |
      1月前
      |
      前端开发 容器
      使用 CSS Grid 布局实现响应式设计
      【10月更文挑战第1天】使用 CSS Grid 布局实现响应式设计
      45 4
      |
      1月前
      |
      前端开发 容器
      前端技术分享:利用CSS Grid布局实现响应式设计
      【10月更文挑战第1天】前端技术分享:利用CSS Grid布局实现响应式设计
      |
      1月前
      |
      前端开发 UED 容器
      前端技术分享:利用 CSS Grid 实现响应式布局
      【10月更文挑战第1天】前端技术分享:利用 CSS Grid 实现响应式布局
      46 2
      |
      2月前
      |
      前端开发 容器
      css布局-弹性布局学习笔记
      这篇文章是关于CSS弹性布局的学习笔记,详细介绍了flex容器和元素的相关属性,包括flex-direction、flex-wrap、flex-flow、justify-content、align-items、align-content以及order、flex-grow、flex-shrink、flex-basis、flex和align-self等,解释了这些属性在弹性盒子布局中的作用和用法。
      |
      2月前
      |
      JavaScript 前端开发
      网页前端课程设计-【模仿】香港中文大学官网,轮播图及div+css布局,js的dom操作
      这篇文章介绍了如何模仿香港中文大学官网进行网页前端课程设计,包括使用div+css布局、js的DOM操作以及实现轮播图等技术细节。
      |
      3月前
      |
      前端开发 安全 容器
      CSS如何优雅实现卡片多行排列布局?
      【8月更文挑战第24天】CSS如何优雅实现卡片多行排列布局?
      99 3
      |
      3月前
      |
      前端开发 开发者 容器
      探索现代Web开发中的CSS Grid布局技术
      【8月更文挑战第29天】在数字时代的浪潮中,网页设计不断进化以适应日新月异的用户需求。CSS Grid布局技术作为一项革新性的前端工具,为设计师和开发者提供了前所未有的布局能力。本文旨在通过深入浅出的方式介绍CSS Grid的核心概念、基本用法以及在实际项目中的应用,帮助读者快速掌握这一强大的网页布局工具。
      52 3
      |
      3月前
      |
      前端开发 开发者 C#
      WPF开发者必读:MVVM模式实战,轻松实现现代桌面应用架构,让你的代码更上一层楼!
      【8月更文挑战第31天】在WPF应用程序开发中,MVVM(Model-View-ViewModel)模式通过分离应用程序的逻辑和界面,提高了代码的可维护性和可扩展性。本文介绍了MVVM模式的三个核心组件:Model(数据模型)、View(用户界面)和ViewModel(处理数据绑定和逻辑),并通过示例代码展示了如何在WPF项目中实现MVVM模式。通过这种方式,开发者可以构建更加高效和可扩展的桌面应用程序。
      147 0