前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
首页程序员面试题库响应式设计 rem 与 vw 单位配合使用
CSS响应式设计

响应式字号和间距该怎么搭配 rem、em 与视口单位?

rem 以根元素字号为基准,适合全站字号和间距尺度;em 以当前元素相关的字体尺寸为基准,适合组件内部跟随文字缩放;vw 等视口单位直接随视口变化。需要流体字号时可用 clamp() 给视口部分设上下限,避免小屏过小、大屏过大。容器相关尺寸则可考虑容器单位,但要先有适用的查询容器。

前端进阶之旅 · 一题精讲更新于 2026.09.29
CSS#响应式设计#容器化
先看核心答案读代码示例
理解线索

三种单位对应不同基准

  1. rem相对根元素字体尺寸,适合跨组件保持统一尺度
  2. em局部间距可随组件计算后的字号一起缩放
  3. vw相对视口宽度,纯用它设字号须加可读范围

font-size 上通常以父字号为基准,其他属性的 em 通常以元素自身的计算字号为基准。

核心回答

先记住这个答案

rem 适合建立全站尺度,em 适合让局部间距随组件字号变化;视口单位则跟窗口尺寸走。比如按钮内边距用 em,字号变化时按钮比例还算协调,但嵌套元素的 em 可能逐层放大。做流体字号时可用含 rem 的 clamp() 给出可访问的上下限,并实测浏览器缩放。

  • rem 跟根字号变化
  • em 可跟组件字号变化
  • vw 跟视口宽度变化
  • 流体字号要设合理上下限

标题和按钮分别跟谁缩放

一个文章标题希望在手机上不过大,桌面上稍微放大。用 font-size: clamp(1.5rem, 1rem + 2vw, 3rem) 给它下限、变化段和上限;正文仍以 rem 为主,保证用户改根字号时整体能响应。按钮内边距若希望跟按钮文字一起长大,可以考虑 em。不要把所有尺寸都改成 vw,否则用户缩放文字或在很宽的屏幕上阅读时容易失控。

文章标题和按钮采用不同基准CSS
.article-title {
  font-size: clamp(1.5rem, 1rem + 2vw, 3rem);
  line-height: 1.2;
}
.button { padding: 0.6em 1em; /* 跟随按钮字号 */ }
.article { max-width: 70rem; /* 控制长行宽度 */ }

rem 依赖根字体尺寸;em 用在 font-size 上时相对父元素字号,用在该元素其他属性上通常相对元素自身计算字号,嵌套时要特别注意。 示例的大标题用了 clamp(),但它仍可能在很窄的卡片里换行到四五行;字号计算只解决数值范围,不保证布局容得下。按钮内边距用 em 会跟随按钮自己的字号,触控面积也会变化,仍要检查最小点击区域。.article 的最大宽度用 rem 是整体节奏选择;如果根字号由用户放大,文章行宽也会相应变化。

三种单位对应不同基准

视口单位依据视口尺寸,不直接代表用户的字体偏好。clamp() 会在最小、首选和最大值之间取合适结果,首选值里可混合 rem 与 vw,让流体变化同时保留与字号设置的联系。单位选择应对应“跟谁变化”这个设计问题。

em 有一个常见陷阱:它在 font-size 上通常相对于父元素字体大小,而在同一元素的 padding 上依据该元素计算后的字体大小。把两者一并按“永远相对父级”理解,嵌套组件就会被放大得出乎意料。调试时在 DevTools 看计算值和继承链,必要时用 rem 固定跨组件尺度,只让局部内边距跟组件文字变化。

回答前,多想一步

容易答错的地方

说 em 永远相对父元素
font-size 上通常以父字号为基准,其他属性的 em 通常以元素自身的计算字号为基准。
用纯 vw 设置全部字号
视口变化不等于阅读需求,给字号上下限并测试文字缩放更稳。
试着用自己的话回答

面试官还会怎么问?

为什么 em 嵌套会越放越大?

若每层都用大于 1 的 em 设置字号,下一层会以已放大的父字号为基准。

rem 是否一定是 16px?

不是。它跟根元素的计算字号走,根字号可能由浏览器设置或页面样式改变。

何时用容器单位?

组件样式应跟随自身容器而非整个视口时,建立查询容器后可使用相应单位。

从一道题,走向一组知识

把知识连起来

响应式设计

图片的 srcset 和 sizes 怎样让浏览器选合适的文件?

图片显示宽度可用 vw 描述,但还要与实际 CSS 布局宽度一致。

响应式设计

怎样在 DevTools 中系统测试响应式页面?

字体和间距缩放后的布局应在 DevTools 连续视口宽度下检查。

参考资料

  • CSS:响应式设计参考资料

示例用于理解所注明的运行环境与边界;延伸学习可结合原文中的更多案例。

本题目录
  1. 先记住这个答案
  2. 标题和按钮分别跟谁缩放
  3. 三种单位对应不同基准
  4. 容易答错的地方
  5. 面试官还会怎么问
  6. 把知识连起来
读懂,再试着讲出来

先看核心答案,再读代码。最后展开追问,检查自己有没有遗漏边界。

试着回答追问
浏览全部面试题理解原理,也关注真实的使用场景。回到顶部 ↑