【重学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 属性在单个网格项目上设置。

相关文章
|
2月前
|
前端开发 算法 Java
(CSS)使用Flex布局,帮助你快速了解各种基本的Flex布局属性以及帮你让元素快速达到布局中的指定位置!
(CSS)使用Flex布局,帮助你快速了解各种基本的Flex布局属性以及帮你让元素快速达到布局中的指定位置!
130 1
|
2月前
|
前端开发 算法 Java
【CSS】前端三大件之一,如何学好?从基本用法开始吧!(六):全方面分析css的Flex布局,从纵、横两个坐标开始进行居中、两端等元素分布模式;刨析元素间隔、排序模式等
Flex 布局 布局的传统解决方案,基于盒状模型,依赖 display 属性 + position属性 + float属性。它对于那些特殊布局非常不方便,比如,垂直居中就不容易实现。 2009年,W3C 提出了一种新的方案----Flex 布局,可以简便、完整、响应式地实现各种页面布局。目前,它已经得到了所有浏览器的支持,这意味着,现在就能很安全地使用这项功能。 一、Flex 布局是什么? Flex 是 Flexible Box 的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性。
269 1
|
6月前
|
前端开发
用 CSS Grid 轻松构建复杂布局
用 CSS Grid 轻松构建复杂布局
319 83
|
5月前
|
Web App开发 前端开发 数据可视化
用 CSS Grid 实现高效布局的 3 个实战技巧
用 CSS Grid 实现高效布局的 3 个实战技巧
|
前端开发 JavaScript 开发者
掌握 CSS 弹性布局(Flexbox):构建复杂页面布局的高效秘籍与实战案例
CSS弹性布局(Flexbox)是现代网页设计中构建复杂页面布局的高效工具。本文将深入浅出地介绍Flexbox的核心概念、使用技巧及实际应用案例,帮助读者快速掌握这一强大布局方法。
|
Web App开发 XML 前端开发
CSS中的非布局样式+CSS布局 前端开发入门笔记(十一)
CSS中的非布局样式+CSS布局 前端开发入门笔记(十一)
196 0
|
前端开发
网站开发之DIV+CSS简单布局网站入门篇(五)
这篇文章主要介绍如何使用DIV和CSS简单布局一个网站的首页,通常将网站划分为顶部(Logo、导航条)、中部(页面主要内容、左右栏目)、底部(制作方介绍、超链接)。这是非常基础的一篇引入性文章,采用案例的方式进行介绍的,希望对你有所帮助。运行结果如下图所示:main.html主页面代码:主要通过di
3796 0
|
前端开发 容器 JavaScript
CSS Grid布局入门
相信大家都比较熟悉flex布局了,最近有空研究了波grid布局,感觉虽然兼容性还不是太高,应用不是太普遍,但是功能非常强大。未来应该是grid+flex为主流,grid是二维布局,很灵活,适合整体构架,而flex是一维布局,适合处理局部细节。
1305 0

热门文章

最新文章

  • 1
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(九):强势分析Animation动画各类参数;从播放时间、播放方式、播放次数、播放方向、播放状态等多个方面,完全了解CSS3 Animation
    228
  • 2
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(八):学习transition过渡属性;本文学习property模拟、duration过渡时间指定、delay时间延迟 等多个参数
    220
  • 3
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(七):学习ransform属性;本文学习 rotate旋转、scale缩放、skew扭曲、tanslate移动、matrix矩阵 多个参数
    159
  • 4
    (CSS)使用Flex布局,帮助你快速了解各种基本的Flex布局属性以及帮你让元素快速达到布局中的指定位置!
    130
  • 5
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(六):全方面分析css的Flex布局,从纵、横两个坐标开始进行居中、两端等元素分布模式;刨析元素间隔、排序模式等
    269
  • 6
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(五):背景属性;float浮动和position定位;详细分析相对、绝对、固定三种定位方式;使用浮动并清除浮动副作用
    401
  • 7
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(四):元素盒子模型;详细分析边框属性、盒子外边距
    175
  • 8
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(三):元素继承关系、层叠样式规则、字体属性、文本属性;针对字体和文本作样式修改
    111
  • 9
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(二):CSS伪类:UI伪类、结构化伪类;通过伪类获得子元素的第n个元素;创建一个伪元素展示在页面中;获得最后一个元素;处理聚焦元素的样式
    188
  • 10
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(一):CSS发展史;CSS样式表的引入;CSS选择器使用,附带案例介绍
    257