响应式布局
让 Agent 按项目断点、容器宽度与「移动优先」策略实现布局,兼顾横屏、折叠屏与大屏阅读宽度。
SKILL 应列出标准断点(px 或 rem)、最大内容宽度(measure)、侧边栏折叠规则,以及是否采用 @container 封装卡片栅格;验收需覆盖典型机宽与最小高度,而不是仅桌面视口。
与 CSS 架构技能一致:布局类命名、工具类与组件职责分界;打印样式或 PDF 导出若存在,补充断点外的媒体类型规则。
- 验收清单:典型机宽 + 最小高度下的关键页面截图或 Story 视口矩阵。
- 横屏、折叠屏内外屏若适用,写明断点或容器策略是否与「展开宽度」挂钩。
断点系统定义与移动优先媒体查询
/* 断点系统:CSS 变量形式(与 Design Token 同步)*/
:root {
--bp-sm: 36rem; /* 576px - 手机横屏 */
--bp-md: 48rem; /* 768px - 平板 */
--bp-lg: 64rem; /* 1024px - 小桌面 */
--bp-xl: 80rem; /* 1280px - 大桌面 */
--content-max-width: 72rem; /* 最大内容宽 */
}
/* 移动优先:基础样式为最窄视口,min-width 逐级增强 */
.card-grid {
display: grid;
grid-template-columns: 1fr; /* 基础:单列 */
gap: var(--space-4);
}
@media (min-width: 48rem) { /* md:双列 */
.card-grid { grid-template-columns: 1fr 1fr; }
}
@media (min-width: 64rem) { /* lg:三列 */
.card-grid { grid-template-columns: repeat(3, 1fr); }
}
/* 桌面优先(对比,不推荐用于新项目)*/
/* .card-grid { grid-template-columns: repeat(3, 1fr); } */
/* @media (max-width: 64rem) { grid-template-columns: 1fr 1fr; } */
/* @media (max-width: 48rem) { grid-template-columns: 1fr; } */
/* clamp() 流体排版:min / preferred / max */
h1 { font-size: clamp(1.5rem, 4vw + 0.5rem, 3rem); } /* 24px → 48px 流体过渡 */
p { font-size: clamp(1rem, 1vw + 0.75rem, 1.25rem); }
.container { padding-inline: clamp(1rem, 5vw, 3rem); } /* 响应式内边距 */
下表为示例约定(项目应替换为设计系统真实值):
| 带 | 视口条件(示例) | 常见用途 |
|---|---|---|
| base | < 36rem | 单列、全宽按钮、导航收折 |
| md | ≥ 48rem | 双列摘要、侧栏可显 |
| lg | ≥ 64rem | 三列栅格、固定侧栏宽度 |
| xl | ≥ 80rem | 最大内容宽 + 外边距、大屏留白 |
Container Query 与 Grid+Flexbox 组合布局
/* Container Query:组件宽度由父容器决定,不依赖视口 */
.sidebar-widget {
container-type: inline-size;
container-name: widget; /* 命名容器:可针对性查询 */
}
/* @container 规则:同一组件在窄侧栏和宽主栏自动适配 */
.widget-grid {
display: grid;
grid-template-columns: 1fr; /* 默认单列 */
}
@container widget (min-width: 28rem) {
.widget-grid { grid-template-columns: 1fr 1fr; }
}
@container widget (min-width: 44rem) {
.widget-grid { grid-template-columns: repeat(3, 1fr); }
}
/* @supports 回退:不支持容器查询的浏览器 */
@supports not (container-type: inline-size) {
.widget-grid { grid-template-columns: 1fr 1fr; }
}
/* Grid + Flexbox 组合布局实际代码 */
.page-layout {
display: grid;
grid-template-areas:
"header header"
"sidebar main"
"footer footer";
grid-template-columns: 240px 1fr; /* 固定侧栏 + 弹性主区 */
grid-template-rows: auto 1fr auto;
min-height: 100vh;
}
/* 在 main 区域内用 Flexbox 处理内容流 */
.page-main {
grid-area: main;
display: flex;
flex-direction: column;
gap: var(--space-6);
padding: var(--space-6);
}
/* 移动端:侧栏收折 */
@media (max-width: 48rem) {
.page-layout {
grid-template-areas: "header" "main" "footer";
grid-template-columns: 1fr;
}
.page-sidebar { display: none; } /* 或用 transform 侧滑 */
}
SKILL 中写明容器名(container-name)、查询阈值与回退:不支持容器查询的浏览器是否接受单列回退或通过 @supports 提供近似布局。
给 Agent 的边界:页面级导航、全屏遮罩、根字体缩放仍应以视口媒体查询为主;组件内部「列数 / 密度」优先容器查询,避免把每个模块都绑死在全局断点上。
布局决策主流程
[ 设计稿 / 栅格约定 ]
│
▼
┌─────────────┐ 根排版:clamp / rem、max-width(measure)
│ 流体与度量 │──── 安全区、viewport-fit、横屏最小高度
└─────────────┘
│
▼
┌─────────────┐ 导航 / 全页分栏 / 主题级:@media (min-width …)
│ 视口断点 │──── 移动优先顺序、Token 与设计对齐
└─────────────┘
│
▼
┌─────────────┐ 卡片 / 工具条 / 侧栏内模块:container + @container
│ 容器查询 │──── 命名、阈值、无支持时的单列回退
└─────────────┘
│
▼
┌─────────────┐ srcset/sizes、表格滚动或堆叠、触摸目标 ≥ 44×44 CSS px
│ 媒体与交互 │──── 折叠屏、键盘可聚焦、减少 motion 偏好
└─────────────┘
│
▼
[ 视口矩阵截图 / Story 多视口 + 关键容器宽度录屏 ]
媒体、表格与触摸
指定图片与媒体的 srcset/sizes 或 CSS 对象适配策略,避免小屏加载过大资源;表格与宽表在窄屏下的横向滚动(含 overflow-x 与表头固定策略)或堆叠方案需写清。
触摸目标最小尺寸、安全区(notch)与 viewport-fit 若适用,应在步骤中点名;可配合 prefers-reduced-motion 审查动画是否降级。
页内演示:视口带与容器宽度
以下脚本仅在本页运行:上方反映当前视口宽度与示例断点带;下方拖动滑块改变查询容器宽度,观察 @container (min-width: 22rem) 下列数切换。
区块 A
容器窄时为单列堆叠。
区块 B
≥22rem 时与 A 并排。
SKILL 大纲
---
name: responsive-layout
description: 按断点、容器查询与流体排版实现多端一致的版式
---
# 断点系统
1. CSS 变量定义断点:--bp-sm/md/lg/xl,与 Design Token 同步
2. 移动优先:基础样式为最窄视口,min-width 逐级增强(不用 max-width 覆盖)
3. 最大内容宽(--content-max-width)集中定义,避免散落在各组件
# 流体排版与间距
4. clamp() 流体字体:clamp(最小, 首选vw计算, 最大),覆盖标题/正文/内边距
5. 间距流体:padding/gap 用 clamp() 或 space token,避免断点硬切
# 布局选择
6. 页面级分栏/导航/遮罩:@media min-width 视口断点
7. 组件内列数/密度(卡片/表格/工具栏):container-type + @container
8. 容器命名(container-name):按业务语义命名,便于 @container 针对性查询
9. Grid:二维布局(page-layout);Flexbox:一维内容流(工具栏/列表)
# 兼容与验收
10. @container 无支持浏览器:@supports 提供单列/双列回退
11. 触摸目标最小 44×44 CSS px,触摸区域可大于视觉大小(padding)
12. 横屏/折叠屏:写明最小高度策略与展开宽度是否影响断点
13. srcset/sizes:图片按断点提供恰当分辨率,避免小屏加载大图
14. 减少动画偏好:prefers-reduced-motion 降级动画
15. 验收矩阵:375/768/1280/1920 宽度 × 竖屏/横屏各截图一份