CSS-Grid(网格)布局

前言

之前HTML 页面的布局基本上都是通过 Flexbox 来实现的,能轻松的解决复杂的 Web 布局。 现在又出现了一个构建 HTML 最佳布局体系的新竞争者。就是强大的CSS Grid 布局。

grid和flex区别是什么?适用什么场景?

  1. Flexbox 是一维布局系统,适合做局部布局,比如导航栏组件。
  2. Grid 是二维布局系统,通常用于整个页面的规划。
  3. 二者从应用场景来说并不冲突。虽然 Flexbox 也可以用于大的页面布局,但是没有 Grid 强大和灵活。二者结合使用更加轻松。

特点:

  1. 固定和灵活的轨道尺寸;
  2. 可以使用行号,名称或通过定位网格区域将项目放置在网格上的精确位置;
  3. 可以将多个项目放入网格单元格或区域中,它们可以彼此部分重叠。

缺点:

兼容性比较差。

简单画一张图:

flex布局:

grid布局:

 

网格列

网格元素的垂直线方向称为列。

网格行

网格元素的水平线方向称为行。

网格间距

网格间距指的是两个网格单元之间的网格横向间距或网格纵向间距。

我们可以使用以下属性给元素调整间隙的大小

  • grid-column-gap
  • grid-row-gap
  • grid-gap

我们之前使用的弹性布局 一次只能处理一个维度上的元素布局,一行或者一列。

而现在的grid布局(网格布局)可以更自由的去设置一个容器所站的位置 

例如:

如果使用flex布局去实现排版方法就需要嵌套很多个div去一块一块的区分这些

而现在使用grid布局的话,可以省下很多div的布局,直接将元素所站的位置区分开

基础示例:

使用grid布局实现图中排版:

<!DOCTYPE html>
<html lang="en-us">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width">
    <title>grid</title>
    <style>
        body {
            width: 90%;
            max-width: 900px;
            margin: 2em auto;
            font: .9em/1.2 Arial, Helvetica, sans-serif;
        }

        .container > div {
            border-radius: 5px;
            padding: 10px;
            background-color: rgb(232, 66, 152);
        }
		.container{
			display:grid;
			gap:20px;
			grid-template-columns:1fr 2fr 1fr ;
		}
    </style>
  </head>

<body>
    <div class="container">
        <div>1</div>
        <div>2</div>
        <div>3</div>
        <div>4</div>
        <div>5</div>
        <div>6</div>
        <div>7</div>
    </div>

</body>

</html>

我们只需要在父元素中添加display:grid;属性,其元素下的子元素就会跟着变

 fr:他是grid布局中的专属属性,用来平均分配容器所占位置

示例:

如图所示,这种布局方式使用弹性布局来实现相对来说是比较麻烦的,但我们使用grid布局就简单很多了

代码如下:

<!DOCTYPE html>
<html lang="en-us">
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width" />
    <title>Grid</title>
    <style>
      body {
        width: 90%;
        max-width: 900px;
        margin: 2em auto;
        font: 0.9em/1.2 Arial, Helvetica, sans-serif;
      }

      .container {
        display: grid;
        grid-template-columns: 1fr 3fr;
		/* fr单位是frid布局专用的长度单位,可以平均的区分配每个容器所站的位置 */
		/* 每列改怎么去分配位置,例如菜单和内容区,side(这里定义的是菜单,那么他就占用1fr的位置,content(内容)他占3fr的位置,所以在图中我们可以看到内容区要比菜单区域更宽一些) */
        gap: 20px;
		grid-template-areas:'header header'/* header就是头部 */
		 'side content'/* side菜单,content内容 */
		 'footer footer'/* footer底部 */
		 ;
      }
	  /* 给每个容器设置一个名称 */
		header{
			grid-area:header;
		}
		footer{
			grid-area:footer;
		}
		aside{
			grid-area:side;
		}
		article{
			grid-area:content;
		}
      header,
      footer {
        border-radius: 5px;
        padding: 10px;
        background-color: rgb(173, 202, 232);
		border: 1px solid #000;
      }

      aside,article {
        border: 1px solid #999;
      }
    </style>
  </head>

  <body>
    <div class="container">
      <header>这是头部导航</header>
      <article>
        <h1>这里内容区域</h1>
        <p>
         内容1
        </p>

        <p>
          内容2
        </p>
      </article>
      <aside>
        <h2>这里是左侧菜单区域</h2>
        <p>
		菜单
        </p>
      </aside>
      <footer>这里是底部</footer>
    </div>
  </body>
</html>

 grid布局属性:

参考某教程:grid布局

总结:

Grid 布局与 Flex 布局有一定的相似性,都可以指定容器内部多个项目的位置。但是,它们也存在重大区别。

Grid 可以做Flexbox做不了的事,Flexbox 比 Grid 兼容性更好,他们可以共同工作。Grid item可以成为flexbox容器,flex item可以成为grid 容器。

可以根据业务场景需要选择相应布局。

侵删

猜你喜欢

转载自blog.csdn.net/CQXXTXX/article/details/129274914