宏观布局描述了你的界面中页面范围较大的组织结构。
在应用任何布局之前,你应该确保你的内容流是合理的。这种单列默认顺序是较小屏幕将获得的。
<body>
<header>…</header>
<main>
<article>…</article>
<aside>…</aside>
</main>
<footer>…</footer>
</body>
当你安排这些单独的页面级组件时,你正在设计一个宏观布局:页面的高级视图。使用媒体查询,你可以在 CSS 中提供规则,描述此视图应如何调整以适应不同的屏幕尺寸。
Grid
CSS Grid 是一个用于将布局应用于你的页面的优秀工具。在上面的示例中,假设你想要在屏幕宽度足够时使用两列布局。要在浏览器足够宽时应用此两列布局,请使用媒体查询来定义指定断点以上的 Grid 样式。
@media (min-width: 45em) {
main {
display: grid;
grid-template-columns: 2fr 1fr;
}
}
Flexbox
对于这种特定布局,你也可以使用 Flexbox。样式如下所示
@media (min-width: 45em) {
main {
display: flex;
flex-direction: row;
}
main article {
flex: 2;
}
main aside {
flex: 1;
}
}
但是,Flexbox 版本需要更多 CSS。每列都有一个单独的规则来描述它应该占用多少空间。在 Grid 示例中,相同的信息被封装在一个容器元素的规则中。
你需要媒体查询吗?
你可能并不总是需要使用媒体查询。当你对少量元素应用更改时,媒体查询效果很好,但如果布局需要经常更新,你的媒体查询可能会因包含大量断点而变得难以管理。
假设你有一个页面充满了卡片组件。这些卡片永远不会超过 15em
宽,并且你希望在一行中尽可能多地放置卡片。你可以编写断点为 30em
、45em
、60em
等的媒体查询,但这非常繁琐且难以维护。
相反,你可以应用规则,使卡片本身自动占据合适的空间。
.cards {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(15em, 1fr));
grid-gap: 1em;
}
你可以使用 Flexbox 实现类似的布局。在这种情况下,如果卡片不足以填充最后一行,则剩余的卡片将拉伸以填充可用空间,而不是排成列。如果你想对齐行和列,请使用 Grid。
.cards {
display: flex;
flex-direction: row;
flex-wrap: wrap;
gap: 1em;
}
.cards .card {
flex-basis: 15em;
flex-grow: 1;
}
通过在 Flexbox 或 Grid 中应用一些智能规则,可以设计出动态宏观布局,且只需最少的 CSS 且无需任何媒体查询。这减少了你的工作量——你让浏览器来完成计算。要查看一些无需媒体查询的现代 CSS 流式布局示例,请参阅 1linelayouts.com。
检查你的理解
测试你对宏观布局的了解。
哪个句子最能描述宏观布局?
宏观布局总是使用媒体查询来适应不同的屏幕尺寸吗?
现在你已经对页面级宏观布局有了一些想法,请将注意力转向页面内的组件。这是微观布局的领域。