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

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

3.8 align-items

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

可选的值:

  • stretch - 填充整个单元格的高度(这是默认的)
  • start - 使项目与单元格的起始边缘齐平
  • end - 使项目与单元格的末端边缘齐平
  • center - 使项目在单元格的中心对齐。
  • baseline - 沿着文本基线对齐项目。基线有一些修饰词--第一条基线和最后一条基线,在多行文本的情况下,它们将使用第一行或最后一行的基线。
.container {
  align-items: start | end | center | stretch;
}

下面来看例子:

.container {
  align-items: start;
}

微信图片_20230613125147.png

.container {
  align-items: end;
}

微信图片_20230613125225.png

.container {
  align-items: center;
}

微信图片_20230613125251.png

.container {
  align-items: stretch;
}

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

还有修饰关键字 safeunsafe(用法类似于 align-items: safe end)。safe 关键字的意思是 "尝试像这样对齐,但如果这意味着对齐一个项目,使其移动到不可访问的溢出区域,则不能这样做",而 unsafe 将允许将内容移动到不可访问的区域("数据丢失")。

3.9 place-items

place-itemsalign-itemsjustify-items 的简写属性。

可选的值:

  • <align-items> / <justify-items>:第一个值设置 align-items,第二个值设置justify-items。如果省略了第二个值,第一个值将被分配给两个属性。

更多细节,请看 align-itemsjustify-items

这对于超级快速的多方向居中非常有用:

.center {
  display: grid;
  place-items: center;
}

3.10 justify-content

有时,你的网格的总尺寸可能小于其网格容器的尺寸。如果你所有的网格项目都是用非灵活的单位(如 px)来确定大小,就会发生这种情况。在这种情况下,你可以设置网格在网格容器中的对齐方式。这个属性沿内联(行)轴对齐网格(与沿块(列)轴对齐网格的 align-content 相反)。

可选的值:

  • start:使网格与网格容器的起始边缘齐平。
  • end:使网格与网格容器的末端边缘齐平。
  • center:使网格在网格容器的中心对齐。
  • stretch:调整网格项目的大小,让网格填满网格容器的全部宽度
  • space-around:在每个网格项目之间放置一个均匀的空间,在远端有一半的空间。
  • space-between:在每个网格项之间放置一个均匀的空间,远端没有空间
  • space-evenly:在每个网格项目之间放置一个均匀的空间,包括远端。
.container {
  justify-content: start | end | center | stretch | space-around | space-between | space-evenly;    
}

下面来看实例:

.container {
  justify-content: start;
}

微信图片_20230613125434.png

.container {
  justify-content: end;    
}

微信图片_20230613125503.png

.container {
  justify-content: center;    
}

微信图片_20230613125532.png

.container {
  justify-content: stretch;    
}

微信图片_20230613125601.png

.container {
  justify-content: space-around;    
}

微信图片_20230613125639.png

.container {
  justify-content: space-between;    
}

微信图片_20230613125707.png

.container {
  justify-content: space-evenly;    
}

微信图片_20230613125736.png

3.11 align-content

有时,你的网格的总尺寸可能小于其网格容器的尺寸。如果你所有的网格项目都是用非灵活的单位(如 px)来确定大小,就会发生这种情况。在这种情况下,你可以设置网格在网格容器中的对齐方式。这个属性使网格沿着块(列)轴对齐(与justify-content相反,它使网格沿着内联(行)轴对齐)。

可选的值:

  • start:使网格与网格容器的起始边缘齐平。
  • end:使网格与网格容器的末端边缘齐平。
  • center:使网格在网格容器的中心对齐。
  • stretch:调整网格项目的大小,让网格填满网格容器的全部高度。
  • space-around:在每个网格项目之间放置一个均匀的空间,在远端有一半的空间。
  • space-between:在每个网格项之间放置一个均匀的空间,远端没有空间。
  • space-evenly:在每个网格项目之间放置一个均匀的空间,包括远端


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

下面来看例子:

.container {
  align-content: start;    
}

微信图片_20230613125838.png

.container {
  align-content: end;    
}

微信图片_20230613125907.png

.container {
  align-content: center;    
}

微信图片_20230613125943.png

.container {
  align-content: stretch;    
}

微信图片_20230613130009.png

.container {
  align-content: space-around;    
}

微信图片_20230613130035.png

.container {
  align-content: space-between;    
}

微信图片_20230613130101.png

.container {
  align-content: space-evenly;    
}

微信图片_20230613130130.png

3.12 place-content

place-contentalign-contentjustify-content 属性的简写。

可选的值:

  • <align-content> / <justify-content>:第一个值设置 align-content,第二个值设置justify-content。如果省略了第二个值,则第一个值将被分配给两个属性。

Edge 外,所有主要浏览器都支持 place-content 简写属性。

更多细节,请看 align-contentjustify-content

3.13 grid-auto-columns 和 grid-auto-rows

grid-auto-columnsgrid-auto-rows 用来指定任何自动生成的网格轨迹(又称隐式网格轨迹)的大小。当网格中的网格项多于单元格时,或者当一个网格项被放置在显式网格之外时,就会创建隐式轨道。(参见《显式网格和隐式网格的区别》)。

可选的值:

  • <track-size>:可以是一个长度,一个百分比,或者网格中自由空间的一部分(使用fr单位)。
.container {
  grid-auto-columns: <track-size> ...;
  grid-auto-rows: <track-size> ...;
}

为了说明隐性网格轨道是如何被创建的,看看这个:

.container {
  grid-template-columns: 60px 60px;
  grid-template-rows: 90px 90px;
}

微信图片_20230613130231.png
这里创建了一个 2 x 2 的网格。

但现在想象一下,你用 grid-columngrid-row 来定位你的网格项目,像这样:

.item-a {
  grid-column: 1 / 2;
  grid-row: 2 / 3;
}
.item-b {
  grid-column: 5 / 6;
  grid-row: 2 / 3;
}

微信图片_20230613130312.png我们告诉 .item-b第5列 开始,在 第6列 结束,但我们从未定义过 第5列第6列。因为我们引用了不存在的行,所以创建了宽度为0的隐式轨道来填补空白。我们可以使用 grid-auto-columnsgrid-auto-rows 来指定这些隐式轨道的宽度。

.container {
  grid-auto-columns: 60px;
}

微信图片_20230613130350.png

3.14 grid-auto-flow

如果你有没有明确放置在网格上的网格项目,自动放置算法会启动,自动放置这些项目。这个属性控制了自动摆放算法的工作方式。

可选的值:

  • row:告诉自动放置算法依次填入每一行,必要时添加新行(默认值)
  • column:告诉自动放置算法依次填入每一列,必要时添加新的列
  • dense:告诉自动放置算法,如果较小的项目出现在网格中,则尝试在网格中较早的地方填上洞。
.container {
  grid-auto-flow: row | column | row dense | column dense;
}

请注意,dense 只是改变了你的项目的视觉顺序,可能会导致它们出现失序,这对可访问性不利。

看看下面这个例子:

<section class="container">
  <div class="item-a">item-a</div>
  <div class="item-b">item-b</div>
  <div class="item-c">item-c</div>
  <div class="item-d">item-d</div>
  <div class="item-e">item-e</div>
</section>

定义了一个五列两行的网格,并将网格自动流设置为行(这也是默认的):

.container {
  display: grid;
  grid-template-columns: 60px 60px 60px 60px 60px;
  grid-template-rows: 30px 30px;
  grid-auto-flow: row;
}

当把 items 放在网格上时,你只为其中两个物品指定位置:

.item-a {
  grid-column: 1;
  grid-row: 1 / 3;
}
.item-e {
  grid-column: 5;
  grid-row: 1 / 3;
}

因为我们把 grid-auto-flow 设置为行,所以我们的网格会看起来像这样。注意我们没有放置的三个项目(item-bitem-citem-d)是如何在可用的行间流动的。

微信图片_20230613130520.png
如果我们把 grid-auto-flow 设置为 column,那么 item-bitem-citem-d 就会沿着 column 流动。

.container {
  display: grid;
  grid-template-columns: 60px 60px 60px 60px 60px;
  grid-template-rows: 30px 30px;
  grid-auto-flow: column;
}

微信图片_20230613130551.png

3.15 grid

gridgrid-template-rows, grid-template-columns, grid-template-areas, grid-auto-rows, grid-auto-columns, 和 grid-auto-flow(注意:你只能在一个网格声明中指定显式或隐式网格属性)属性的缩写。

可选的值:

  • none:将所有子属性设置为初始值。
  • <grid-template>:与 grid-template 速记的作用相同。
  • <grid-template-rows> / [ auto-flow && dense? ] <grid-auto-columns>?:将grid-template-rows 设置为指定的值。如果 auto-flow 关键字在斜线的右边,它将 grid-auto-flow 设置为列。如果另外指定了 dense 关键字,自动放置算法就会使用 "dense "的打包算法。如果省略了 grid-auto-columns,它被设置为自动。
  • [ auto-flow && dense? ] <grid-auto-rows>?/ <grid-template-columns>:将grid-template-columns 设置为指定值。如果 auto-flow 关键字在斜线的左边,它设置 grid-auto-flow 为行。如果另外指定了 dense 关键字,自动排布算法就会使用 "dense "的打包算法。如果 grid-auto-rows 被省略,它被设置为自动。

下面的两个代码块是等价的:

.container {
  grid: 100px 300px / 3fr 1fr;
}
.container {
  grid-template-rows: 100px 300px;
  grid-template-columns: 3fr 1fr;
}

下面的两个代码块是等价的:

.container {
  grid: auto-flow / 200px 1fr;
}
.container {
  grid-auto-flow: row;
  grid-template-columns: 200px 1fr;
}

下面的两个代码块是等价的:

.container {
  grid: auto-flow dense 100px / 1fr 2fr;
}
.container {
  grid-auto-flow: row dense;
  grid-auto-rows: 100px;
  grid-template-columns: 1fr 2fr;
}

下面的两个代码块是等价的:

.container {
  grid: 100px 300px / auto-flow 200px;
}
.container {
  grid-template-rows: 100px 300px;
  grid-auto-flow: column;
  grid-auto-columns: 200px;
}

它也接受一种更复杂但相当方便的语法,可以一次性设置所有的东西。你指定了 grid-template-areasgrid-template-rowsgrid-template-columns,其他所有的子属性都被设置为初始值。你所做的是在各自的网格区域内指定行名和轨道尺寸。用一个例子来描述这个问题是最容易的:

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

上面等价于:

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

4、Grid 项目属性

需要注意的是float, display: inline-block, display: table-cell, vertical-aligncolumn-* 属性对网格 items 没有影响。

4.1 grid-column-start、grid-column-end、grid-row-start 和 grid-row-end

通过引用特定的网格线来确定一个网格 item 在网格中的位置。 grid-column-start/grid-row-start 是项目开始的线,grid-column-end/grid-row-enditem 结束的线。

可选的值:

  • <line>:可以是一个数字,指的是一个有编号的网格线,或者是一个名称,指的是一个有名称的网格线
  • span <number>:该项目将跨越所提供的网格行数
  • span <name>:项目将跨越,直到它到达下一个具有所提供的名称的行。
  • auto:表示自动放置,自动跨度,或者默认跨度为1。
.item {
  grid-column-start: <number> | <name> | span <number> | span <name> | auto;
  grid-column-end: <number> | <name> | span <number> | span <name> | auto;
  grid-row-start: <number> | <name> | span <number> | span <name> | auto;
  grid-row-end: <number> | <name> | span <number> | span <name> | auto;
}

下面来看例子:

.item-a {
  grid-column-start: 2;
  grid-column-end: five;
  grid-row-start: row1-start;
  grid-row-end: 3;
}

微信图片_20230613130833.png

.item-b {
  grid-column-start: 1;
  grid-column-end: span col4-start;
  grid-row-start: 2;
  grid-row-end: span 2;
}

微信图片_20230613130902.png如果没有声明 grid-column-end/grid-row-end,该项目将默认跨越1个轨道。

项目可以相互重叠。你可以使用 z-index 来控制它们的堆叠顺序。

span 关键字

如果你用 grid-columngrid-row 把项目放到它们的父网格上,当项目应该跨越多于一列或一行时,你可以使用 span关键字 来避免指定结束线。

给出一个网格项的以下 CSS 规则,它跨越了 3列2行

.item {
  grid-column: 2 / 5;
  grid-row: 1 / 3;
}

我们可以像这样使用 span关键字 来代替:

.item {
  grid-column: 2 / span 3;
  grid-row: 1 / span 2;
}

可以提供端线,用跨度代替起始线,在这种情况下,跨度的作用是相反的,所以下面也是等同的:

.item {
  grid-column: span 3 / 5;
  grid-row: span 2 / 3;
}

如果多行有相同的名字,你可以像下面的例子那样定义开始和结束行:

.item {
  grid-column: col 2 / col 7;
  grid-row: content 6 / content 10;
}

该项目从 第2行col列 开始,在 第7行 结束,也叫 col。同样地,它开始于 第6行,名为row,结束于 第10行,名为 row

在这里,span关键字 也可以提供帮助,下面的内容是等效的:

.item {
  grid-column: col 2 / span col 5;
  grid-row: content 6 / span content 4;
}

span 也可以和 grid-area 属性一起使用。例如,如果我们希望一个项目被自动放置,但要跨越所提供的行和列的数量:

.item {
  grid-area: span 6 / span 4;
}

4.2 grid-column 和 grid-row

  • grid-row 属性是 grid-row-startgrid-row-end 的简写形式
  • grid-column 属性是 grid-column-startgrid-column-end 的简写形式

grid-columngrid-row 属性用于定义元素将显示在哪一行或哪一列。

可选的值:

  • <start-line> / <end-line>:每一个都接受所有与长写版本相同的值,包括跨度。

如果指定了两个<grid-line>值,那么斜杠号前的值就被指定为 grid-row-start,斜杠后面的值就被指定为 grid-row-end 的值。

.item {
  grid-column: <start-line> / <end-line> | <start-line> / span <value>;
  grid-row: <start-line> / <end-line> | <start-line> / span <value>;
}

grid-rowgrid-column 允许开发者将一个元素放置在网格容器中的特定单元格中。

grid-row属性定义了一个网格项所跨越的行数,可以使用一个值或一对值来指定。如果只指定一个值,则网格项跨越指定的行数。如果使用一对值,则第一个值表示网格项的起始行,第二个值表示网格项的结束行。可以使用数字、关键字和表达式作为值。

例如,下面的代码将一个元素放置在第一行,并跨越三行:

grid-row: 1 / span 3;

grid-column属性定义了一个网格项所跨越的列数,使用方法与grid-row类似。同样可以使用一个值或一对值来指定。如果只指定一个值,则网格项跨越指定的列数。如果使用一对值,则第一个值表示网格项的起始列,第二个值表示网格项的结束列。

例如,下面的代码将一个元素放置在第一列,并跨越两列:

grid-column: 1 / span 2;

需要注意的是,grid-rowgrid-column属性只能在网格容器中使用。当一个元素被放置在网格容器中时,它会自动成为网格项,而且这些属性就可以用来对其进行定位和布局。

下面来看例子:

.item-c {
  grid-column: 3 / span 2;
  grid-row: third-line / 4;
}

微信图片_20230613131156.png
如果没有声明端线值,项目将默认为跨越1个轨道。

下面看一个demo:

div class="grid">
  <div style="
    grid-column: 1 / 3;
    grid-row: 2 / 3;
  ">
  </div>
  <div style="
    grid-column: 3 / -1;
    grid-row: 1 / 2;
  ">
  </div>
  <div style="
    grid-column: 3 / 4;
    grid-row: 2 / 4;
  ">
  </div>
</div>

4.3 grid-area

给予一个项目一个名字,以便它可以被用 grid-template-areas 属性创建的模板所引用。另外,这个属性可以作为 grid-row-start + grid-column-start + grid-row-end + grid-column-end 的一个更简短的缩写。

可选的值:

  • <name>:你选择的名称
  • <row-start> / <column-start> / <row-end> / <column-end>:可以是数字或命名的行。
.item {
  grid-area: <name> | <row-start> / <column-start> / <row-end> / <column-end>;
}

下面来看例子:

.item-d {
  grid-area: header;
}

grid-row-start + grid-column-start + grid-row-end + grid-column-end的简写:

.item-d {
  grid-area: 1 / col4-start / last-line / 6;
}

微信图片_20230613131359.png

相关文章
|
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
|
2月前
|
前端开发
2s 利用 HTML+css动画实现企业官网效果
2s 利用 HTML+css动画实现企业官网效果
HTML+CSS 实现通用的企业官网页面(记得收藏)
HTML+CSS 实现通用的企业官网页面(记得收藏)
|
2天前
|
前端开发 JavaScript 搜索推荐
打造个人博客网站:从零开始的HTML和CSS之旅
【9月更文挑战第32天】在这个数字化的时代,拥有一个个人博客不仅是展示自我的平台,也是技术交流的桥梁。本文将引导初学者理解并实现一个简单的个人博客网站的搭建,涵盖HTML的基础结构、CSS样式的美化技巧以及如何将两者结合来制作一个完整的网页。通过这篇文章,你将学会如何从零开始构建自己的网络空间,并在互联网世界留下你的足迹。
|
3天前
|
前端开发 JavaScript 搜索推荐
打造个人博客网站:从零开始的HTML与CSS之旅
【9月更文挑战第31天】在这个数字时代,拥有一个个人博客网站是展示自我、分享知识和连接世界的重要方式。本文将引导你通过简单的HTML和CSS知识,一步步构建起你的在线空间。无论你是编程新手还是希望通过实践加深理解,这篇文章都将是你的理想指南。我们将探索基本概念,实现页面布局,并点缀以个性化样式,最终将静态页面转变为动态交互式网站。准备好了吗?让我们开始吧!