【重学CSS】图文并茂!一次性搞懂 Grid 布局,实现“布局自由”~(上)

简介: 【重学CSS】图文并茂!一次性搞懂 Grid 布局,实现“布局自由”~(上)

image.png

1、CSS Grid 简介

CSS 网格布局(又称 "网格 "或 "CSS网格"),是一种基于二维网格的布局系统,与过去的任何网页布局系统相比,它完全改变了我们设计用户界面的方式。它将网页划分成一个个网格,可以任意组合不同的网格,做出各种各样复杂的布局。以前,只能通过复杂的 CSS 框架达到的效果,现在浏览器内置了。

先来看一个以前我们稍觉得有点复杂的前端布局:


<div class="wrapper">
  <header>Header</header>
  <aside>Aside</aside>
  <main>Main Content</main>
  <footer>Footer</footer>
</div>

而现在使用 CSS Grid ,仅使用极少量的代码就能实现。

在兼容性方面,截至目前,几乎所有的浏览器都对 CSS Grid 提供了原生的支持(浏览器支持情况)。还不用起来更待何时~

微信图片_20230613123753.png
微信图片_20230613123813.png要使用 CSS Grid,你必须用 display: grid 定义一个容器元素为网格,用 grid-template-columnsgrid-template-rows 设置列和行的大小,然后用 grid-columngrid-row 将其子元素放入网格。

2、几个重要的 CSS Grid 术语

在深入了解网格的概念之前,我们需要了解几个重要的术语。

2.1 容器(Grid Container)

Grid 容器 指的是应用 display: grid 的元素。它是所有网格项目的直接父元素。

下面这个例子中,container 是网格的容器:

<div class="container"> 
    <div class="item item-1"></div> 
    <div class="item item-2"></div> 
    <div class="item item-3"></div>
</div>

2.2 项目(Grid Items)

Grid 项目 指的是网格容器的直接后代元素。

下面这个例子中的 item 元素是网格项目,但 sub-item 不是:

<div class="container">
  <div class="item"> </div>
  <div class="item">
    <p class="sub-item"> </p>
  </div>
  <div class="item"> </div>
</div>

2.3 网格线(Grid Lines)

网格线(Grid Lines) 指的是构成网格结构的分界线。它们可以是垂直的(“列网格线”)或水平的(“行网格线”),并且位于行或列的任一侧。请看下图:

微信图片_20230613123920.png

2.4 单元格(Grid Cell)

单元格(Grid Cell) 指的是相邻两行和相邻两列网格线之间的空间。它是网格的一个 "单元"。

下面是行网格线1和2,列网格线2和3之间的网格单元:


微信图片_20230613123943.png

2.5 网格轨道(Grid Tracks)

网格轨道(Grid Track) 指的是两条相邻网格线之间的空间。你可以把它们看成是网格的列或行。

下面是第1行和第2行网格线之间的网格轨迹:

微信图片_20230613124011.png

2.6 网格区域(Grid Area)

网格区域(Grid Area) 指的是由四条网格线包围的总空间。一个网格区域可以由任何数量的网格单元组成。

下面是行网格线1和3,列网格线2和4之间的网格区域:

微信图片_20230613124036.png

2.7 网格间距(Gaps)

网格间距(Gaps) 指的是轨道之间的间隙。为了确定尺寸,这些东西就像普通的轨道一样。你不能在缝隙中放置内容,但你可以将网格项目跨越它。

微信图片_20230613124059.png

3、Grid 容器属性

3.1 display

将该元素定义为一个网格容器,并为其内容建立一个新的网格格式化上下文。

可选的值:

  • grid:生成一个块状的网格
  • inline-grid:生成一个 inline-level 的网格
.container { 
    display: grid | inline-grid; 
}

通过嵌套元素(又称子网格)向下传递网格参数的能力已被移至 CSS网格规范的 Level 2

详细的可看这里:传送门

3.2 grid-template-columns 和 grid-template-rows

容器指定了网格布局以后,接着就要划分行和列。grid-template-columns属性定义每一列的列宽,grid-template-rows属性定义每一行的行高。

可选的值:

  • <track-size>:可以是一个长度、一个百分比,或者使用 fr 单位表示网格中自由空间的一部分
  • <line-name>:一个你选择的任意的名字
.container {
  grid-template-columns: ...  ...;
  /* e.g. 
      1fr 1fr
      minmax(10px, 1fr) 3fr
      repeat(5, 1fr)
      50px auto 100px 1fr
  */
  grid-template-rows: ... ...;
  /* e.g. 
      min-content 1fr min-content
      100px 1fr max-content
  */
}

网格线会从这些分配中自动分配正数(-1是最末一行的备用数)。

微信图片_20230613124159.png
你可以选择明确地命名这些行。注意行名的括号语法。

.container {
  grid-template-columns: [first] 40px [line2] 50px [line3] auto [col4-start] 50px [five] 40px [end];
  grid-template-rows: [row1-start] 25% [row1-end] 100px [third-line] auto [last-line];
}

微信图片_20230613124231.png
请注意,一个行可以有一个以上的名字。例如,这里的第二行将有两个名字:row1-endrow2-start

.container {
  grid-template-rows: [row1-start] 25% [row1-end row2-start] 25% [row2-end];
}

如果你的定义包含重复的部分,你可以使用 repeat() 符号来简化。

.container {
  grid-template-columns: repeat(3, 20px [col-start]);
}

它等同于:

.container {
  grid-template-columns: 20px [col-start] 20px [col-start] 20px [col-start];
}

如果多行同名,可以通过行名和计数来引用它们:

.item {
  grid-column-start: col-start 2;
}

fr 允许你将轨道的大小设置为网格容器自由空间的一部分。例如,这将把每个项目设置为网格容器宽度的三分之一。

.container {
  grid-template-columns: 1fr 1fr 1fr;
}

可用空间指的是非弹性项目之外的空间。在下面的示例中,fr 单位可用的空间指的是除50px之外的空间:

.container {
  grid-template-columns: 1fr 50px 1fr 1fr;
}

3.3 grid-template-areas

通过引用 grid-area 属性指定的网格区域的名称,定义一个网格模板。重复一个网格区域的名称会使内容跨越这些单元格。一个句号表示一个空单元。语法本身提供了一个可视化的网格结构。

可选的值:

  • <grid-area-name>:用grid-area指定的一个网格区域的名称。
  • .:句号表示一个空的网格单元
  • none:没有定义网格区域
.container {
  grid-template-areas: 
    "<grid-area-name> | . | none | ..."
    "...";
}

下面来一个例子:

.item-a {
  grid-area: header;
}
.item-b {
  grid-area: main;
}
.item-c {
  grid-area: sidebar;
}
.item-d {
  grid-area: footer;
}
.container {
  display: grid;
  grid-template-columns: 50px 50px 50px 50px;
  grid-template-rows: auto;
  grid-template-areas: 
    "header header header header"
    "main main . sidebar"
    "footer footer footer footer";
}

这将创建一个四列宽、三行高的网格。整个顶行将由页眉区域组成。中间一行将由两个主要区域、一个空单元和一个侧边栏区域组成。最后一行是所有的页脚。

微信图片_20230613124504.png
你声明中的每一行都需要有相同数量的单元格。你可以使用任何数量的相邻句点来声明一个空单元。只要这些句号之间没有空格,它们就代表一个单元格。

请注意,你用这种语法命名的不是线,只是区域。当你使用这种语法时,区域两端的线实际上是被自动命名的。如果你的网格区域的名称是foo,那么该区域的起始行和起始列的名称将是 foo-start,而最后一行和最后一列的名称将是 foo-end。这意味着有些行可能有多个名字,比如上例中最左边的一行,将有三个名字:header-startmain-startfooter-start

3.4 grid-template

这是 grid-template-rows + grid-template-columns + grid-template-areas 的简写。

可选的值:

  • none:将所有三个属性设置为初始值
  • <grid-template-rows> / <grid-template-columns>:将 grid-template-columnsgrid-template-rows 分别设置为指定值,并将 grid-template-areas 设置为none。


.container {
  grid-template: none | <grid-template-rows> / <grid-template-columns>;
}

它还接受一种更复杂但相当方便的语法来指定所有这三种情况。下面是一个例子。

.container {
  grid-template:
    [row1-start] "header header header" 25px [row1-end]
    [row2-start] "footer footer footer" 25px [row2-end]
    / auto 50px auto;
}

这等价于:

.container {
  grid-template-rows: [row1-start] 25px [row1-end row2-start] 25px [row2-end];
  grid-template-columns: auto 50px auto;
  grid-template-areas: 
    "header header header" 
    "footer footer footer";
}

由于 grid-template 不会重置隐含的网格属性 (grid-auto-columns, grid-auto-rows, 和 grid-auto-flow),这可能是你在大多数情况下想要做的,所以建议使用 grid 属性而不是 grid-template

还可以这样:

.container {  
    display: grid;  
    grid-template:  
        "head head head" minmax(150px, auto)  
        "sidebar content content" auto  
        "sidebar footer footer" auto / 1fr 1fr 1fr;  
}

3.5 column-gap 和 row-gap

column-gap(老的写法是 grid-column-gap) 和 row-gap(老的写法是 grid-row-gap) 用来指定网格线的大小。你可以把它看作是设置列/行之间的沟槽的宽度。

可选的值:

  • <line-size>:一个长度值
.container {
  /* 新的标准 */
  column-gap: <line-size>;
  row-gap: <line-size>;
  /* 老的写法 */
  grid-column-gap: <line-size>;
  grid-row-gap: <line-size>;
}

例如:

.container {
  grid-template-columns: 100px 50px 100px;
  grid-template-rows: 80px auto 80px; 
  column-gap: 10px;
  row-gap: 15px;
}

微信图片_20230613124701.png
gutters 只在列/行之间创建,而不是在外边缘。

注意:grid-前缀 将被移除,grid-column-gapgrid-row-gap 将被重新命名为 column-gaprow-gap。在 Chrome 68+Safari 11.2 Release 50+Opera 54+ 中已经支持无前缀的属性。

3.6 gap

row-gapcolumn-gap 的简写。

可选的值:

  • <grid-row-gap><grid-column-gap>:长度值


.container {
  /* 新的标准 */
  gap: <grid-row-gap> <grid-column-gap>;
  /* 老的写法 */
  grid-gap: <grid-row-gap> <grid-column-gap>;
}

例如:

.container {
  grid-template-columns: 100px 50px 100px;
  grid-template-rows: 80px auto 80px; 
  gap: 15px 10px;
}

如果没有指定 row-gap,它将被设置为与 column-gap 相同的值。

注意:grid-前缀 已被废弃(但谁知道呢,可能永远不会从浏览器中移除)。本质上,grid-gap 改名为 gap。在 Chrome 68+Safari 11.2 Release 50+Opera 54+ 中已经支持无前缀的属性。

3.7 justify-items

沿着内联(行)轴对齐网格项目(与沿着块(列)轴对齐的 align-items 相反)。这个值适用于容器内的所有网格项目。

可选的值:

  • start:使项目与单元格的起始边缘齐平。
  • end:对齐项目,使其与单元格的末端边缘齐平
  • center:使项目在其单元格的中心位置对齐
  • stretch:填充整个单元格的宽度(这是默认值)


.container {
  justify-items: start | end | center | stretch;
}

例如:

.container {
  justify-items: start;
}

微信图片_20230613124827.png

.container {
  justify-items: end;
}

微信图片_20230613124901.png

.container {
  justify-items: center;
}

微信图片_20230613124927.png

.container {
  justify-items: stretch;
}

微信图片_20230613124953.png
这种行为也可以通过 justify-self 属性在单个网格项目上设置。

相关文章
|
8天前
|
前端开发 容器
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等,解释了这些属性在弹性盒子布局中的作用和用法。
|
8天前
|
JavaScript 前端开发
网页前端课程设计-【模仿】香港中文大学官网,轮播图及div+css布局,js的dom操作
这篇文章介绍了如何模仿香港中文大学官网进行网页前端课程设计,包括使用div+css布局、js的DOM操作以及实现轮播图等技术细节。
|
2月前
|
前端开发 安全 容器
CSS如何优雅实现卡片多行排列布局?
【8月更文挑战第24天】CSS如何优雅实现卡片多行排列布局?
42 3
|
2月前
|
前端开发 开发者 容器
探索现代Web开发中的CSS Grid布局技术
【8月更文挑战第29天】在数字时代的浪潮中,网页设计不断进化以适应日新月异的用户需求。CSS Grid布局技术作为一项革新性的前端工具,为设计师和开发者提供了前所未有的布局能力。本文旨在通过深入浅出的方式介绍CSS Grid的核心概念、基本用法以及在实际项目中的应用,帮助读者快速掌握这一强大的网页布局工具。
41 3
|
2月前
|
前端开发 开发者 容器
【Web布局的革命】探索CSS Grid栅格系统,打造未来网页设计!
【8月更文挑战第25天】在网页设计领域,布局至关重要。传统的布局方法难以满足复杂需求,CSS Grid 栅格系统因此诞生。它是一种二维布局模式,能直接控制行和列,简化复杂网格的设计。通过定义 `display: grid;` 创建网格容器,并利用 `grid-template-columns` 和 `grid-template-rows` 设置行列尺寸,轻松实现响应式布局。此外,CSS Grid 支持高级功能,如网格区域划分和对齐设置,极大提升了布局的灵活性和创意空间。随着浏览器兼容性的增强,CSS Grid 必将成为未来网页设计的关键技术之一。
52 1
|
2月前
|
前端开发
CSS Grid 布局:span 关键字
CSS Grid 布局:span 关键字
44 0
|
5月前
|
Web App开发 XML 前端开发
CSS中的非布局样式+CSS布局 前端开发入门笔记(十一)
CSS中的非布局样式+CSS布局 前端开发入门笔记(十一)
64 0
|
前端开发
网站开发之DIV+CSS简单布局网站入门篇(五)
这篇文章主要介绍如何使用DIV和CSS简单布局一个网站的首页,通常将网站划分为顶部(Logo、导航条)、中部(页面主要内容、左右栏目)、底部(制作方介绍、超链接)。这是非常基础的一篇引入性文章,采用案例的方式进行介绍的,希望对你有所帮助。运行结果如下图所示:main.html主页面代码:主要通过di
3610 0
|
前端开发 容器 JavaScript
CSS Grid布局入门
相信大家都比较熟悉flex布局了,最近有空研究了波grid布局,感觉虽然兼容性还不是太高,应用不是太普遍,但是功能非常强大。未来应该是grid+flex为主流,grid是二维布局,很灵活,适合整体构架,而flex是一维布局,适合处理局部细节。
1166 0
|
前端开发 JavaScript