CSS Grid二维布局核心概念
CSS Grid是浏览器原生的二维布局系统,同时控制行和列两个维度,适合构建页面级整体布局。与Flexbox的一维布局互补,Grid处理宏观骨架,Flexbox处理组件内部排列。两者配合使用能覆盖绝大多数布局需求,减少对浮动(float)和定位(position)的依赖。
Grid布局的核心概念包括容器(Grid Container)和项目(Grid Item)。容器通过display:grid启用网格布局,使用grid-template-columns和grid-template-rows定义网格轨道。项目通过grid-column和grid-row属性指定在网格中的位置。
/* 基础Grid布局 */
.grid-container {
display: grid;
/* 定义三列,中间列自适应 */
grid-template-columns: 200px 1fr 200px;
/* 行高自适应内容 */
grid-template-rows: 80px 1fr 60px;
/* 间距 */
gap: 16px;
height: 100vh;
}
/* 网格区域命名 - 直观的布局定义 */
.grid-container {
display: grid;
grid-template-columns: 240px 1fr;
grid-template-rows: 64px 1fr 48px;
grid-template-areas:
"header header"
"sidebar main"
"footer footer";
gap: 12px;
}
.header { grid-area: header; }
.sidebar { grid-area: sidebar; }
.main { grid-area: main; }
.footer { grid-area: footer; }
grid-template-areas通过ASCII布局图定义区域,比数字坐标更直观可读。区域名重复使用表示跨列或跨行。1fr表示剩余空间的等分比例,配合minmax()和auto-fit实现响应式网格。
Flexbox一维弹性布局实战
Flexbox专为一维布局设计,适合处理单行或单列内的元素排列和对齐。justify-content控制主轴对齐,align-items控制交叉轴对齐。flex-grow和flex-shrink定义空间分配和收缩比例。
/* 水平导航栏 */
.navbar {
display: flex;
justify-content: space-between; /* 两端对齐 */
align-items: center; /* 垂直居中 */
padding: 0 24px;
height: 60px;
background: #fff;
box-shadow: 0 1px 3px rgba(0,0,0,0.1);
}
.nav-logo {
flex-shrink: 0; /* Logo不收缩 */
}
.nav-menu {
display: flex;
gap: 32px;
flex-grow: 1;
justify-content: center;
}
.nav-actions {
display: flex;
gap: 12px;
flex-shrink: 0;
}
/* 卡片列表自适应排列 */
.card-list {
display: flex;
flex-wrap: wrap;
gap: 16px;
}
.card {
flex: 1 1 300px; /* 增长 基准300px 收缩 */
max-width: 400px;
min-width: 280px;
}
flex: 1 1 300px是flex-grow、flex-shrink和flex-basis的简写。flex-grow:1表示在容器有剩余空间时等比例扩展。flex-wrap:wrap允许项目换行,配合gap属性实现自动间距。flex-basis定义项目的初始大小,min-width和max-width约束实际范围。
Grid与Flexbox组合使用模式
实际项目中Grid和Flexbox经常组合使用。典型模式是用Grid构建页面骨架,在Grid区域内用Flexbox排列具体内容:
/* 页面骨架 - Grid定义整体结构 */
.page-layout {
display: grid;
grid-template-columns: 240px 1fr;
grid-template-rows: 64px 1fr;
height: 100vh;
}
/* 侧边栏 - Flexbox垂直排列菜单 */
.sidebar {
display: flex;
flex-direction: column;
gap: 4px;
padding: 16px;
}
.menu-item {
display: flex;
align-items: center;
gap: 12px;
padding: 8px 16px;
border-radius: 6px;
cursor: pointer;
transition: background 0.2s;
}
.menu-item:hover {
background: #f0f0f0;
}
/* 工具栏 - Flexbox水平排列按钮 */
.toolbar {
display: flex;
justify-content: space-between;
align-items: center;
padding: 0 24px;
border-bottom: 1px solid #eee;
}
.toolbar-left {
display: flex;
gap: 8px;
}
.toolbar-right {
display: flex;
gap: 8px;
}
响应式断点与媒体查询策略
响应式布局通过媒体查询(Media Query)在不同屏幕宽度下调整Grid和Flexbox参数。移动优先(Mobile First)策略默认使用移动端样式,通过min-width媒体查询逐步增强:
/* 移动优先响应式布局 */
.dashboard {
/* 移动端 - 单列 */
display: grid;
grid-template-columns: 1fr;
gap: 12px;
padding: 12px;
}
/* 平板 - 双列 */
@media (min-width: 768px) {
.dashboard {
grid-template-columns: repeat(2, 1fr);
gap: 16px;
padding: 16px;
}
}
/* 桌面 - 三列 */
@media (min-width: 1024px) {
.dashboard {
grid-template-columns: repeat(3, 1fr);
gap: 20px;
}
}
/* 大屏 - 四列 */
@media (min-width: 1440px) {
.dashboard {
grid-template-columns: repeat(4, 1fr);
max-width: 1600px;
margin: 0 auto;
}
}
/* auto-fit自动列数 - 无需媒体查询 */
.auto-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 16px;
}
repeat(auto-fit, minmax(300px, 1fr))是CSS Grid最强大的响应式特性。auto-fit根据容器宽度自动计算列数,每列最小300px最大等分剩余空间。这种方式无需媒体查询,列数随容器宽度无缝变化。
实战案例:后台管理界面布局
后台管理系统是Grid与Flexbox组合的典型场景。包含可折叠侧边栏、固定头部、自适应内容区和底部状态栏:
<div class="admin-layout">
<header class="admin-header">
<div class="header-left">
<button class="sidebar-toggle">菜单</button>
<h1 class="page-title">仪表盘</h1>
</div>
<div class="header-right">
<span class="user-info">管理员</span>
</div>
</header>
<aside class="admin-sidebar">
<nav class="sidebar-nav">导航菜单</nav>
</aside>
<main class="admin-content">
<div class="content-toolbar">工具栏</div>
<div class="card-grid">卡片网格</div>
</main>
</div>
.admin-layout {
display: grid;
grid-template-columns: 240px 1fr;
grid-template-rows: 60px 1fr;
grid-template-areas:
"header header"
"sidebar content";
height: 100vh;
transition: grid-template-columns 0.3s;
}
/* 侧边栏折叠 */
.admin-layout.collapsed {
grid-template-columns: 64px 1fr;
}
.admin-header {
grid-area: header;
display: flex;
justify-content: space-between;
align-items: center;
padding: 0 20px;
background: #1a1a2e;
color: #fff;
}
.header-left {
display: flex;
align-items: center;
gap: 12px;
}
.admin-content {
grid-area: content;
overflow-y: auto;
padding: 20px;
}
.card-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));
gap: 16px;
}
/* 侧边栏折叠动画 */
.admin-sidebar {
grid-area: sidebar;
overflow: hidden;
transition: all 0.3s ease;
}
Grid的grid-template-columns过渡实现侧边栏折叠动画,比JavaScript动画方案更流畅。content区域的card-grid使用auto-fit自适应卡片数量,在不同屏幕宽度下自动调整列数。
浏览器兼容性与渐进增强
CSS Grid和Flexbox在现代浏览器中支持率超过98%。IE11仅支持旧版Grid语法(-ms-grid),需配合Autoprefixer生成兼容代码。实际项目中使用gap属性时注意Flexbox的gap在Safari 14.1之前不支持,降级方案使用margin:
/* gap降级方案 - 适用于旧版Safari */
.flex-container {
display: flex;
flex-wrap: wrap;
margin: -8px; /* 抵消子元素margin */
}
.flex-item {
margin: 8px;
}
/* 现代浏览器使用gap,旧浏览器使用margin */
@supports (gap: 8px) {
.flex-container {
gap: 16px;
margin: 0;
}
.flex-item {
margin: 0;
}
}
@supports(CSS Feature Query)检测浏览器是否支持特定属性,优先使用现代语法。配合PostCSS和Autoprefixer自动添加前缀,开发时直接写标准CSS即可。布局调试使用Chrome DevTools的Grid Inspector,可视化显示网格线和区域,快速定位布局问题。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/cssgrid-yu-flexbox-bu-ju-shi-zhan-xiang-ying-shi-wang-ge-xi/