在前端开发的日常工作中,移动端适配是一个必绕不开的技术难题。随着不同手机尺寸、分辨率、像素密度的爆炸式增长,如果不进行适配,就会出现「iPhone 显示刚好,安卓一塌糊涂」的尴尬局面 😅。所以,想要在移动端开发里游刃有余,就必须真正理解并掌握各种适配方案。
今天这篇文章,我们就来一口气吃透 什么是移动端适配、如何做适配、常见的坑点,以及面试中可能遇到的相关问题。保证读完后,面试时能胸有成竹 👍。
🍭 什么是移动端适配?
1. 移动端适配的本质:解决 "设备多样性" 带来的显示差异
简单来说,移动端适配是指通过技术手段,让同一套网页代码在不同尺寸、不同分辨率的移动设备上,都能呈现出合理的布局、清晰的内容和易用的交互。
为什么需要适配?因为手机的 "屏幕条件" 千差万别:
- 尺寸不同:从 4.7 英寸的 iPhone SE 到 6.7 英寸的安卓大屏手机;
- 分辨率不同:同样是 6 英寸手机,可能是 720P(1280×720)、1080P(1920×1080)甚至 2K 分辨率;
- 像素密度不同:有的手机 1 英寸屏幕里塞了 300 个像素点(高清屏),有的只塞了 200 个(普通屏)。
如果不做适配,就会出现:
- 大屏手机上内容空荡荡,小屏手机上内容挤成一团;
- 高清屏上图片模糊,普通屏上文字过大;
- 横屏竖屏切换时,页面布局错乱。
🎯 移动端适配的核心概念
在开始写代码前,先搞懂这 3 个容易混淆的概念,否则后续适配会频繁踩坑:
1. 物理像素 vs 逻辑像素:为什么 1px 在手机上会变粗?
- 物理像素(Physical Pixel) :屏幕实际的像素点,是硬件层面的最小显示单位(比如 iPhone 15 的屏幕分辨率是 2556×1179,指的就是物理像素);
- 逻辑像素(Logical Pixel) :也叫 "设备独立像素(DIP)",是软件层面用来描述布局的单位(比如 CSS 中写的
width: 375px
,指的就是逻辑像素)。 、 两者的关系由 "设备像素比(DPR)" 决定:
DPR = 物理像素 / 逻辑像素(同一方向上,比如宽度)。
比如 iPhone 15 的 DPR 是 3,意味着 1 个逻辑像素 = 3 个物理像素(宽度方向上,375 逻辑像素对应 2556/3=852 物理像素?不对,实际计算需结合屏幕比例,这里重点理解 "DPR 是物理与逻辑的桥梁")。
在高 DPR 屏幕(如 DPR=2 的 Retina 屏)上,CSS 写的
1px
会被渲染成 2 个物理像素的宽度,导致 "视觉上 1px 变粗"------ 这也是后续要解决的 "1px 边框问题" 的根源。
2. Viewport(视口):控制页面在手机上的显示范围
Viewport 是移动端适配的 "入口",如果 Viewport 设置不对,后续所有布局都会失效。
简单来说,Viewport 是浏览器用来显示网页的 "可视区域" ,分为 3 类:
- 布局视口(Layout Viewport) :浏览器默认的视口宽度(比如早期手机浏览器为了兼容 PC 网页,默认布局视口宽度是 980px);
- 视觉视口(Visual Viewport) :用户实际能看到的屏幕区域(即手机屏幕的物理宽度对应的逻辑像素);
- 理想视口(Ideal Viewport) :让网页 "刚好充满屏幕,无需缩放" 的视口宽度(等于设备的视觉视口宽度)。
我们要做的,就是通过<meta>
标签将 "布局视口" 强制设置为 "理想视口"
html
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
每个参数的作用:
width=device-width
:将布局视口宽度设为设备的视觉视口宽度(即理想视口);initial-scale=1.0
:页面初始缩放比例为 1(不缩放);maximum-scale=1.0
:禁止用户放大页面;user-scalable=no
:禁止用户手动缩放(部分场景可省略,比如允许用户放大看文字)。
3. 像素单位:px、em、rem、vw/vh 该用哪个?
适配的核心是 "让元素大小随屏幕尺寸变化",而选择合适的像素单位是关键。我们对比 4 种常用单位:
单位 | 定义 | 特点 | 适用场景 |
---|---|---|---|
px | 固定像素(逻辑像素) | 大小固定,不随屏幕尺寸变化 | 固定大小的元素(如按钮图标、边框) |
em | 相对于父元素的字体大小 | 嵌套层级越多,计算越复杂(父元素 font-size 变化会影响子元素) | 局部适配(如按钮内文字大小) |
rem | 相对于根元素(html)的字体大小 | 只依赖根元素,计算简单,可全局控制 | 全局适配(如文字、容器宽度) |
vw/vh | 相对于视口宽度 / 高度的百分比(1vw = 视口宽度的 1%) | 完全随视口大小变化,无需额外计算 | 全屏布局(如顶部导航栏高度、Banner 图宽度) |
举个例子:如果用 rem 适配,我们可以这样做:
- 给 html 设置
font-size: 100px
(方便计算,1rem=100px); - 容器宽度设为
3.75rem
(即 375px,对应 iPhone SE 的理想视口宽度); - 在不同尺寸的设备上,通过 JS 动态调整 html 的 font-size(比如视口宽度为 414px 时,html 的 font-size 设为 110.4px,3.75rem 就自动变成 414px)。

🛠️移动端适配方案(附代码示例)
方案 1:流式布局(百分比布局)------ 最简单的入门方案
原理
通过 "百分比" 代替 "固定像素" 定义元素宽度,让元素宽度随视口宽度自动变化;高度可固定或用百分比,配合max-width
/min-width
限制极端情况。
核心代码示例
css
/* 容器宽度占视口100%,最大宽度限制为750px(避免宽屏手机上内容过宽) */
.container {
width: 100%;
max-width: 750px;
margin: 0 auto; /* 水平居中 */
}
/* 左侧栏占30%,右侧栏占70%,中间留间隙 */
.left-bar {
width: 28%; /* 预留2%间隙 */
float: left;
margin-right: 2%;
}
.right-content {
width: 70%;
float: right;
}
/* 图片自适应:宽度100%,高度自动,避免拉伸 */
img {
width: 100%;
height: auto;
display: block; /* 消除图片下方的空隙 */
}
优缺点
- 优点:实现简单,无需复杂计算,适合简单页面(如活动页、详情页);
- 缺点:高度固定时,在宽屏手机上可能出现 "内容太矮、留白太多";无法做到 "不同屏幕尺寸下布局结构变化"(如手机单列、平板双列)。
方案 2:Flex 布局 ------ 移动端布局的 "首选方案"
Flex(弹性布局)是 CSS3 新增的布局模式,专门解决 "元素在容器内的对齐、分布、自适应" 问题,是目前移动端布局的主流选择。
原理
通过给 "父容器" 设置display: flex
,让子元素成为 "弹性项",再通过flex-direction
(方向)、justify-content
(水平对齐)、flex-wrap
(换行)、flex
(子元素占比)等属性,实现自适应布局。
核心代码示例(常见场景:导航栏、卡片列表)
html
<!-- 1. 导航栏:左侧图标,中间标题,右侧按钮(两端对齐) -->
<div class="nav">
<div class="nav-icon">←</div>
<div class="nav-title">首页</div>
<div class="nav-btn">我的</div>
</div>
<!-- 2. 卡片列表:一行2个卡片,自动换行,间距均匀 -->
<div class="card-list">
<div class="card">卡片1</div>
<div class="card">卡片2</div>
<div class="card">卡片3</div>
<div class="card">卡片4</div>
</div>
css
/* 1. 导航栏样式 */
.nav {
display: flex; /* 父容器设为Flex */
justify-content: space-between; /* 子元素两端对齐 */
align-items: center; /* 子元素垂直居中 */
height: 44px; /* 固定高度(符合移动端点击区域) */
padding: 0 15px;
background: #fff;
box-shadow: 0 1px 3px rgba(0,0,0,0.1);
}
/* 2. 卡片列表样式 */
.card-list {
display: flex;
flex-wrap: wrap; /* 子元素超出一行时自动换行 */
padding: 10px;
gap: 10px; /* 子元素之间的间距(替代margin,更简洁) */
}
.card {
flex: 1 1 calc(50% - 5px); /* 关键:子元素占比 */
/* flex: 增长因子 收缩因子 基础宽度 */
/* calc(50% - 5px):因为gap是10px,每个卡片需减去5px间隙 */
height: 120px;
background: #f5f5f5;
border-radius: 8px;
display: flex;
align-items: center;
justify-content: center;
}
优缺点
- 优点:灵活度极高,能轻松实现 "对齐、换行、占比分配";兼容性好(iOS 9+、Android 4.4 + 均支持,无需前缀);
- 缺点:需要理解 Flex 的核心属性(如
flex
的三个值),新手可能需要适应;无法直接实现 "不同屏幕尺寸下的布局结构变化"(需配合媒体查询)
方案 3:响应式布局(媒体查询)------PC + 移动端 "一套代码搞定"
如果需要 "同一套代码同时适配 PC、平板、手机",响应式布局是最佳选择。其核心是 "媒体查询(Media Query)"------ 根据屏幕宽度(或设备类型)编写不同的 CSS 样式。
原理
通过@media
规则,设置 "断点(Breakpoint)",当屏幕宽度满足断点条件时,加载对应的 CSS。常见断点参考:
- 手机:
max-width: 767px
; - 平板:
min-width: 768px and max-width: 1023px
; - PC:
min-width: 1024px
。
核心代码示例(三栏布局响应式变化)
html
<div class="container">
<div class="sidebar-left">左侧栏</div>
<div class="main-content">主内容</div>
<div class="sidebar-right">右侧栏</div>
</div>
css
/* 1. 基础样式(默认PC端:三栏布局) */
.container {
display: flex;
gap: 20px;
max-width: 1200px;
margin: 0 auto;
padding: 20px;
}
.sidebar-left {
width: 200px;
background: #f5f5f5;
}
.main-content {
flex: 1; /* 主内容占剩余宽度 */
background: #fff;
}
.sidebar-right {
width: 200px;
background: #f5f5f5;
}
/* 2. 平板断点(768px-1023px):隐藏右侧栏,左侧栏变窄 */
@media (max-width: 1023px) and (min-width: 768px) {
.sidebar-right {
display: none; /* 隐藏右侧栏 */
}
.sidebar-left {
width: 150px; /* 左侧栏变窄 */
}
}
/* 3. 手机断点(≤767px):隐藏左右侧栏,主内容全屏 */
@media (max-width: 767px) {
.container {
flex-direction: column; /* 垂直排列 */
gap: 10px;
}
.sidebar-left, .sidebar-right {
display: none; /* 隐藏两侧栏 */
}
.main-content {
width: 100%; /* 主内容全屏 */
}
}
优缺点
- 优点:一套代码适配多端,维护成本低;能根据屏幕尺寸灵活调整布局结构;
- 缺点:CSS 代码量增加(需写多套样式);调试成本高(需在不同设备上测试);不适合 "移动端与 PC 端差异极大" 的场景(此时建议分开写两套代码)。
方案 4:rem 适配 ------ 全局统一缩放的 "经典方案"
rem 适配的核心是 "通过 JS 动态调整根元素(html)的 font-size,让 rem 单位随视口宽度变化",从而实现全局元素的等比例缩放。
原理
- 设定一个 "基准视口宽度"(如 750px,常见的设计稿宽度);
- 计算 "根元素 font-size":
html.fontSize = (视口宽度 / 基准宽度) * 100px
(乘以 100 是为了简化计算,比如 750px 视口下,1rem=100px); - 开发时,将设计稿上的像素值除以 100,转化为 rem(如设计稿上按钮宽度是 100px,代码中写
width: 1rem
); - 当视口宽度变化时(如从 750px 变成 375px),JS 自动更新 html 的 font-size(375px 视口下,1rem=50px),所有用 rem 定义的元素都会自动缩放。
核心代码示例
html
<!-- 1. 在head中引入JS(先设置font-size,再加载CSS) -->
<script>
// 基准视口宽度(设计稿宽度)
const baseWidth = 750;
// 计算根元素font-size
function setRem() {
const viewportWidth = document.documentElement.clientWidth || window.innerWidth;
// 限制最大宽度(避免宽屏PC上元素过大)
const finalWidth = Math.min(viewportWidth, baseWidth);
// 公式:fontSize = (最终宽度 / 基准宽度) * 100px
document.documentElement.style.fontSize = (finalWidth / baseWidth) * 100 + 'px';
}
// 初始执行一次
setRem();
// 窗口 resize 时重新计算(如旋转屏幕)
window.addEventListener('resize', setRem);
</script>
<!-- 2. 页面内容 -->
<div class="btn">点击按钮</div>
<div class="banner">
<img src="banner.jpg" alt="banner">
</div>
css
/* CSS样式(所有尺寸用rem) */
.btn {
width: 1.8rem; /* 设计稿180px → 180/100=1.8rem */
height: 0.6rem; /* 设计稿60px → 0.6rem */
font-size: 0.28rem; /* 设计稿28px → 0.28rem */
background: #1890ff;
color: #fff;
border: none;
border-radius: 0.3rem;
}
.banner {
width: 7.5rem; /* 设计稿750px → 7.5rem */
height: 3rem; /* 设计稿300px → 3rem */
margin: 0 auto;
}
.banner img {
width: 100%;
height: 100%;
object-fit: cover; /* 保持图片比例,避免拉伸 */
}
优缺点
- 优点:全局元素等比例缩放,适配效果统一;开发时只需按设计稿像素值换算 rem,成本低;
- 缺点:高度也会随宽度缩放,可能导致在宽屏手机上 "内容过矮";需要依赖 JS(若 JS 加载失败,适配会失效,可加 CSS fallback)。
方案 5:vw/vh 适配 ------ 现代主流的 "纯 CSS 方案"
vw/vh 是 CSS3 新增的视口单位,也是目前大厂 H5 项目的主流适配方案之一。其核心优势是 "完全脱离 JS 依赖,纯 CSS 实现自适应",简单直观且易维护。
原理
- 1vw:等于视口宽度的 1%(如视口宽度为 375px 时,1vw=3.75px;视口宽度为 414px 时,1vw=4.14px);
- 1vh:等于视口高度的 1%(同理,视口高度为 667px 时,1vh=6.67px);
- 适配逻辑 :以设计稿宽度为基准,将设计稿上的像素值换算成 vw------ 换算公式为
目标vw值 = (设计稿像素值 / 设计稿宽度) * 100
(因为 100vw = 视口宽度,即设计稿宽度对应 100vw)。
核心代码示例(以 375px 设计稿为例)
假设设计稿宽度为 375px(主流移动端设计稿尺寸),设计稿上元素尺寸如下:
- 按钮宽度:100px,高度:40px;
- 文字大小:16px;
- Banner 图宽度:375px,高度:180px。
根据公式换算后,CSS 代码如下:
html
<!-- 必须先设置理想视口 -->
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- 页面内容 -->
<div class="btn">立即点击</div>
<div class="banner">
<img src="banner.jpg" alt="活动Banner">
</div>
css
/* 换算逻辑:设计稿375px → 100vw = 375px → 1px = 100vw/375 ≈ 0.2667vw */
.btn {
/* 宽度:100px → 100 * (100vw/375) ≈ 26.67vw */
width: 26.67vw;
/* 高度:40px → 40 * (100vw/375) ≈ 10.67vw */
height: 10.67vw;
/* 文字大小:16px → 16 * (100vw/375) ≈ 4.27vw */
font-size: 4.27vw;
background: #ff4400;
color: #fff;
border: none;
border-radius: 5.33vw; /* 圆角20px → 20*(100vw/375)≈5.33vw */
}
.banner {
/* 宽度:375px → 375*(100vw/375)=100vw */
width: 100vw;
/* 高度:180px → 180*(100vw/375)=48vw */
height: 48vw;
overflow: hidden;
}
.banner img {
width: 100%;
height: 100%;
object-fit: cover;
}
进阶优化:限制最大 / 最小尺寸
vw 单位会随视口宽度无限变化,在宽屏 PC 上可能导致元素过大(如按钮宽度超过 200px)。可通过max-width
/min-width
限制极端情况:
css
.btn {
width: 26.67vw;
max-width: 200px; /* 宽屏时按钮最大不超过200px */
min-width: 120px; /* 窄屏时按钮最小不小于120px */
height: 10.67vw;
max-height: 60px;
min-height: 36px;
}
.banner {
width: 100vw;
max-width: 750px; /* 宽屏时Banner最大不超过750px */
height: 48vw;
max-height: 360px;
margin: 0 auto; /* 超出后水平居中 */
}
优缺点
- 优点:纯 CSS 实现,无需依赖 JS(避免 JS 加载失败导致的适配失效);计算逻辑简单,开发效率高;适配效果灵活,能随视口实时变化;目前兼容性极佳(iOS 8+、Android 4.4 + 均支持),是大厂 H5 首选方案之一;
- 缺点:高度用 vh 时可能受屏幕旋转影响(如竖屏 180px 对应 27vh,横屏时高度骤减),建议高度优先用 vw 或固定值;宽屏 PC 上需额外限制最大尺寸,否则元素可能过大。
方案 6:PostCSS 自动化适配 ------ 解放手动计算的 "效率神器"
无论是 rem 还是 vw 适配,手动将设计稿的 px 换算成 rem/vw 都很繁琐(如 100px→26.67vw)。PostCSS 通过插件可实现 "写 px 自动转 rem/vw",彻底解放手动计算,大幅提升开发体验。
原理
PostCSS 是一个 CSS 处理工具,通过插件生态实现自动化转换:
- postcss-px-to-viewport:将 CSS 中的 px 自动转换为 vw(适配 vw 方案);
- postcss-pxtorem:将 CSS 中的 px 自动转换为 rem(适配 rem 方案);
- 配置时只需指定 "设计稿宽度",插件会自动按换算公式处理 px 值,无需手动计算。
🔥 移动端适配还在手动算 rem?这套 "自动换算" 方案告别加班
可以参考这篇文章
优缺点
- 优点:彻底消除手动换算成本,开发时直接写 px,降低出错概率;配置一次即可全局生效,团队协作时风格统一;支持黑名单配置,灵活处理 "不需要转换的元素"(如固定尺寸的图标);
- 缺点:需要额外配置 PostCSS 环境;若设计稿宽度变更,需同步修改配置(如从 375px 改为 750px)。
🐞移动端适配的常见问题与解决方案
即使掌握了基础方案,实际开发中仍会遇到各种 "坑",这里整理了一些高频问题及解决方案:
1px 边框问题:为什么 CSS 写 1px,手机上显示变粗?
问题原因
高 DPR 屏幕(如 DPR=2 的 Retina 屏)下,1 个逻辑像素 = 2 个物理像素,CSS 的border: 1px
会被渲染成 2 个物理像素的宽度,视觉上变粗。
-
方法 1:transform 缩放(推荐)
通过伪元素设置 2px 边框,再用
transform: scale(0.5)
缩放到 1px:css.border-1px { position: relative; border: none; /* 清除默认边框 */ } .border-1px::after { content: ''; position: absolute; left: 0; bottom: 0; width: 100%; height: 2px; /* 先设2px */ background: #eee; transform: scaleY(0.5); /* 垂直方向缩放到0.5倍 → 1px */ transform-origin: bottom left; /* 缩放原点在左下角,避免偏移 */ }
-
方法 2:viewport 缩放(适合整体适配)
通过 JS 动态设置 viewport 的
initial-scale
为1/DPR
,让 1px 逻辑像素 = 1 个物理像素:html<meta name="viewport" id="viewportMeta"> <script> const dpr = window.devicePixelRatio || 1; const viewportMeta = document.getElementById('viewportMeta'); viewportMeta.content = `width=device-width, initial-scale=${1/dpr}, maximum-scale=${1/dpr}`; </script>
-
方法 3:box-shadow 模拟
用
box-shadow
的模糊效果模拟细边框(适合简单场景):css.border-1px { box-shadow: 0 1px 1px -1px rgba(0,0,0,0.1); }
图片适配:如何避免图片模糊、拉伸?
问题原因
- 图片分辨率过低,在高 DPR 屏幕上被拉伸,导致模糊;
- 图片尺寸固定,在不同视口宽度下超出容器或留白。
解决方案
-
方案 1:使用 srcset + sizes 属性(自动加载合适分辨率的图片)
让浏览器根据设备 DPR 和视口宽度,自动选择加载高 / 低分辨率图片:
html<img src="banner-750w.jpg" <!-- 默认加载的低清图 --> srcset="banner-750w.jpg 1x, banner-1500w.jpg 2x" <!-- 1x对应DPR=1,2x对应DPR=2 --> sizes="100vw" <!-- 图片显示宽度为视口宽度的100% --> alt="banner" >
注:
banner-750w.jpg
是 750px 宽的图(适合 DPR=1),banner-1500w.jpg
是 1500px 宽的图(适合 DPR=2)。 -
方案 2:使用 object-fit 属性(控制图片填充方式)
当图片比例与容器比例不一致时,用
object-fit
避免拉伸:css.img-container { width: 100%; height: 200px; /* 固定容器高度 */ overflow: hidden; } .img-container img { width: 100%; height: 100%; object-fit: cover; /* 保持图片比例,裁剪超出部分(常用) */ /* object-fit: contain; 保持比例,显示完整图片(可能留白) */ }
横屏适配:如何处理手机旋转后的布局?
问题原因
手机从竖屏旋转到横屏时,视口宽度变大,原有的布局可能出现 "内容过宽" 或 "留白过多"。
解决方案
-
方法 1:媒体查询检测横屏
通过
orientation: landscape
(横屏)/portrait
(竖屏)编写不同样式:css/* 竖屏样式 */ .card { width: 100%; margin-bottom: 10px; } /* 横屏样式 */ @media (orientation: landscape) { .card { width: 48%; /* 横屏时一行2个卡片 */ float: left; margin-right: 2%; } }
-
方法 2:禁止横屏(特殊场景)
通过 meta 标签或 JS 禁止手机旋转:
html<!-- iOS禁止横屏 --> <meta name="apple-mobile-web-app-capable" content="yes"> <meta name="apple-mobile-web-app-status-bar-style" content="black"> <!-- JS禁止横屏(兼容安卓) --> <script> window.addEventListener('orientationchange', function() { const orientation = window.orientation; if (orientation === 90 || orientation === -90) { alert('请使用竖屏浏览'); // 可选:强制旋转屏幕(需配合CSS transform) } }); </script>
输入框被键盘遮挡
原因:手机软键盘弹出时,会压缩视口高度,导致输入框被遮挡。
-
监听
resize
事件,当视口高度变小时,滚动页面让输入框显示在可视区域:javascript// 监听输入框聚焦事件 document.querySelector('input').addEventListener('focus', function() { // 延迟滚动,等待键盘弹出 setTimeout(() => { this.scrollIntoView({ behavior: 'smooth', block: 'center' }); }, 300); });
-
用
position: fixed
固定输入框在底部,键盘弹出时会自动上推。
移动端开发中,flex 布局常用的属性有哪些?请举例说明其用法。
flex 布局常用属性分为父容器属性和子元素属性:
-
父容器属性:
display: flex
:开启弹性布局;justify-content: center
:子元素水平居中;align-items: center
:子元素垂直居中;flex-direction: column
:子元素垂直排列(默认水平排列)。
-
子元素属性:
flex: 1
:子元素占满父容器剩余空间(比如导航栏中间标题);flex-shrink: 0
:子元素不缩小(避免被挤压);align-self: flex-end
:单个子元素垂直对齐(覆盖父容器的align-items
)。
示例:导航栏布局(左侧返回、中间标题、右侧更多):
css
.nav {
display: flex;
justify-content: space-between;
align-items: center;
height: 50px;
}
.nav-title {
flex: 1; /* 占满中间空间 */
text-align: center;
}
总结:移动端适配的核心原则与方案选型建议
1. 核心原则
- 优先选纯 CSS 方案:vw/vh 适配无需依赖 JS,兼容性满足现代项目需求,是首选;
- 自动化工具必用:PostCSS 能大幅提升开发效率,避免手动计算错误,无论 rem 还是 vw 方案都建议配置;
- 细节决定体验:1px 边框、图片清晰度、按钮点击区域(≥44×44px)、宽屏限制,这些细节直接影响用户留存;
- 按需选型:没有 "万能方案",需根据项目场景(兼容性要求、多端需求、开发效率)选择最合适的方案。
2. 方案选型建议
项目场景 | 推荐方案 | 理由 |
---|---|---|
现代 H5 活动页、营销页 | vw/vh + PostCSS | 纯 CSS 适配,开发快,无需 JS,适合快速迭代; |
电商详情页、复杂表单 | rem + PostCSS | 可通过 JS 精确控制缩放范围,避免宽屏元素过大; |
PC + 移动端一套代码(如企业官网) | 响应式布局(媒体查询)+ Flex | 一套代码适配多端,维护成本低; |
简单静态页(如个人博客) | 流式布局 + Flex | 实现简单,无需复杂配置; |
团队协作项目 | 任意方案 + PostCSS | 自动化工具统一转换规则,避免风格混乱。 |
移动端适配不是 "一次性工作",随着设备更新(如折叠屏手机),适配方案也会不断演进。但只要掌握了核心概念(Viewport、DPR、vw/rem)和自动化工具,就能轻松应对各种新场景。