Skip to content
返回构建教程

响应式翻译

把 Figma 响应式变体(移动/平板/桌面)准确翻译成 Tailwind 断点。

为什么

响应式设计是 figma-to-code 交接丢最多细节处。设计师在 Figma 规 3 断点,开发者实现 2 并猜第三,或在错误像素值应用断点。Tailwind 断点系统(sm:640、md:768、lg:1024)映射特定 Figma 画板,映射错意味着布局在设计师从未测的尺寸坏。有纪律方法是把每断点当独立布局(非仅'更小 padding')并在确切 Figma 画板宽度测,非任意浏览器尺寸。这防'我笔记本上好看、平板上坏'类 bug。

何时使用

设计有 ≥2 断点时。每屏约 1-2 小时。仅桌面内部工具可跳过。

如何做

1. 显式映射 Figma 画板到 Tailwind 断点
   - 移动(375px)→ base(无前缀);平板(768px)→ md:;桌面(1440px)→ xl:
   - 在设计系统 README 文档化此映射

2. 移动优先实现:写 base(移动)布局,再加 md: 和 xl: 覆盖
   - <div className="grid grid-cols-1 md:grid-cols-2 xl:grid-cols-3">
   - 永不从桌面减——加法更易推理

3. 组件级响应用容器查询
   - 卡片应响应容器宽度非视口
   - @container card:容器 >400px 时 grid-cols-1 → grid-cols-2

4. 在确切 Figma 画板宽度测,非任意尺寸
   - Storybook viewport addon:设 375、768、1024、1440 自定义视口
   - 每断点视觉回归快照

5. 用流式单位处理中间尺寸(414px、1024px)
   - 字号用 clamp() 在断点间平滑缩放
   - 避免硬跳:标题不应从 24px 直跳 48px 中间无

示例

// 移动优先响应卡片网格
export function CardGrid({ cards }: { cards: Card[] }) {
  return (
    <div className="grid grid-cols-1 gap-4 px-4 md:grid-cols-2 md:gap-6 md:px-6 xl:grid-cols-3 xl:px-8">
      {cards.map(c => <Card key={c.id} {...c} />)}
    </div>
  );
}

// 用 clamp 的流式标题(375px 到 1440px 间 24px → 48px 缩放)
export function Hero({ title }: { title: string }) {
  return <h1 className="text-[clamp(1.5rem,4vw,3rem)] font-bold">{title}</h1>;
}

// 匹配 Figma 画板的 Storybook 视口
export const parameters = {
  viewport: { viewports: {
    mobile: { name: "移动", styles: { width: "375px", height: "812px" } },
    tablet: { name: "平板", styles: { width: "768px", height: "1024px" } },
    desktop: { name: "桌面", styles: { width: "1440px", height: "900px" } },
  } },
};

常见问题

  • ⚠从桌面开始用 max-width 缩,在异常尺寸产出坏的移动布局。
  • ⚠用固定像素宽(width: 375px)而非响应式单位,布局完全不适应。
  • ⚠仅测 3 常见尺寸(iPhone、iPad、笔记本)漏 414px Android 宽度坏处。
  • ⚠所有断点用同 padding,移动 32px padding 吃 375px 屏 17%。

最佳实践

  • ✓总移动优先实现——它迫使你先处理最受限布局,那里每像素重要。
  • ✓出现在不同上下文(侧边栏、全宽)的组件用容器查询(Tailwind @container)。
  • ✓CI 里设 Playwright 视觉测试在 5 宽度(375、414、768、1024、1440)截每页。
  • ✓应流式缩放的排版和间距用 clamp(),而非断点跳。