导航栏、按钮组、列表项内部——用 Flex。 整页框架、卡片瀑布、表单两列——用 Grid。
.nav {
display: flex;
align-items: center; /* 垂直居中 */
gap: 16px; /* 比 margin 好用,不用处理最后一个 */
}
.nav .logo { margin-right: auto; } /* 把右边的东西推过去 */
margin-right: auto 是 Flex 里做"左边一组、右边一组"最简单的方式,不用额外加占位元素。
.layout {
display: grid;
grid-template-columns: 240px 1fr;
grid-template-rows: 64px 1fr 80px;
grid-template-areas:
"header header"
"sidebar main"
"footer footer";
min-height: 100vh;
}
grid-template-areas 画出来的是一张 ASCII 图,改布局就是改这张图,比算列宽直观。
.cards {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
gap: 20px;
}
这一行就能做到"宽度够就四列,窄了就三列两列一列",不需要媒体查询。是 Grid 最值得记的一条。
/* Flex */
.center { display: flex; align-items: center; justify-content: center; }
/* Grid */
.center { display: grid; place-items: center; }
Grid 版本更短,但 Flex 版本兼容性更好(其实现在都无所谓了)。
gap 在 Flex 里,Safari 14.1 之前不生效,如果还要兼容老 Safari,得用 margin 加 :not(:last-child) 兜底。
1fr 不等于 auto:1fr 是可分配空间,auto 是内容决定。grid-template-columns: 1fr 1fr 在两列内容宽度差异大时会不均分——因为 1fr 的默认最小值是 auto,要写 minmax(0, 1fr) 才能真均分。
Grid 的 auto-fill 和 auto-fit 不一样:容器很宽、卡片很少时,auto-fill 会留空轨道,auto-fit 会把轨道折叠掉让卡片撑满。做卡片列表通常想要 auto-fit。
先想"这块内容是几维的":
不要为了用 Grid 而用 Grid,Flex 能干净解决的场景,Grid 往往要写更多属性。