CSS Grid核心概念与容器属性配置
CSS Grid是二维布局系统,通过行列定义同时控制水平和垂直方向的元素排列。与Flexbox的一维布局不同,Grid适合复杂的页面级布局结构。
Grid布局通过display: grid激活,使用grid-template-columns和grid-template-rows定义网格轨道:
.layout {
display: grid;
grid-template-columns: 200px 1fr 1fr;
grid-template-rows: 80px 1fr 60px;
gap: 16px;
height: 100vh;
}
/* 定义网格区域名称 */
.layout-named {
display: grid;
grid-template-columns: 240px 1fr;
grid-template-rows: 60px 1fr 50px;
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; }
fr单位表示按比例分配剩余空间,gap属性设置网格间距(等价于row-gap和column-gap)。grid-template-areas通过ASCII图案定义布局结构,可读性优于行列坐标定位。
响应式网格布局:repeat与minmax配合
repeat()函数简化重复轨道定义,auto-fill和auto-fit实现自动列数计算:
.card-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
gap: 20px;
}
auto-fill会创建尽可能多的列轨道(即使为空),auto-fit会将空轨道折叠为0,让已有内容拉伸填满容器。卡片布局场景下auto-fit更常用:
/* auto-fill: 保留空列,内容不拉伸 */
/* auto-fit: 空列折叠,内容拉伸填满 */
.card-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(min(100%, 280px), 1fr));
gap: 20px;
}
/* 响应式断点配合 */
@media (min-width: 1200px) {
.card-grid {
grid-template-columns: repeat(4, 1fr);
}
}
@media (min-width: 768px) and (max-width: 1199px) {
.card-grid {
grid-template-columns: repeat(2, 1fr);
}
}
@media (max-width: 767px) {
.card-grid {
grid-template-columns: 1fr;
}
}
min()函数防止卡片在小屏幕上溢出:min(100%, 280px)在容器宽度小于280px时取100%,否则取280px。
子元素定位:grid-column与grid-row跨度控制
子元素通过grid-column和grid-row指定在网格中的位置和跨度:
.grid-container {
display: grid;
grid-template-columns: repeat(4, 1fr);
grid-template-rows: repeat(3, 200px);
gap: 16px;
}
/* 跨2列1行 */
.item-a {
grid-column: span 2;
grid-row: span 1;
}
/* 精确定位:从第2列到第4列 */
.item-b {
grid-column: 2 / 4;
grid-row: 1 / 3;
}
/* 使用负数从末尾计数 */
.item-c {
grid-column: 1 / -1; /* 占满整行 */
grid-row: 3;
}
/* 命名网格线 */
.layout-named {
grid-template-columns: [start] 240px [content-start] 1fr [content-end] 1fr [end];
}
.item-d {
grid-column: content-start / content-end;
}
1 / -1表示从第一列到最后一列(占满整行),负数从末尾开始计数。span N表示跨越N个轨道,不指定起始位置时由自动布局算法分配。
网格对齐控制:justify与align属性体系
Grid对齐分为容器级和子元素级两个层次。容器级属性控制所有子元素的整体对齐:
.grid-container {
display: grid;
grid-template-columns: repeat(3, 200px);
grid-template-rows: repeat(2, 150px);
/* 水平方向:整个网格在容器中的对齐 */
justify-content: space-between;
/* 垂直方向:整个网格在容器中的对齐 */
align-content: center;
/* 子元素在各自网格单元中的水平对齐 */
justify-items: center;
/* 子元素在各自网格单元中的垂直对齐 */
align-items: stretch;
}
子元素级属性覆盖容器级设置:
.item {
/* 覆盖justify-items */
justify-self: start;
/* 覆盖align-items */
align-self: center;
}
属性值含义:start(起始对齐)、end(结束对齐)、center(居中对齐)、stretch(拉伸填满)、space-between(两端对齐,间距均分)、space-around(等间距,两端有半间距)。
Grid与Flexbox混合布局实践
实际项目中Grid负责页面级布局,Flexbox负责组件内部布局,两者配合覆盖绝大多数场景:
/* 页面级布局用Grid */
.app-layout {
display: grid;
grid-template-columns: 240px 1fr;
grid-template-rows: 56px 1fr;
grid-template-areas:
"nav header"
"nav main";
height: 100vh;
}
/* 组件内部用Flex */
.card {
display: flex;
flex-direction: column;
gap: 12px;
}
.card-header {
display: flex;
justify-content: space-between;
align-items: center;
}
.card-body {
display: flex;
flex-wrap: wrap;
gap: 8px;
}
/* Grid嵌套Grid */
.dashboard {
display: grid;
grid-template-columns: repeat(12, 1fr);
gap: 16px;
}
.widget {
grid-column: span 4;
}
.widget-wide {
grid-column: span 8;
}
.widget-content {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 8px;
}
12列网格系统是Dashboard布局的常见模式,通过span值控制每个Widget的宽度占比。order属性可以调整Grid子元素的视觉排列顺序而不改变DOM结构:
.sidebar { order: 2; }
.main { order: 1; }
@media (min-width: 768px) {
.sidebar { order: 1; }
.main { order: 2; }
}
移动端侧边栏在内容下方(order: 2),桌面端侧边栏移到左侧(order: 1)。Grid布局的浏览器支持率已达到97%以上(Can I Use数据),主流浏览器全面支持subgrid子网格特性,嵌套Grid不再需要手动同步轨道定义。对于旧版浏览器兼容,使用@supports做特性检测:
@supports (display: grid) {
.layout { display: grid; }
}
@supports not (display: grid) {
.layout { display: flex; flex-wrap: wrap; }
}
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/cssgrid-wang-ge-bu-ju-shi-zhan-xiang-ying-shi-bu-ju-yu-zi/