responsive-design-advisor

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Responsive Design Advisor

响应式设计指南

Design responsive layouts that work across all device sizes.
设计可在所有设备尺寸上正常显示的响应式布局。

Quick Start

快速入门

Use mobile-first approach, flexible units (rem, %), CSS Grid/Flexbox, and test on real devices.
采用移动优先方法,使用灵活单位(rem、%)、CSS Grid/Flexbox,并在真实设备上进行测试。

Instructions

操作说明

Mobile-First Approach

移动优先方法

Start with mobile, enhance for larger screens:
css
/* Base styles (mobile) */
.container {
  padding: 1rem;
}

/* Tablet */
@media (min-width: 768px) {
  .container {
    padding: 2rem;
  }
}

/* Desktop */
@media (min-width: 1024px) {
  .container {
    padding: 3rem;
    max-width: 1200px;
    margin: 0 auto;
  }
}
从移动端开始,为更大屏幕做增强:
css
/* Base styles (mobile) */
.container {
  padding: 1rem;
}

/* Tablet */
@media (min-width: 768px) {
  .container {
    padding: 2rem;
  }
}

/* Desktop */
@media (min-width: 1024px) {
  .container {
    padding: 3rem;
    max-width: 1200px;
    margin: 0 auto;
  }
}

Common Breakpoints

通用断点

Standard breakpoints:
css
/* Mobile: 0-639px (default) */

/* Tablet: 640px+ */
@media (min-width: 640px) { }

/* Laptop: 1024px+ */
@media (min-width: 1024px) { }

/* Desktop: 1280px+ */
@media (min-width: 1280px) { }

/* Large: 1536px+ */
@media (min-width: 1536px) { }
Tailwind breakpoints:
jsx
<div className="
  w-full          // Mobile
  md:w-1/2        // Tablet
  lg:w-1/3        // Desktop
">
  Content
</div>
标准断点:
css
/* Mobile: 0-639px (default) */

/* Tablet: 640px+ */
@media (min-width: 640px) { }

/* Laptop: 1024px+ */
@media (min-width: 1024px) { }

/* Desktop: 1280px+ */
@media (min-width: 1280px) { }

/* Large: 1536px+ */
@media (min-width: 1536px) { }
Tailwind 断点:
jsx
<div className="
  w-full          // Mobile
  md:w-1/2        // Tablet
  lg:w-1/3        // Desktop
">
  Content
</div>

Flexible Layouts

灵活布局

CSS Grid:
css
.grid {
  display: grid;
  gap: 1rem;
  
  /* Mobile: 1 column */
  grid-template-columns: 1fr;
}

@media (min-width: 768px) {
  .grid {
    /* Tablet: 2 columns */
    grid-template-columns: repeat(2, 1fr);
  }
}

@media (min-width: 1024px) {
  .grid {
    /* Desktop: 3 columns */
    grid-template-columns: repeat(3, 1fr);
  }
}
Auto-fit grid:
css
.grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
  gap: 1rem;
}
Flexbox:
css
.flex-container {
  display: flex;
  flex-wrap: wrap;
  gap: 1rem;
}

.flex-item {
  flex: 1 1 100%; /* Mobile: full width */
}

@media (min-width: 768px) {
  .flex-item {
    flex: 1 1 calc(50% - 0.5rem); /* Tablet: 2 columns */
  }
}

@media (min-width: 1024px) {
  .flex-item {
    flex: 1 1 calc(33.333% - 0.667rem); /* Desktop: 3 columns */
  }
}
CSS Grid:
css
.grid {
  display: grid;
  gap: 1rem;
  
  /* Mobile: 1 column */
  grid-template-columns: 1fr;
}

@media (min-width: 768px) {
  .grid {
    /* Tablet: 2 columns */
    grid-template-columns: repeat(2, 1fr);
  }
}

@media (min-width: 1024px) {
  .grid {
    /* Desktop: 3 columns */
    grid-template-columns: repeat(3, 1fr);
  }
}
自动适配网格:
css
.grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
  gap: 1rem;
}
Flexbox:
css
.flex-container {
  display: flex;
  flex-wrap: wrap;
  gap: 1rem;
}

.flex-item {
  flex: 1 1 100%; /* Mobile: full width */
}

@media (min-width: 768px) {
  .flex-item {
    flex: 1 1 calc(50% - 0.5rem); /* Tablet: 2 columns */
  }
}

@media (min-width: 1024px) {
  .flex-item {
    flex: 1 1 calc(33.333% - 0.667rem); /* Desktop: 3 columns */
  }
}

Responsive Typography

响应式排版

Fluid typography:
css
h1 {
  font-size: clamp(2rem, 5vw, 4rem);
}

p {
  font-size: clamp(1rem, 2vw, 1.125rem);
}
Responsive scale:
css
/* Mobile */
h1 { font-size: 2rem; }
h2 { font-size: 1.5rem; }
p { font-size: 1rem; }

/* Desktop */
@media (min-width: 1024px) {
  h1 { font-size: 3rem; }
  h2 { font-size: 2rem; }
  p { font-size: 1.125rem; }
}
流体排版:
css
h1 {
  font-size: clamp(2rem, 5vw, 4rem);
}

p {
  font-size: clamp(1rem, 2vw, 1.125rem);
}
响应式字号层级:
css
/* Mobile */
h1 { font-size: 2rem; }
h2 { font-size: 1.5rem; }
p { font-size: 1rem; }

/* Desktop */
@media (min-width: 1024px) {
  h1 { font-size: 3rem; }
  h2 { font-size: 2rem; }
  p { font-size: 1.125rem; }
}

Responsive Images

响应式图片

Responsive image:
css
img {
  max-width: 100%;
  height: auto;
}
Art direction:
jsx
<picture>
  <source
    media="(min-width: 1024px)"
    srcSet="desktop.jpg"
  />
  <source
    media="(min-width: 768px)"
    srcSet="tablet.jpg"
  />
  <img src="mobile.jpg" alt="Description" />
</picture>
Responsive background:
css
.hero {
  background-image: url('mobile.jpg');
}

@media (min-width: 768px) {
  .hero {
    background-image: url('tablet.jpg');
  }
}

@media (min-width: 1024px) {
  .hero {
    background-image: url('desktop.jpg');
  }
}
响应式图片:
css
img {
  max-width: 100%;
  height: auto;
}
图片艺术方向:
jsx
<picture>
  <source
    media="(min-width: 1024px)"
    srcSet="desktop.jpg"
  />
  <source
    media="(min-width: 768px)"
    srcSet="tablet.jpg"
  />
  <img src="mobile.jpg" alt="Description" />
</picture>
响应式背景图:
css
.hero {
  background-image: url('mobile.jpg');
}

@media (min-width: 768px) {
  .hero {
    background-image: url('tablet.jpg');
  }
}

@media (min-width: 1024px) {
  .hero {
    background-image: url('desktop.jpg');
  }
}

Container Queries

容器查询

Component-based responsive:
css
.card-container {
  container-type: inline-size;
}

.card {
  padding: 1rem;
}

@container (min-width: 400px) {
  .card {
    display: grid;
    grid-template-columns: 1fr 2fr;
  }
}
基于组件的响应式设计:
css
.card-container {
  container-type: inline-size;
}

.card {
  padding: 1rem;
}

@container (min-width: 400px) {
  .card {
    display: grid;
    grid-template-columns: 1fr 2fr;
  }
}

Navigation Patterns

导航模式

Mobile menu:
jsx
function Navigation() {
  const [isOpen, setIsOpen] = useState(false);
  
  return (
    <nav>
      {/* Mobile: Hamburger */}
      <button
        className="md:hidden"
        onClick={() => setIsOpen(!isOpen)}
      >
        Menu
      </button>
      
      {/* Mobile: Drawer */}
      <div className={`
        fixed inset-0 bg-white transform transition-transform
        ${isOpen ? 'translate-x-0' : '-translate-x-full'}
        md:relative md:translate-x-0
      `}>
        <ul className="flex flex-col md:flex-row">
          <li>Home</li>
          <li>About</li>
          <li>Contact</li>
        </ul>
      </div>
    </nav>
  );
}
移动端菜单:
jsx
function Navigation() {
  const [isOpen, setIsOpen] = useState(false);
  
  return (
    <nav>
      {/* Mobile: Hamburger */}
      <button
        className="md:hidden"
        onClick={() => setIsOpen(!isOpen)}
      >
        Menu
      </button>
      
      {/* Mobile: Drawer */}
      <div className={`
        fixed inset-0 bg-white transform transition-transform
        ${isOpen ? 'translate-x-0' : '-translate-x-full'}
        md:relative md:translate-x-0
      `}>
        <ul className="flex flex-col md:flex-row">
          <li>Home</li>
          <li>About</li>
          <li>Contact</li>
        </ul>
      </div>
    </nav>
  );
}

Touch Targets

触摸目标

Minimum size:
css
button, a {
  min-height: 44px; /* iOS recommendation */
  min-width: 44px;
  padding: 0.75rem 1rem;
}
Touch-friendly spacing:
css
.button-group button {
  margin: 0.5rem; /* Space between touch targets */
}
最小尺寸:
css
button, a {
  min-height: 44px; /* iOS recommendation */
  min-width: 44px;
  padding: 0.75rem 1rem;
}
触摸友好间距:
css
.button-group button {
  margin: 0.5rem; /* Space between touch targets */
}

Viewport Units

视口单位

Full height:
css
.hero {
  height: 100vh; /* Viewport height */
  height: 100dvh; /* Dynamic viewport (mobile) */
}
Responsive spacing:
css
.section {
  padding: 5vw; /* Scales with viewport */
}
全屏高度:
css
.hero {
  height: 100vh; /* Viewport height */
  height: 100dvh; /* Dynamic viewport (mobile) */
}
响应式间距:
css
.section {
  padding: 5vw; /* Scales with viewport */
}

Common Patterns

通用布局模式

Sidebar layout:
css
.layout {
  display: grid;
  gap: 2rem;
  
  /* Mobile: Stack */
  grid-template-columns: 1fr;
}

@media (min-width: 1024px) {
  .layout {
    /* Desktop: Sidebar + main */
    grid-template-columns: 250px 1fr;
  }
}
Card grid:
css
.cards {
  display: grid;
  gap: 1rem;
  
  /* Mobile: 1 column */
  grid-template-columns: 1fr;
}

@media (min-width: 640px) {
  .cards {
    /* Tablet: 2 columns */
    grid-template-columns: repeat(2, 1fr);
  }
}

@media (min-width: 1024px) {
  .cards {
    /* Desktop: 3 columns */
    grid-template-columns: repeat(3, 1fr);
  }
}

@media (min-width: 1280px) {
  .cards {
    /* Large: 4 columns */
    grid-template-columns: repeat(4, 1fr);
  }
}
Hero section:
css
.hero {
  padding: 2rem 1rem;
  text-align: center;
}

@media (min-width: 768px) {
  .hero {
    padding: 4rem 2rem;
  }
}

@media (min-width: 1024px) {
  .hero {
    padding: 6rem 3rem;
    text-align: left;
    display: grid;
    grid-template-columns: 1fr 1fr;
    align-items: center;
  }
}
侧边栏布局:
css
.layout {
  display: grid;
  gap: 2rem;
  
  /* Mobile: Stack */
  grid-template-columns: 1fr;
}

@media (min-width: 1024px) {
  .layout {
    /* Desktop: Sidebar + main */
    grid-template-columns: 250px 1fr;
  }
}
卡片网格:
css
.cards {
  display: grid;
  gap: 1rem;
  
  /* Mobile: 1 column */
  grid-template-columns: 1fr;
}

@media (min-width: 640px) {
  .cards {
    /* Tablet: 2 columns */
    grid-template-columns: repeat(2, 1fr);
  }
}

@media (min-width: 1024px) {
  .cards {
    /* Desktop: 3 columns */
    grid-template-columns: repeat(3, 1fr);
  }
}

@media (min-width: 1280px) {
  .cards {
    /* Large: 4 columns */
    grid-template-columns: repeat(4, 1fr);
  }
}
Hero区域:
css
.hero {
  padding: 2rem 1rem;
  text-align: center;
}

@media (min-width: 768px) {
  .hero {
    padding: 4rem 2rem;
  }
}

@media (min-width: 1024px) {
  .hero {
    padding: 6rem 3rem;
    text-align: left;
    display: grid;
    grid-template-columns: 1fr 1fr;
    align-items: center;
  }
}

Testing

测试方法

Browser DevTools:
  • Chrome: Device toolbar (Cmd+Shift+M)
  • Firefox: Responsive Design Mode
  • Safari: Enter Responsive Design Mode
Test on real devices:
  • iPhone (various sizes)
  • Android phones
  • Tablets
  • Different browsers
Responsive testing tools:
  • BrowserStack
  • LambdaTest
  • Responsively App
浏览器开发者工具:
  • Chrome:设备工具栏(Cmd+Shift+M)
  • Firefox:响应式设计模式
  • Safari:进入响应式设计模式
在真实设备上测试:
  • iPhone(不同尺寸)
  • Android手机
  • 平板电脑
  • 不同浏览器
响应式测试工具:
  • BrowserStack
  • LambdaTest
  • Responsively App

Responsive Checklist

响应式设计检查清单

Layout:
  • Mobile-first approach
  • Flexible grid system
  • No horizontal scrolling
  • Content readable at all sizes
Typography:
  • Readable font sizes (16px+ body)
  • Appropriate line height
  • Fluid typography for headings
  • Proper text wrapping
Images:
  • Responsive images
  • Appropriate sizes for devices
  • Fast loading
  • Art direction where needed
Navigation:
  • Mobile menu pattern
  • Touch-friendly targets (44px+)
  • Easy to use on mobile
  • Accessible
Performance:
  • Fast on mobile networks
  • Optimized images
  • Minimal layout shifts
  • Touch interactions smooth
布局:
  • 移动优先方法
  • 灵活网格系统
  • 无水平滚动
  • 所有尺寸下内容均可读
排版:
  • 可读的字体大小(正文字体16px以上)
  • 合适的行高
  • 标题使用流体排版
  • 文本自动换行正常
图片:
  • 响应式图片
  • 适配不同设备的尺寸
  • 加载速度快
  • 必要时使用图片艺术方向
导航:
  • 移动端菜单模式
  • 触摸友好的目标区域(44px以上)
  • 移动端易于操作
  • 可访问性达标
性能:
  • 在移动网络下加载快
  • 图片已优化
  • 布局偏移最少
  • 触摸交互流畅

Best Practices

最佳实践

Use relative units:
css
/* Good */
padding: 1rem;
font-size: 1.125rem;
width: 80%;

/* Avoid */
padding: 16px;
font-size: 18px;
width: 800px;
Test early and often:
  • Test on mobile first
  • Use real devices
  • Test different orientations
  • Test with slow connections
Progressive enhancement:
  • Core functionality works on all devices
  • Enhanced features for larger screens
  • Graceful degradation
undefined
使用相对单位:
css
/* Good */
padding: 1rem;
font-size: 1.125rem;
width: 80%;

/* Avoid */
padding: 16px;
font-size: 18px;
width: 800px;
尽早并频繁测试:
  • 先在移动端测试
  • 使用真实设备
  • 测试不同屏幕方向
  • 在慢速网络环境下测试
渐进式增强:
  • 核心功能在所有设备上都能正常工作
  • 为更大屏幕提供增强功能
  • 优雅降级
undefined