Web Design技能使用说明
网页设计模式
用于生产级界面的CSS实现模式。关于设计基础和决策,请参阅ui-design。本技能侧重于代码。
另请参阅:
ui-design以了解排版/色彩/间距理论,frontend-design以了解创意美学。
安装
OpenClaw / Moltbot / Clawbot
npx clawhub@latest install web-design
布局原则
二维布局使用CSS Grid,一维流式布局使用Flexbox。根据具体场景选择合适的工具。
| 布局需求 | 工具 | 原因 |
|---|---|---|
| 页面级结构 | CSS Grid (grid-template-areas) | 命名区域,精确的行/列控制 |
| 导航栏 | 弹性盒子 | 单轴对齐,使用间隙 |
| 卡片网格 | 网格(自动填充/自动适应) | 无需媒体查询的响应式设计 |
| 居中 | 网格(place-items: center) | 最简洁、最可靠的居中方式 |
| 侧边栏 + 内容 | 网格(grid-template-columns: 250px 1fr) | 固定侧边栏的比例尺寸 |
| 重叠堆叠 | 网格 +grid-area: 1/1 | 无需position: absolute
即可层叠元素 |
空间构成
超越可预测的布局。有意识的不对称、重叠元素以及打破网格的强调手法能创造出视觉趣味。对于重叠元素,使用网格堆叠(grid-area: 1/1)而非position: absolute。为营造奢华/编辑美学,选择充裕的负空间;对于数据密集型界面,则采用受控的密度——选择必须是有意为之。
字体排印
字体排印承载了设计90%的个性。选择与界面用途相匹配的字体。
| 应用场景 | 标题字体方向 | 正文字体方向 | 配对示例 |
|---|---|---|---|
| 编辑/杂志风格 | 高对比度衬线体 | 中性人文主义无衬线体 | Playfair Display + Source Sans 3 |
| SaaS仪表盘 | 几何无衬线体 | 匹配字重的无衬线体 | DM Sans + DM Mono(数据用) |
| 创意作品集 | 富有表现力的展示字体 | 清晰易读的无衬线字体 | Syne + Outfit 字体组合 |
| 电商奢侈品风格 | 纤细现代衬线字体 | 优雅无衬线字体 | Cormorant Garamond + Jost 字体组合 |
| 开发工具 | 等宽展示字体 | 等宽正文字体 | JetBrains Mono + IBM Plex Mono 字体组合 |
字体比例
使用一致的比例。1.25倍(大三度)比例适用于大多数界面:text-xs0.64rem,text-sm0.8rem,text-base1rem,text-lg1.25rem,text-xl1.563rem,text-2xl1.953rem,text-3xl2.441rem,text-4xl3.052rem。将正文字体大小设置为1rem(最小16px),行高1.5用于正文,1.1–1.2用于标题。限制行长至60–75ch。
色彩
构建调色板
每个调色板都需要五种功能角色:
| 角色 | 目的 | 示例用途 |
|---|---|---|
| 主要色 | 品牌标识,主要操作 | 按钮、链接、激活状态 |
| 中性色 | 文本、边框、背景 | 正文文本、卡片、分隔线 |
| 重音色 | 次要操作,高亮元素 | 标签,徽章,次要按钮 |
| 成功 / 警告 / 错误 | 语义反馈 | 提示框,表单验证,状态指示 |
| 表面 | 分层背景 | 页面上的卡片,覆盖层上的模态框 |
对比度与深度
通过表面分层而非仅靠阴影来创造深度:
:root {
--surface-0: hsl(220 15% 8%); /* page background */
--surface-1: hsl(220 15% 12%); /* card */
--surface-2: hsl(220 15% 16%); /* raised element */
--surface-3: hsl(220 15% 20%); /* popover / modal */
}
使用HSL或OKLCH进行感知均匀的色彩操作。主色搭配鲜明的重音色优于均匀分布的调色板。始终验证WCAG对比度:普通文本需达到4.5:1,大文本需达到3:1。
间距
一致的间距能创造节奏感。使用8px基础单位(或针对密集UI使用4px):
| 令牌 | 值 | 用途 |
|---|---|---|
--space-1 | 0.25rem (4px) | 行内图标间隙,紧凑内边距 |
--space-2 | 0.5rem (8px) | 输入框内边距,紧凑列表 |
--space-3 | 0.75rem (12px) | 按钮内边距,卡片内部间距 |
--space-4 | 1rem (16px) | 默认元素间距 |
--space-6 | 1.5rem (24px) | 区块内边距,卡片间距 |
--space-8 | 2rem (32px) | 区块分隔 |
--space-12 | 3rem (48px) | 主要区块分隔 |
--space-16 | 4rem (64px) | 页面级垂直节奏 |
一致地应用间距:使用间隙(gap)于 Grid/Flexbox 容器,而非在子元素上使用边距。这能消除边距合并的 bug 并简化响应式调整。
视觉层次
通过有意识地运用大小、粗细、颜色和空间的对比来引导视线。
层次构建技巧
| 技巧 | 实现方式 | 效果 |
|---|---|---|
| 尺寸对比 | 主标题尺寸为正文的3-4倍 | 形成即时视觉焦点 |
| 粗细对比 | 粗体标题 + 常规正文 | 提升可浏览性 |
| 色彩对比 | 主要文本与柔和次要文本形成对比 | 实现信息分层 |
| 空间分组 | 组内紧凑间距,组间宽松间距 | 格式塔邻近原则 |
| 高程 | 阴影 / 表面分层 | 提供交互示能 |
| 留白隔离 | 关键元素周围设置空白区域 | 以缺席强调 |
实用模式——卡片层级
卡片内的层级:眉标(xs,大写,柔和色)→标题(xl,半粗体)→正文(base,次要色,1.6行高)→操作区(通过上边距分隔)。使用表面颜色进行区隔,并采用间距标记保持内边距一致。
响应式设计
断点策略
| 断点 | 目标设备 | 设计方法 |
|---|---|---|
< 640px | 移动设备 | 单列布局,堆叠导航,触控目标≥44px |
640–1024px | 平板设备 | 可选双栏布局,可折叠侧边栏 |
1024–1440px | 桌面设备 | 完整布局,启用悬停交互 |
> 1440px | 宽屏设备 | 最大宽度容器(1280px),防止超宽行长 |
流动技术
在可能的情况下,优先使用流动尺寸而非固定断点:
/* Fluid typography — scales between 640px and 1440px viewport */
h1 { font-size: clamp(2rem, 1.5rem + 2.5vw, 3.5rem); }
/* Fluid spacing */
section { padding-block: clamp(2rem, 1rem + 4vw, 6rem); }
/* Intrinsic grid — no media queries needed */
.grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, 20rem), 1fr)); gap: var(--space-6); }
当组件的布局应响应其容器而非视口时,使用容器查询(@container)来实现组件级别的响应性。
无障碍性
无障碍性不是可选项。从一开始就应将其构建在内。
| 要求 | 实施 | 标准 |
|---|---|---|
| 颜色对比度 | 正常文本4.5:1,大文本/UI元素3:1 | WCAG 2.1 AA |
| 键盘导航 | 所有交互元素均可聚焦和操作 | WCAG 2.1.1 |
| 焦点指示器 | 可见:focus-visible圆环,偏移量2px+ | WCAG 2.4.7 |
| 语义化HTML | 使用<button>、<nav>、<main>、<article>等标签 | WCAG 1.3.1标准 |
| 替代文本 | 信息性图片需描述性文字alt=""装饰性图片留空 | WCAG 1.1.1标准 |
| 动效安全 | 遵循prefers-reduced-motion偏好设置 | WCAG 2.3.3标准 |
| 触控目标 | 交互区域最小44×44像素 | WCAG 2.5.8标准 |
| 适时使用ARIA | aria-label、aria-live属性,角色仅当原生语义不足时使用 | WCAG 4.1.2 |
/* Robust focus indicator */
:focus-visible {
outline: 2px solid var(--color-primary);
outline-offset: 2px;
}
/* Respect motion preferences */
@media (prefers-reduced-motion: reduce) {
*, *::before, *::after {
animation-duration: 0.01ms !important;
transition-duration: 0.01ms !important;
}
}
组件设计
设计良好组件的剖析
每个UI组件都应具有清晰的状态、一致的间距和可预测的行为:
| 状态 | 视觉处理 | 示例 |
|---|---|---|
| 默认 | 基础样式 | 静止状态按钮 |
| 悬停 | 细微变化——背景、阴影或缩放 | 背景变亮5-10% |
| 激活/按下 | 压缩感——减少阴影,轻微内嵌 | transform: scale(0.98) |
| 焦点 | 高可见性环,不移除轮廓 | :focus-visible环 |
| 禁用 | 降低不透明度光标:不允许 | 不透明度:0.5 |
| 加载中 | 加载指示器或骨架屏,禁用交互 | 内联加载指示器替换标签 |
设计令牌架构
为保持可维护性,将令牌结构分为三层:
/* Layer 1: Primitive values */
--blue-500: oklch(0.55 0.2 250);
--gray-100: oklch(0.95 0.005 250);
--radius-md: 0.5rem;
/* Layer 2: Semantic aliases */
--color-primary: var(--blue-500);
--color-surface: var(--gray-100);
--radius-button: var(--radius-md);
/* Layer 3: Component-specific */
--btn-bg: var(--color-primary);
--btn-radius: var(--radius-button);
--btn-padding: var(--space-2) var(--space-4);
这种三层架构允许通过重新映射第二层来切换主题,而无需修改组件。
交互模式
动效与动画
使用动效来传达状态变化,而非装饰。关注高影响力时刻:
| 交互 | 持续时间 | 缓动 | 目的 |
|---|---|---|---|
| 按钮悬停 | 150毫秒 | 缓出 | 确认交互 |
| 模态框打开 | 250毫秒 | 缓出 | 吸引注意力 |
| 模态框关闭 | 200毫秒 | 缓入 | 快速关闭 |
| 页面过渡 | 300毫秒 | 缓入缓出 | 保持空间上下文 |
| 交错显示 | 每个项目延迟50-80毫秒 | 缓出 | 顺序内容加载 |
| 微反馈 | 100毫秒 | 缓出 | 切换、复选框、开关 |
/* Staggered entrance animation */
.stagger-item {
opacity: 0;
translate: 0 1rem;
animation: reveal 0.5s ease-out forwards;
}
.stagger-item:nth-child(1) { animation-delay: 0ms; }
.stagger-item:nth-child(2) { animation-delay: 60ms; }
.stagger-item:nth-child(3) { animation-delay: 120ms; }
@keyframes reveal {
to { opacity: 1; translate: 0 0; }
}
滚动驱动效果
使用原生animation-timeline: scroll()(置于@supports内)用于无需JavaScript的视差和显示效果。通过功能检测进行封装以实现优雅降级。
设计质量检查清单
发布前,请对照以下标准进行验证:
- 排版: 有意识的字体搭配,一致的尺寸比例,可读的行宽
- 色彩: 协调统一的调色板,符合WCAG对比度标准,定义了语义化的反馈颜色
- 间距: 使用间距标记确保一致的节奏感,避免临时性的像素值
- 层级: 清晰的视觉流——视线路径符合预期的阅读顺序
- 响应式设计: 在移动端、平板、桌面端测试;无水平溢出
- 无障碍性: 支持键盘导航,焦点可见,经过屏幕阅读器测试,运动安全
- 状态: 所有交互元素均定义了悬停、激活、聚焦、禁用和加载状态
- 个性: 设计具有明确的观点——而非通用的模板美学
- 性能图像已优化,字体已子集化,动画启用GPU加速(
变换,透明度) - 深色模式:若支持,界面采用分层明度设计,而非颜色反转



微信扫一扫,打赏作者吧~