响应式设计与媒体查询

中等 🟡CSS 布局
8 个标签
预计阅读时间:31 分钟
CSS响应式媒体查询移动端容器查询clamp断点流式布局

响应式设计与媒体查询

响应式设计是现代网页开发的标准实践,确保网站在不同设备和屏幕尺寸上都能良好显示。一句话概括:同一套 HTML,让布局随视口自动适配,而不是为手机和桌面各写一个站点。

为什么需要响应式

在移动互联网普及前,网页是为固定宽度(如 960px)设计的。手机出现后,设备尺寸从 320px 手机到 2560px 显示器跨度巨大。如果不做适配,手机上要么内容被压扁、要么用户不停横向滚动和缩放,体验极差。

数据角度看它有多重要:

全球网页流量中,移动端占比长期在 55%~60% 之间(不同统计口径略有差异)。
屏幕宽度分布极度分散:主流手机逻辑宽度集中在 360~430px,平板 768~1024px,笔记本 1280~1536px,桌面 1920px+。
Google 自 2019 年起对新站点全面采用"移动优先索引"(Mobile-First Indexing),移动端体验直接影响 SEO 排名。

这意味着"不做响应式"不仅是体验问题,更是流量和收入问题。

响应式的三大支柱

用盖房子类比:媒体查询是"根据地块大小换图纸",流式布局是"墙面按比例伸缩",弹性图片是"家具不撑破房间"。三者缺一不可。

1.弹性网格(流式布局):用百分比、Flex、Grid 代替固定像素宽度。
2.弹性图片/媒体:`max-width: 100%` 让图片不超出容器,配合 `srcset` 按屏幕给不同分辨率。
3.媒体查询:在特定断点切换布局规则。

媒体查询基础

基本语法:

`@media media-type and (media-feature) { ... }`
媒体类型:screen(屏幕)、print(打印)、speech(朗读)、all(全部)
媒体特性:width、height、orientation 等

常用媒体特性:

`min-width`:视口最小宽度(移动优先常用)
`max-width`:视口最大宽度(桌面优先常用)
`min-height` / `max-height`:高度
`orientation`:方向(portrait 竖屏 / landscape 横屏)
`aspect-ratio`:宽高比
`prefers-color-scheme`:用户系统的深浅色偏好
`prefers-reduced-motion`:用户是否要求减少动画
`hover` / `pointer`:设备是否支持悬停、指针精度(区分触屏与鼠标)

逻辑运算符:

`and`:同时满足多个条件
`not`:否定媒体查询
`only`:仅适用于特定媒体类型(历史上用于兼容老浏览器)
`,`(逗号):或关系,满足任一即可
CSS Media Queries Level 4 还支持区间写法:`@media (400px <= width <= 700px)`

断点怎么选

不要照抄某个具体设备(设备年年变),而是"内容开始难看的地方就是断点"。一套常用参考:

| 断点名 | 起始宽度 | 典型设备 |

| --- | --- | --- |

| xs(手机) | 0 | 竖屏手机 |

| sm | 576px | 大屏手机/小平板竖屏 |

| md | 768px | 平板 |

| lg | 992px / 1024px | 小笔记本 |

| xl | 1200px | 桌面 |

| xxl | 1400px+ | 大桌面 |

代码示例

移动优先策略(推荐)

cssCode
/* 移动优先:默认写小屏样式,用 min-width 逐步增强 */
.container {
  width: 100%;
  padding: 10px;
}

/* 平板 */
@media (min-width: 768px) {
  .container {
    width: 750px;
    margin: 0 auto;
    padding: 20px;
  }
}

/* 桌面 */
@media (min-width: 1024px) {
  .container { width: 970px; }
}

/* 大屏桌面 */
@media (min-width: 1200px) {
  .container { width: 1170px; }
}

桌面优先策略(用于改造老站)

cssCode
/* 桌面优先:默认写大屏,用 max-width 逐步降级 */
.container { width: 1170px; margin: 0 auto; }

@media (max-width: 1199px) { .container { width: 970px; } }
@media (max-width: 1023px) { .container { width: 750px; } }
@media (max-width: 767px)  { .container { width: 100%; padding: 10px; } }

响应式导航栏(汉堡菜单)

cssCode
.navbar {
  background-color: #333;
  color: white;
  padding: 1rem 2rem;
}

.nav-container {
  display: flex;
  justify-content: space-between;
  align-items: center;
  max-width: 1200px;
  margin: 0 auto;
}

.nav-brand { font-size: 1.5rem; font-weight: bold; }

.nav-menu {
  display: flex;
  list-style: none;
  margin: 0;
  padding: 0;
  gap: 2rem;
}

.nav-menu li a {
  color: white;
  text-decoration: none;
  transition: color 0.3s;
}

.nav-menu li a:hover { color: #007bff; }

/* 汉堡按钮默认隐藏(桌面不需要) */
.nav-toggle {
  display: none;
  background: none;
  border: none;
  color: white;
  font-size: 1.5rem;
  cursor: pointer;
}

/* 平板和手机 */
@media (max-width: 768px) {
  .nav-toggle { display: block; }

  .nav-menu {
    position: absolute;
    top: 100%;
    left: 0;
    right: 0;
    background-color: #333;
    flex-direction: column;
    padding: 1rem 2rem;
    gap: 1rem;
    display: none;
    box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
  }

  .nav-menu.active { display: flex; }
  .nav-menu li { width: 100%; }
  .nav-menu li a { display: block; padding: 0.5rem 0; }
}

用 Grid + auto-fit 实现"无断点"响应式卡片

cssCode
/* 不写一个 @media,卡片会随容器宽度自动换行、自动分列 */
.card-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
  gap: 20px;
}
/* 屏幕越宽,一行放的卡片越多;每张最小 240px */

clamp() 实现流式字号与间距

cssCode
:root {
  /* 字号在 16px~24px 之间随视口线性变化,无需断点 */
  --fs-title: clamp(1.25rem, 1rem + 2vw, 1.5rem);
  --gap: clamp(12px, 2vw, 32px);
}

.hero-title { font-size: var(--fs-title); }
.section    { padding: var(--gap); }

弹性图片与响应式图片

cssCode
/* 基础:图片永不超出容器 */
img { max-width: 100%; height: auto; display: block; }
htmlCode
<!-- 按屏幕分辨率提供不同尺寸,浏览器自动挑最合适的,省流量 -->
<img
  src="photo-800.jpg"
  srcset="photo-400.jpg 400w, photo-800.jpg 800w, photo-1200.jpg 1200w"
  sizes="(max-width: 600px) 100vw, 50vw"
  alt="示例图片"
/>

容器查询(Container Queries):面向组件的响应式

cssCode
/* 媒体查询看"视口",容器查询看"父容器",
   同一个卡片组件放在窄侧栏 vs 宽主区能各自适配 */
.card-wrapper {
  container-type: inline-size;
  container-name: card;
}

.card { display: block; }

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

结合用户偏好的媒体特性

cssCode
/* 跟随系统深色模式 */
@media (prefers-color-scheme: dark) {
  :root { --bg: #1a1a1a; --text: #f5f5f5; }
}

/* 尊重"减少动画"无障碍偏好 */
@media (prefers-reduced-motion: reduce) {
  * {
    animation-duration: 0.01ms !important;
    transition-duration: 0.01ms !important;
  }
}

/* 区分触屏与鼠标:触屏加大点击区域 */
@media (hover: none) and (pointer: coarse) {
  .btn { min-height: 44px; min-width: 44px; }
}

必备的 viewport meta 标签

htmlCode
<!-- 没有这一行,手机会按 980px 渲染再缩小,媒体查询全部失效 -->
<meta name="viewport" content="width=device-width, initial-scale=1" />

真实案例

案例 1:电商商品列表。 某电商列表页原本固定 4 列,手机上被压成 4 个极窄卡片、文字换行错乱,移动端转化率偏低。改用 `grid-template-columns: repeat(auto-fit, minmax(160px, 1fr))` 后,手机自动变 2 列、平板 3 列、桌面 4~5 列,移动端加购率提升约 18%,且删掉了 4 处 @media 断点代码。

案例 2:新闻站字号。 某内容站桌面字号 18px,手机沿用后显得过大、每行字太少。用 `clamp(16px, 1rem + 0.5vw, 18px)` 做流式字号后,各尺寸阅读体验一致,平均阅读时长上升约 9%。

案例 3:仪表盘组件复用。 某后台的"数据卡片"既出现在窄侧栏又出现在宽主区,用媒体查询无法区分(视口一样宽)。改用容器查询后,同一组件在窄容器里竖排、宽容器里横排,复用率提升,重复样式代码减少约 40%。

数据与对比

| 方案 | 适用场景 | 优点 | 局限 |

| --- | --- | --- | --- |

| min-width 媒体查询 | 全局布局切换 | 直观、兼容好 | 断点多了难维护 |

| Grid auto-fit/fill | 卡片/图库列表 | 少写甚至不写断点 | 复杂布局不够灵活 |

| clamp() 流式 | 字号、间距 | 平滑无跳变 | 不适合布局大改 |

| 容器查询 | 可复用组件 | 按父容器适配 | 老浏览器需降级 |

| srcset/sizes | 图片 | 按需加载省流量 | 需准备多份图 |

浏览器支持参考(2024 年):媒体查询、Flex、Grid、clamp 已全面支持;容器查询在主流浏览器(Chrome 105+、Safari 16+、Firefox 110+)均已支持,覆盖率约 90%+,对老浏览器需提供无容器查询时的降级样式。

常见坑

1.忘了 viewport meta:这是移动适配失效最常见的原因,媒体查询写得再对也没用。
2.min-width 与 max-width 混用导致重叠:`@media (max-width: 768px)` 和 `@media (min-width: 768px)` 在正好 768px 时可能同时命中,边界要错开(如用 767.98px)或统一移动优先。
3.用固定 px 宽度:`width: 400px` 在 360px 手机上会横向溢出,改用 `max-width` 或百分比。
4.断点抄设备型号:设备尺寸每年在变,应按内容断点,而不是"iPhone 是多少就写多少"。
5.只在浏览器缩放测试:缩放窗口不等于真实设备,DPR、触摸、软键盘、安全区都测不到,务必真机验证。
6.1vh 在移动端不准:移动浏览器地址栏收起会改变视口高度,`100vh` 会跳动,可用 `100dvh`(动态视口单位)。
7.媒体查询里重复大量样式:应把公共样式写在断点外,断点里只写差异。

最佳实践

采用移动优先策略,用 `min-width` 逐步增强,样式默认值就是最小屏
优先用 Grid/Flex + `clamp()` 做"内在响应式",能不写断点就不写
使用相对单位(rem、%、vw、fr)而非固定 px
图片用 `max-width: 100%` + `srcset`/`sizes` 按需加载
尊重用户偏好:`prefers-color-scheme`、`prefers-reduced-motion`
触屏点击区域不小于 44×44px
用容器查询做真正可复用的组件级响应式
在真实设备与浏览器 DevTools 设备模拟中双重测试
控制媒体查询数量,避免样式在多个断点重复

视口单位全家桶:vw / vh / vmin / vmax / dvh

视口单位让尺寸直接锚定到"屏幕本身",是流式布局与流式排版的基础。1vw = 视口宽度的 1%,1vh = 视口高度的 1%。

| 单位 | 含义 | 典型用途 |

| --- | --- | --- |

| vw | 视口宽度的 1% | 流式字号、全宽区块 |

| vh | 视口高度的 1% | 首屏满屏 hero |

| vmin | vw 与 vh 中较小者的 1% | 保证元素在横竖屏都不溢出 |

| vmax | vw 与 vh 中较大者的 1% | 背景铺满 |

| svh / lvh / dvh | 小/大/动态视口高度 | 移动端地址栏收放的正确满屏 |

cssCode
/* 首屏 hero:桌面用 100vh,移动端用 100dvh 避免地址栏跳动 */
.hero {
  height: 100vh;      /* 老浏览器兜底 */
  height: 100dvh;     /* 现代浏览器:动态视口高度,地址栏收起时不跳 */
  display: grid;
  place-items: center;
}

/* vmin 保证正方形二维码在横竖屏都完整可见 */
.qr {
  width: 60vmin;
  height: 60vmin;
}

/* 谨慎:纯 vw 字号在超宽屏会过大、超窄屏会过小,务必配 clamp 夹住 */
.title-bad  { font-size: 5vw; }                        /* 不推荐 */
.title-good { font-size: clamp(1.5rem, 5vw, 3rem); }   /* 推荐 */

流式排版的数学原理:clamp() 精确计算

`clamp(MIN, PREFERRED, MAX)` 会取"首选值",但不低于 MIN、不高于 MAX。首选值一般写成 `基准rem + 斜率vw`,让字号随视口线性变化。

计算斜率的通用公式:已知在视口 minVW 时要 minFS,在 maxVW 时要 maxFS,则

斜率(vw) = 100 × (maxFS - minFS) / (maxVW - minVW)
截距(rem) = minFS - 斜率 × minVW / 100
cssCode
/* 目标:视口 320px 时 16px,视口 1280px 时 24px(均按 16px=1rem) */
/* 斜率 = 100 × (24-16)/(1280-320) = 0.833vw */
/* 截距 = 16 - 0.833 × 320/100 = 13.33px ≈ 0.833rem */
:root {
  --fs-body: clamp(1rem, 0.833rem + 0.833vw, 1.5rem);
  --fs-h1:   clamp(1.75rem, 1rem + 3.75vw, 3.5rem);
  --fs-h2:   clamp(1.5rem, 1rem + 2.5vw, 2.5rem);

  /* 流式间距系统:段落间距、区块留白都跟着视口平滑缩放 */
  --space-s: clamp(8px, 1vw, 12px);
  --space-m: clamp(16px, 2.5vw, 32px);
  --space-l: clamp(32px, 5vw, 80px);
}

body    { font-size: var(--fs-body); }
h1      { font-size: var(--fs-h1); }
h2      { font-size: var(--fs-h2); }
section { padding-block: var(--space-l); }
.stack > * + * { margin-top: var(--space-m); }

Grid 响应式:auto-fit vs auto-fill 的关键区别

两者都能"自动分列",但列数不足时表现完全不同,这是高频面试题。

`auto-fill`:尽可能多地创建列轨道,即使没有内容也保留空轨道,元素不会被拉伸。
`auto-fit`:把空轨道折叠为 0,让现有元素拉伸填满整行。
cssCode
/* auto-fill:屏幕很宽但只有 2 个卡片时,右侧留出空位(保留空轨道) */
.grid-fill {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
  gap: 20px;
}

/* auto-fit:同样 2 个卡片,会被拉伸填满整行(空轨道塌缩) */
.grid-fit {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
  gap: 20px;
}

一句话记忆:想让少量元素撑满用 auto-fit,想保持卡片固定宽度、留白对齐用 auto-fill。

cssCode
/* 经典圣杯布局的响应式版:侧栏定宽,主区自适应,窄屏自动堆叠 */
.layout {
  display: grid;
  gap: 24px;
  grid-template-columns: 1fr;          /* 默认单列(移动端) */
}
@media (min-width: 900px) {
  .layout {
    grid-template-columns: 240px 1fr 200px; /* 左栏 主区 右栏 */
    grid-template-areas: 'nav main aside';
  }
}
.layout > nav   { grid-area: nav; }
.layout > main  { grid-area: main; }
.layout > aside { grid-area: aside; }

响应式图片进阶:picture 与艺术方向

`srcset` 解决"同一张图不同分辨率",而 `` 解决"不同视口用不同构图"(art direction)——比如手机用竖构图特写,桌面用横构图全景。

htmlCode
<!-- 艺术方向:手机竖图、平板方图、桌面横图 -->
<picture>
  <source media="(min-width: 1024px)" srcset="hero-wide.jpg" />
  <source media="(min-width: 640px)"  srcset="hero-square.jpg" />
  <img src="hero-portrait.jpg" alt="首图" width="800" height="1000" />
</picture>

<!-- 现代格式优先,浏览器不支持时自动回退 -->
<picture>
  <source type="image/avif" srcset="photo.avif" />
  <source type="image/webp" srcset="photo.webp" />
  <img src="photo.jpg" alt="照片" loading="lazy" decoding="async" />
</picture>

始终给 `` 写 `width`/`height` 或 `aspect-ratio`,浏览器才能提前预留空间,避免图片加载时的布局抖动(CLS)。

响应式表格:小屏怎么放下宽表格

宽表格在手机上是响应式头号难题。三种主流方案:

cssCode
/* 方案 1:横向滚动(最简单,保留表格结构) */
.table-wrap {
  overflow-x: auto;
  -webkit-overflow-scrolling: touch;
}
.table-wrap table { min-width: 600px; }

/* 方案 2:小屏把每行"卡片化",用 data-label 显示表头 */
@media (max-width: 640px) {
  .responsive-table thead { display: none; }        /* 隐藏表头 */
  .responsive-table tr {
    display: block;
    margin-bottom: 12px;
    border: 1px solid #eee;
    border-radius: 8px;
  }
  .responsive-table td {
    display: flex;
    justify-content: space-between;
    padding: 8px 12px;
  }
  .responsive-table td::before {
    content: attr(data-label);   /* 用属性值当行内表头 */
    font-weight: bold;
  }
}
htmlCode
<!-- 配合方案 2 的结构 -->
<table class="responsive-table">
  <thead><tr><th>姓名</th><th>邮箱</th><th>角色</th></tr></thead>
  <tbody>
    <tr>
      <td data-label="姓名">张三</td>
      <td data-label="邮箱">zhang@x.com</td>
      <td data-label="角色">管理员</td>
    </tr>
  </tbody>
</table>

用 SCSS 封装断点:告别硬编码

项目里到处写 `@media (min-width: 768px)` 很难维护,用 map + mixin 集中管理断点是工程化标配。

scssCode
$breakpoints: (
  'sm': 576px,
  'md': 768px,
  'lg': 992px,
  'xl': 1200px,
);

@mixin up($name) {
  @if map-has-key($breakpoints, $name) {
    @media (min-width: map-get($breakpoints, $name)) { @content; }
  } @else {
    @error 'Unknown breakpoint: #{$name}';
  }
}

// 业务里语义化调用,改断点只改一处 map
.sidebar {
  display: none;
  @include up('lg') { display: block; }
}

打印样式:常被忽视的响应式

`@media print` 让页面在打印/导出 PDF 时有专门样式,隐藏导航、去掉背景、优化分页。

cssCode
@media print {
  .nav, .sidebar, .ads, .no-print { display: none; }
  body { color: #000; background: #fff; font-size: 12pt; }
  a::after { content: ' (' attr(href) ')'; }  /* 打印时展开链接地址 */
  .card { break-inside: avoid; }              /* 避免卡片被切成两页 */
  h2, h3 { break-after: avoid; }              /* 标题不落在页尾 */
}

完整实战:一个响应式产品页骨架

cssCode
:root {
  --max: 1200px;
  --gap: clamp(16px, 3vw, 40px);
}

/* 通用容器:限宽 + 居中 + 流式内边距 */
.container {
  width: 100%;
  max-width: var(--max);
  margin-inline: auto;
  padding-inline: var(--gap);
}

/* 顶部导航:桌面横排,移动端汉堡 */
.header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--gap);
}

/* 特性区:无断点自适应分列 */
.features {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
  gap: var(--gap);
}

/* 图文并排区:窄屏自动上下堆叠 */
.media-object {
  display: grid;
  gap: var(--gap);
  grid-template-columns: 1fr;
}
@media (min-width: 768px) {
  .media-object { grid-template-columns: 1fr 1fr; align-items: center; }
}

/* 页脚:多列链接自动换行 */
.footer-links {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
  gap: var(--gap);
}

更多真实案例

案例 4:100vh 导致移动端底部按钮被地址栏遮挡。 某活动页把"立即报名"按钮固定在 `height: 100vh` 容器底部,iOS Safari 地址栏展开时按钮被顶出可视区,转化率骤降。改用 `100dvh`(动态视口)后,按钮始终贴合真实可视底部,报名点击率回升约 12%。

案例 5:图片未设尺寸导致 CLS 超标。 某资讯站首屏大图未写 width/height,加载完成瞬间下方内容被推走,Core Web Vitals 的 CLS 达 0.35(差)。补上 `aspect-ratio: 16/9` 后,浏览器提前占位,CLS 降到 0.02(优),Google 页面体验评分从"需要改进"升到"良好"。

案例 6:断点硬编码引发大规模改版返工。 某项目 200+ 处直接写死 `768px`,产品要把平板断点改到 834px 时逐个改极易漏改。重构为 SCSS 断点 map 后,一处改值全局生效,同类改动从 2 天缩短到 5 分钟。

数据与对比:视口高度单位在移动端的表现

| 单位 | 地址栏展开时 | 地址栏收起时 | 是否跳动 |

| --- | --- | --- | --- |

| vh(100vh) | 按最大视口算,底部被遮 | 正常 | 会 |

| svh(100svh) | 按最小视口算,始终不被遮 | 顶部留白 | 不会 |

| lvh(100lvh) | 按最大视口算 | 底部被遮 | 会 |

| dvh(100dvh) | 实时跟随当前视口 | 实时跟随 | 平滑 |

移动端首屏满屏推荐 `100dvh`,需要"绝不被遮挡"的固定元素可用 `100svh`。浏览器支持:dvh/svh/lvh 在 Chrome 108+、Safari 15.4+、Firefox 101+ 可用,覆盖率约 90%+,老浏览器用 `100vh` 兜底。

方向与折叠屏适配

除了宽度,方向(横竖屏)和新兴的折叠屏也需要考虑。

cssCode
/* 横屏时视频播放器铺满,竖屏时留出下方信息区 */
@media (orientation: landscape) {
  .player { height: 100dvh; }
}
@media (orientation: portrait) {
  .player { aspect-ratio: 16 / 9; }
}

/* 折叠屏:用 CSS 环境变量避开屏幕折痕(实验特性) */
@media (spanning: single-fold-vertical) {
  .book-layout {
    display: grid;
    grid-template-columns: env(fold-left) 1fr;
  }
}

调试与测试响应式

真机永远优于模拟器,但日常开发离不开 DevTools 的设备模式。

Chrome DevTools 设备工具栏(Cmd/Ctrl + Shift + M):切换预设机型、自定义分辨率、调 DPR、模拟 `prefers-color-scheme` 与 `prefers-reduced-motion`。
用 `outline` 全局描边快速定位溢出元素:`* { outline: 1px solid red; }`。
横向溢出排查:`document.querySelectorAll('*')` 遍历比对 `scrollWidth > clientWidth` 的元素。
Lighthouse 审计移动端性能、CLS、可点击目标尺寸。
真机远程调试:iOS 用 Safari 网页检查器,Android 用 chrome://inspect。
cssCode
/* 一键排查是谁撑出了横向滚动条 */
* { outline: 1px solid rgba(255, 0, 0, .2); }
html { overflow-x: hidden; } /* 临时兜底,但根因仍要修 */

常见坑补充

8.em/rem 混淆导致缩放失控:em 相对父级字号会层层累积,rem 相对根字号更可控,做响应式排版优先 rem。
9.图片懒加载首屏也懒加载:首屏关键图别加 `loading="lazy"`,否则反而拖慢 LCP。
10.只测竖屏忘了横屏:手机横屏高度骤减,`100vh` 的全屏弹层可能内容溢出且无法滚动。

总结

| 你要做的事 | 首选工具 |

| --- | --- |

| 整页布局随视口切换 | min-width 媒体查询(移动优先) |

| 卡片列表自动分列 | Grid repeat(auto-fit, minmax()) |

| 字号/间距平滑缩放 | clamp() |

| 组件按父容器适配 | 容器查询 @container |

| 图片省流量 | srcset + sizes |

| 跟随系统深浅色 | prefers-color-scheme |

| 无障碍减少动画 | prefers-reduced-motion |

| 移动端真实满屏 | 100dvh / 100svh |

| 不同构图换图 | picture + source media |

| 断点集中管理 | SCSS map + mixin |

| 打印/导出 PDF | @media print |

一句话记忆:移动优先 + 相对单位 + 少写断点。现代 CSS 已经把很多"响应式"能力内建进 Grid、clamp、容器查询里,媒体查询更多用于大布局切换,而不是像十年前那样什么都靠它。