CSS Grid 和 Flexbox 简明指南
作者:穆罕默德·阿尔斯兰·萨尔瓦尔
介绍
Flexbox 通过空间分配和对齐功能,帮助创建一维布局。它无需使用浮动或定位,即可轻松设计响应式布局,极大地简化了 CSS 开发者的工作。
网格是一种二维布局模型,有助于创建布局并对齐其中的元素。它提供了一种包含行和列的布局系统,无需使用浮动和定位即可轻松设计网页。
使用 CSS 创建布局可能比较棘手,而 Flexbox 和 Grid 都可用于页面布局设计,这更增加了设计的复杂性。本指南将介绍 Flexbox 和 Grid 之间的一些区别。我们将探讨在设计布局时如何选择使用哪一种布局。
本指南将涵盖以下内容:
先决条件
- CSS布局基础知识
- 对 CSS Flexbox 的基本了解
- 对 CSS Grid 的基本了解
子元素控制
Flexbox 为子元素提供了强大的控制功能。以下示例中有三个子元素。
如果设置了该选项display: flex,就会创建一个弹性布局。你会注意到,布局中并没有三个等宽的列。这是弹性盒子布局的默认行为,因为布局尺寸是自动计算的。
<div class="parent">
<div class="child">
<h3>Lorem ipsum</h3>
<p>Lorem ipsum dolor sit.</p>
</div>
<div class="child">
<h3>Lorem ipsum</h3>
<p>Aestiae voluptatum expedita minima doloribus nemo ipsa vel. Ducimus nam, vel rerum quisquam illum maxime cumque.</p>
</div>
<div class="child">
<h3>Lorem ipsum</h3>
<p>Lorem ipsum dolor sit, amet consectetur adipisicing elit. Vitae molestiae voluptatum expedita minima doloribus nemo ipsa vel. Ducimus nam, </p>
</div>
</div>
.parent {
display: flex;
width: 100%;
max-width: 50rem;
margin: 0 auto;
padding: 1rem;
border: 3px solid lime;
}
.child {
padding: 1rem;
border: 3px dashed red;
background: white;
}
如果你想创建三个宽度相等的列,不能在父元素中直接操作。你需要在子元素中设置 `<div>`width:100%或 `<div>`属性flex:1。这样会创建三个宽度相等的子元素。
基本上,子元素之所以拥有控制权,是因为父元素在 flexbox 布局中将控制权委托给了子元素。如果子元素的内容相同,它们的大小自然也相同,无需进行width:100%任何调整flex:1。
所以,在使用 flexbox 时我们需要格外小心。
与 Flexbox 不同,父元素可以完全控制 Grid 布局。让我们使用 Grid 布局创建上面的布局:
.parent {
display: grid;
width: 100%;
max-width: 50rem;
margin: 0 auto;
padding: 1rem;
border: 3px solid lime;
}
display: flex如果我们改成这样,什么也不会发生display: grid。你必须采取其他措施才能真正把事情安排妥当。
所以,在父元素中添加这行代码grid-template-columns: 1fr 1fr 1fr。这样,内容就会适应创建的列。创建网格时,网格的子元素会适应这些单元格。
内在和外在尺寸
在 CSS 中,尺寸有内在尺寸和外在尺寸之分,例如:
.intrinsic-size {
width: auto;
}
.extrinsic-size {
width: 500px;
}
这是CSS布局工作原理中非常重要的一部分。在固有尺寸设置中,浏览器会自动计算元素的大小。
外部尺寸调整是指声明一个特定的宽度。而 Flexbox 则主要依赖元素在缩放时的内在尺寸调整。
<div class="product">
<img src="https://assets.codepen.io/308367/betteroutreach-logo.avif">
<div class="product__info">
<h2>Product One</h2>
<p>A collection of the best cold email templates ever sent</p>
<div class="product__meta">
<div>Free Options</div>
<div>Email</div>
</div>
</div>
</div>
<div class="product">
<img src="https://assets.codepen.io/308367/sliderule-logo.avif">
<div class="product__info">
<h2>Product two</h2>
<p>The no-code rules engine for risk & fraud</p>
<div class="product__meta">
<div>Free</div>
<div>Social Network</div>
</div>
</div>
</div>
<div class="product">
<img src="https://assets.codepen.io/308367/warmy-logo.avif">
<div class="product__info">
<h2>Product three</h2>
<p>Auto all-in-one tool to make your email channel reliable</p>
<div class="product__meta">
<div>Free Options</div>
<div>Email</div>
</div>
</div>
</div>
.product__meta {
font-size: 12px;
outline: 3px solid red;
display: flex;
gap: 1rem;
}
.product__meta > * {
border: 3px solid lime;
}
body {
display: grid;
padding: var(--size-9);
align-content: start;
gap: var(--size-9);
background: white;
}
.product {
display: grid;
gap: var(--size-5);
grid-template-columns: 5rem 1fr;
}
.product__info {
display: grid;
grid-template-rows: min-content;
}
Flexbox 首先会计算内容的大小。这样一来display:flex,元素的大小就完全取决于内容的大小。
如果在产品元数据中启用 flex 布局,则两列的宽度将根据内容大小自动调整。这有助于创建所需的布局。因此,动态列布局可以适应这种布局。
与网格布局不同,网格布局中每一列都会占据整个宽度,或者需要在父元素中指定大小。
.product__meta {
font-size: 12px;
outline: 3px solid red;
// ====>
display: grid;
// <====
gap: 1rem;
}
因此,在这种情况下,Flexbox 布局能提供更大的灵活性。而 Grid 布局则有助于创建更可控的布局。
盒式对齐
别忘了盒子对齐。因为 Flexbox 可以轻松地对齐元素。在 Flexbox 出现之前,要正确地对齐元素非常困难。人们需要使用各种技巧和窍门才能将元素对齐到所需的布局中。
Flexbox 也可以用于网格布局。每当您需要创建具有特定对齐方式或空间分布的布局时,您都可以考虑使用 Flexbox。
Flexbox 和 Grid 的行为
网格系统在创建更复杂、更有条理的布局时非常有用。设计页面布局时,可以使用网格系统来构建整体布局。而弹性布局则更适合创建单个元素。
由于 Flexbox 基于固有尺寸,因此当布局取决于内容时,可以使用 Flexbox。另一方面,当内容取决于布局时,Grid 布局则更为适用。
用例
Flexbox 非常适合帮助对齐内容和移动模块,是应用程序组件和小规模布局的绝佳选择,而网格布局则更适合大面积布局。
弹性方向允许您垂直或水平对齐内容,这在创建反向行或列时非常有用。
使用 flexbox:
- 如果您的项仅位于一个维度上,无论是行还是列。
- 如果内容决定布局,那么就采取了内容优先的方法。
- 如果您希望保持容器内的项目彼此独立。
使用网格:
- 当需要将项目排列成行和列时。
- 当布局决定内容时,它采用的是布局优先的方法。
- 当您想要设计页面的整体布局时。
浏览器支持
结论
当你需要创建网页的外部布局时,网格系统是你的最佳帮手。有了它,复杂的布局设计不再遥不可及,而且还能实现响应式设计!
总而言之,何时应该使用 Flexbox,何时应该使用 Grid。虽然 Flexbox 和 Grid 都可以用于设计任何布局,但您应该选择阻力最小的方案。
构建基于 React 的 CRUD 应用程序,不受任何限制
构建 CRUD 应用涉及许多重复性任务,会耗费您宝贵的开发时间。如果您是从零开始,还需要为应用的关键部分(例如身份验证、授权、状态管理和网络)实现自定义解决方案。
如果您对具有强大架构和丰富行业最佳实践的无头框架感兴趣,并希望将其应用于您的下一个 CRUD 项目,不妨了解一下refine。
refine是一个基于 React 的开源框架,用于构建不受限制的 CRUD 应用程序。
它可以将开发速度提升高达3 倍,同时又不影响样式、自定义和项目工作流程的自由度。
refine从设计上就是无头的,它开箱即用地连接了30 多个后端服务,包括自定义 REST 和 GraphQL API。
访问refine GitHub 存储库以获取更多信息、演示、教程和示例项目。
文章来源:https://dev.to/refine/a-brief-guide-for-css-grid-and-flexbox-3ild









