Skip to content

CSS 适配手机端技巧

1. Viewport Meta 标签

最基础的一步,在 HTML <head> 中添加:

html
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">

2. 媒体查询(Media Queries)

根据屏幕宽度应用不同样式,是响应式设计的核心:

css
/* 桌面端默认样式 */
.container { width: 1200px; }

/* 平板 */
@media screen and (max-width: 768px) {
  .container { width: 100%; padding: 0 16px; }
}

/* 手机 */
@media screen and (max-width: 480px) {
  .container { width: 100%; padding: 0 12px; }
}

常用断点参考:

  • 480px — 小屏手机
  • 768px — 平板
  • 1024px — 小桌面/大平板
  • 1200px — 桌面

3. 弹性单位

避免使用固定 px,优先使用相对单位:

单位说明适用场景
rem相对于根元素 font-size字体大小、间距
em相对于父元素 font-size组件内部间距
vw/vh视口宽度/高度的百分比全屏布局、大标题
%相对于父元素宽度、布局
vmin/vmax视口较小/较大边的百分比自适应正方形等
css
html { font-size: 16px; }

/* 手机端缩小基准字号 */
@media screen and (max-width: 480px) {
  html { font-size: 14px; }
}

.title { font-size: 1.5rem; }   /* 随基准自动缩放 */
.hero  { height: 100vh; }        /* 撑满视口高度 */
.box   { width: 90vw; }          /* 视口宽度的 90% */

4. Flexbox 弹性布局

手机适配最实用的布局方式:

css
.nav {
  display: flex;
  flex-wrap: wrap;        /* 放不下时自动换行 */
  gap: 8px;
  justify-content: space-between;
}

.nav-item {
  flex: 1 1 120px;        /* 最小 120px,自动伸缩 */
}

5. Grid 网格布局

auto-fit / auto-fill 实现自动响应式网格,无需媒体查询:

css
.grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
  gap: 16px;
}

桌面端会排多列,手机端自动变为单列。

6. clamp() 函数

一个函数实现最小值、首选值、最大值的自适应,非常强大:

css
.title {
  /* 最小 16px,首选 4vw,最大 32px */
  font-size: clamp(16px, 4vw, 32px);
}

.container {
  /* 宽度在 300px ~ 1200px 之间自适应 */
  width: clamp(300px, 90vw, 1200px);
  margin: 0 auto;
}

.card {
  padding: clamp(12px, 3vw, 32px);
}

7. 图片自适应

css
img {
  max-width: 100%;
  height: auto;
  display: block;
}

/* 现代写法:用 aspect-ratio 保持比例 */
.thumbnail {
  width: 100%;
  aspect-ratio: 16 / 9;
  object-fit: cover;
}

配合 HTML <picture> 标签按设备加载不同尺寸图片:

html
<picture>
  <source media="(max-width: 480px)" srcset="img-small.webp">
  <source media="(max-width: 768px)" srcset="img-medium.webp">
  <img src="img-large.webp" alt="...">
</picture>

8. 触摸友好

手机端按钮/链接的点击区域至少 44px × 44px(Apple 推荐)或 48px × 48px(Google 推荐):

css
.btn {
  min-height: 44px;
  min-width: 44px;
  padding: 12px 24px;
  touch-action: manipulation;  /* 消除 300ms 点击延迟 */
}

/* 去掉手机端的 hover 残留效果 */
@media (hover: none) {
  .btn:hover {
    background: inherit;
  }
}

9. 安全区域适配(刘海屏/底部横条)

针对 iPhone X 及以上的异形屏:

css
body {
  padding-top: env(safe-area-inset-top);
  padding-bottom: env(safe-area-inset-bottom);
  padding-left: env(safe-area-inset-left);
  padding-right: env(safe-area-inset-right);
}

.bottom-bar {
  padding-bottom: calc(16px + env(safe-area-inset-bottom));
}

10. 隐藏/显示特定内容

css
/* 仅手机端显示 */
.mobile-only  { display: none; }
@media (max-width: 768px) {
  .mobile-only  { display: block; }
  .desktop-only { display: none; }
}

11. Container Queries(容器查询,现代方案)

比媒体查询更灵活,根据父容器而非视口来响应:

css
.card-wrapper {
  container-type: inline-size;
}

@container (max-width: 400px) {
  .card {
    flex-direction: column;
  }
}

实用建议总结

策略推荐度说明
Mobile First⭐⭐⭐⭐⭐先写手机样式,用 min-width 媒体查询向上扩展
clamp()⭐⭐⭐⭐⭐替代大量媒体查询,一行搞定自适应
Flexbox + Grid⭐⭐⭐⭐⭐布局首选,天然响应式
rem 单位⭐⭐⭐⭐统一缩放,改根字号即可全局调整
Container Queries⭐⭐⭐⭐组件级响应式,适合设计系统

Mobile First 的写法示范:

css
/* 基础:手机端样式 */
.sidebar { display: none; }
.content { width: 100%; }

/* 向上扩展:平板 */
@media (min-width: 768px) {
  .sidebar { display: block; width: 240px; }
  .content { width: calc(100% - 240px); }
}

/* 向上扩展:桌面 */
@media (min-width: 1200px) {
  .sidebar { width: 300px; }
}

这种「先小后大」的方式比「先大后小」更高效,因为手机端是基础,逐步增强到大屏幕。

Released under the MIT License.