一、什么是响应式设计

响应式设计(Responsive Web Design)指让网页在不同设备(PC、平板、手机)上都能提供良好的浏览体验。核心思想是"一次设计,到处适配"。

二、Viewport 设置

这是响应式设计的第一步,告诉浏览器以设备宽度来渲染页面:

<meta name="viewport" content="width=device-width, initial-scale=1.0">

三、媒体查询(Media Queries)

媒体查询是响应式设计的核心工具,根据屏幕宽度应用不同的 CSS 样式。

常见断点

设备屏幕宽度断点
手机(竖屏)< 640px@media (max-width: 640px)
平板640px - 1024px@media (max-width: 1024px)
桌面> 1024px@media (min-width: 1025px)

使用示例

/* 桌面端:3列布局 */
.card-grid {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 24px;
}

/* 平板:2列布局 */
@media (max-width: 1024px) {
    .card-grid {
        grid-template-columns: repeat(2, 1fr);
    }
}

/* 手机:1列布局 + 隐藏侧边栏 */
@media (max-width: 640px) {
    .card-grid {
        grid-template-columns: 1fr;
    }
    .sidebar {
        display: none;
    }
}

四、移动端适配方案

1. rem 适配

// 设置根字体大小(1rem = 屏幕宽度/10)
function setRem() {
    const width = document.documentElement.clientWidth;
    document.documentElement.style.fontSize = (width / 10) + 'px';
}
window.addEventListener('resize', setRem);
setRem();

// 使用时
// .title { font-size: 0.16rem; }  // 在375px屏幕上 = 16px

2. vw/vh 单位

.hero {
    height: 100vh;           /* 视口高度 */
    width: 100vw;            /* 视口宽度 */
    font-size: clamp(1rem, 2.5vw, 2rem);  /* 最小1rem,最大2rem */
}

3. 弹性图片

img {
    max-width: 100%;   /* 不超过容器宽度 */
    height: auto;      /* 保持宽高比 */
}

/* 根据分辨率加载不同图片 */
// <img srcset="small.jpg 480w, medium.jpg 800w, large.jpg 1200w"
//      sizes="(max-width: 640px) 100vw, 50vw"
//      src="default.jpg">

五、移动优先 vs 桌面优先

策略默认样式媒体查询适用场景
移动优先手机端min-width(从小往大加)新项目、移动端流量大
桌面优先桌面端max-width(从大往小减)旧项目改造、后台系统

六、实际开发技巧

  1. 布局优先用 Flexbox/Grid:它们天然具有弹性,比浮动布局更适合响应式
  2. 使用相对单位:em、rem、%、vw/vh 代替固定 px
  3. 文字使用 clamp():font-size: clamp(1rem, 2vw, 1.5rem)
  4. 交互适配:移动端用 touch 事件,桌面端用 click;悬停效果在触屏上无效
  5. 按需加载:移动端不加载桌面端专用的重资源

七、总结

响应式设计不能只靠媒体查询,要从布局策略、单位系统、资源加载等多维度考虑。推荐采用移动优先的策略,先保证核心功能在手机上可用,再逐步增强桌面体验。