CSS Grid网格布局实战:响应式布局与子元素对齐控制方案

CSS Grid核心概念与容器属性配置

CSS Grid是二维布局系统,通过行列定义同时控制水平和垂直方向的元素排列。与Flexbox的一维布局不同,Grid适合复杂的页面级布局结构。

Grid布局通过display: grid激活,使用grid-template-columnsgrid-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-gapcolumn-gap)。grid-template-areas通过ASCII图案定义布局结构,可读性优于行列坐标定位。

响应式网格布局:repeat与minmax配合

repeat()函数简化重复轨道定义,auto-fillauto-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-columngrid-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/

(0)
小编小编
上一篇 2小时前
下一篇 2小时前

相关推荐