CSS布局 Flex 和 Grid

本文回顾了CSS中的Flexbox弹性盒子布局,介绍了主轴、侧轴和对齐方式,以及元素的缩放、顺序和自对齐。同时,详细讲解了Grid布局的网格定义、对齐、间隙和FR单位,展示了Grid布局在二维布局上的优势。

在 CSS 中,理解 flex 和 Grid 布局非常重要,今天把这两个重要知识点回顾一下。

Flexbox 弹性盒子布局

弹性布局支持 flex、inline-flex,支持块和内联。

容器
  1. 轴的概念,在 Flexbox,有主轴和侧轴的概念,轴可以理解行和列,对于轴还有一个方向的概念,默认情况,行的方向是从左至右,列的方向是从上至下。通过 flex-direction 控制
  2. 对齐方式,flex 容器的对齐方方式有三种,justify-content 主轴对齐,默认flex-start 左对齐,align-items 侧轴对齐,默认stretch充满,align-content 行对其方式,默认stretch充满。align-items和 align-content,一个是元素在行内的对齐方式,一个行间的对其方式。
  3. 换行:默认 flexbox 是不换行的。
元素
  1. 支持元素按比例缩放,flex-grow: 放大占比,flex-shrink:缩小占比,flex-basis:初始化尺寸。flex-basis 一般都是 auto,如果需要将布局与实际元素尺寸进行分离可以设置对应的大小。
  2. 自对齐:与容器的 3 种对齐方式不同,自对齐只针对元素自身。
  3. 顺序:可以定义元素顺序,元素在容器内根据顺序进行排列

从 CSS tricky 盗了一张图,帮助使用理解 flexbox,非常直观。

在这里插入图片描述

Grid网格布局

Flexbox 设计用于一维布局(行或列),而 Grid 允许同时进行水平和垂直布局对齐,非常适合更复杂的网页设计。通过将元素的 display 属性设置为 grid 或 inline-grid来实现一个网格布局,支持块和内联。

容器
  1. 网格定义:显式网格:可以使用 grid-template-rows、grid-template-columns 和 grid-template-areas 定义网格行和列。隐式网格:自动生成行和列,通过 grid-auto-rows、grid-auto-columns 和 grid-auto-flow 进行管理。例如我如果网络超出了定义,如果定义了 3x3 网格,但却放入了 10 个元素,那么网格就会使用隐式定义,auto-rows、auto-columns 默认都是auto,auto-flow 默认是行,自动加行。
  2. 指定位置:可以使用 grid-row-start、grid-row-end、grid-column-start 和 grid-column-end 指定放到什么位置。或者使用简写属性 grid-row、grid-column 和 grid-area。grid-area 属性允许将项目放置在 grid-template-areas 中定义的特定区域。例如,下面的代码
.item-a {
  grid-column: 1 / 2;
  grid-row: 2 / 3;
}

.item {
    grid-area: 2 / 1 / 4 / 3; // 指定坐标<row-start> / <column-start> / <row-end> / <column-end>;
}
  1. 对齐:网格提供 justify-items(单元格内行对齐)、align-items(单元格内列对齐)、justify-content(行对齐) 和 align-content(列对齐) 等属性来控制元素在其单元格内的对齐方式以及整个网格在其容器内的对齐方式。
  2. 间隙属性:row-gap、column-gap 和简写的 gap 属性允许定义行和列之间的空间。
  3. FR单位:自动调整以适应可用空间,例如 repeat(3, 1fr); 等宽 3 列。
元素
  1. 对齐:justify-self单个元素单元格内行对齐,align-self单个元素单元格内列对齐。

Grid 布局比 Flow 布局灵活也复杂一些,同样来一张图便于理解。

在这里插入图片描述

### CSS Flexbox 布局Grid 布局的区别及使用场景 #### 1. **基本概念** Flexbox 是一种一维布局模式,主要用于解决单向(水平或垂直)的布局需求。它通过灵活调整子项的空间分布、对齐方式等特性,使得页面元素能够在不同屏幕尺寸下保持良好的适应性[^1]。 相比之下,Grid 布局是一种二维布局模式,允许开发者在同一时间管理行列的结构。这种能力使其非常适合用于构建复杂的网格系统,比如网站的整体框架或者图片画廊等场景[^2]。 --- #### 2. **开启方式** 要启用 Flexbox 布局,只需将父容器的 `display` 属性设置为 `flex` 或 `inline-flex` 即可。例如: ```css .container { display: flex; } ``` 对于 Grid 布局,则需要将父容器的 `display` 设置为 `grid` 或 `inline-grid` 来启动该功能。例如: ```css .container { display: grid; } ``` 两者都支持嵌套使用,但在实际应用中需注意性能优化[^3]。 --- #### 3. **主轴与交叉轴的概念** 在 Flexbox 中存在两个核心维度——主轴(main axis)交叉轴(cross axis)。默认情况下,主轴沿水平方向展开而交叉轴则处于竖直状态;不过可以通过修改 `flex-direction` 改变这一行为[^4]。 而在 Grid 系统里并没有严格区分所谓的“主次”,因为其本质上就是基于行列共同作用形成的矩阵型架构。 --- #### 4. **具体属性对比** | 功能/属性 | Flexbox | Grid | |-------------------|---------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------| | 定义容器 | 使用 `display: flex;` | 使用 `display: grid;` | | 控制排列方向 | 利用 `flex-direction` (row/column) | 不单独提供此选项,由定义行列决定 | | 子项间距设定 | 需借助 margin/padding 或者 gap | 可直接利用 `gap`, 如 `column-gap`,`row-gap` | | 对齐方式 | 主轴(`justify-content`) & 交叉轴 (`align-items`) | 更加细化的支持多种组合形式 | 更多细节可以参见官方文档说明^. --- #### 5. **典型应用场景分析** ##### (1)**Flexbox 的适用范围** 当面对简单的线性排布任务时,如导航栏设计、按钮组摆放或是表单项整齐化处理等问题,Flexbox 显示出了极大的便利性简洁度[^3]。 示例代码如下所示: ```html <div class="nav-bar"> <a href="#">Home</a> <a href="#">About</a> <a href="#">Contact</a> </div> <style> .nav-bar { display:flex; justify-content:space-around; /* 平均分配剩余空间 */ } </style> ``` ##### (2)**Grid 的擅长领域** 如果目标是要搭建整个页面的大纲轮廓或者是呈现多张照片组成的相册效果的话,那么采用 Grid 将会更加合适一些[^4]. 实例演示: ```html <div class="gallery"> <img src="image1.jpg"/> <img src="image2.jpg"/> ... </div> <style> .gallery{ display:grid; grid-template-columns:repeat(3,minmax(100px,1fr));/* 创建三列表格并自适应宽度变化*/ gap:1em;/* 添加间隙 */ } </style> ``` --- #### 总结 综上所述,虽然二者都能完成一定的布局工作,但由于设计理念的不同决定了它们各自最佳的应用场合。简单来说,如果是针对单一维度内的对象安排考虑选用 Flexbox ,而对于涉及多个纵横交错部分的情况推荐运用 Grid 技术[^1].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值