屏幕适配方案完全指南

涵盖移动端(手机/平板)和 PC 端(桌面浏览器)的常见适配方案、 工程化实施方法及浏览器兼容性对照。


一、核心概念

概念

说明

逻辑像素(CSS px)

开发时使用的单位,不随设备缩放

物理像素(device pixel)

屏幕实际像素点

DPR(Device Pixel Ratio)

物理像素 / 逻辑像素。iPhone 15 为 3x,PC 为 1x

视口宽度(Viewport Width)

浏览器可视区域宽度

设计稿宽度

移动端通常 375px(iPhone SE)或 750px(@2x),PC 通常 1920px 或 1440px


二、移动端适配方案

方案 1:VW 方案(推荐)

原理:通过构建工具(postcss-px-to-viewport)自动将 CSS 中的 px 转换为 vw 单位,元素尺寸随视口宽度等比缩放。

计算公式元素 vw 值 = (设计稿中的 px / 设计稿宽度) × 100

例:设计稿 375px,元素 16px → 16 / 375 × 100 = 4.267vw

实施步骤

① 安装依赖

pnpm add -D postcss-px-to-viewport

② 配置 vite.config.js

import postcssPxToViewport from 'postcss-px-to-viewport'
​
export default defineConfig({
  css: {
    postcss: {
      plugins: [
        postcssPxToViewport({
          viewportWidth: 375,             // 设计稿宽度
          unitPrecision: 5,               // 转换精度
          viewportUnit: 'vw',             // 转换单位
          fontViewportUnit: 'vw',         // 字体单位
          selectorBlackList: ['.ignore'], // 忽略类名
          minPixelValue: 1,               // 1px 不转
          mediaQuery: false,              // 不转媒体查询内 px
          exclude: [/node_modules/],      // 排除 Vant
        }),
      ],
    },
  },
})

③ 容器约束(可选)

#app {
  min-width: 320px;   // 防止超窄屏过度挤压
  max-width: 480px;    // 防止特大屏变形
  margin: 0 auto;
}

④ 不需要转换的元素加 .ignore

<div class="ignore" style="border: 1px solid #eee">不转换</div>

浏览器兼容性

浏览器

版本要求

覆盖率

iOS Safari

6.1+ ✅

全球 > 97%

Android Chrome

31+ ✅

全球 > 97%

Android System WebView

4.4+ ✅

国内 > 95%

Chrome(PC)

31+ ✅

Firefox

31+ ✅

IE

10+ ✅

旧 Android 4.3-

❌ 不支持 vw

国内约 3-5%

降级方案:搭配 postcss-viewport-units 生成 px 回退值。

优缺点

优点

缺点

零侵入,开发直接写 px

vw 无上限,超大屏元素会过大

构建时自动转换,无运行时开销

1px 也会被转换(需配置 minPixelValue)

与 Vant 无冲突(已排除 node_modules)

不支持按比例缩放字号(需额外处理)


方案 2:Rem 方案(成熟稳定)

原理:通过 JS 动态设置 <html>font-size 为视口宽度的 1/10,CSS 使用 rem 单位,所有尺寸自动缩放。

计算公式html font-size = 屏幕宽度 / 10

375px → font-size: 37.5px → 元素 16px = 16 / 37.5 = 0.4267rem

实施步骤

① 安装依赖

pnpm add amfe-flexible
pnpm add -D postcss-pxtorem

② main.js 引入

import 'amfe-flexible'

③ 配置 vite.config.js

import postcssPxtorem from 'postcss-pxtorem'
​
export default defineConfig({
  css: {
    postcss: {
      plugins: [
        postcssPxtorem({
          rootValue: 37.5,           // 基准值(375 设计稿 / 10)
          propList: ['*'],           // 全部属性转换
          selectorBlackList: [],
          minPixelValue: 2,          // < 2px 不转
          exclude: [/node_modules/], // 排除 Vant
        }),
      ],
    },
  },
})

浏览器兼容性

浏览器

版本要求

覆盖率

iOS Safari

4.1+ ✅

> 99.5%

Android

2.1+ ✅

> 99.5%

Chrome

全系 ✅

Firefox

全系 ✅

IE

9+ ✅

全部现代浏览器

全部支持 ✅

⚠️ 注意

  • 部分浏览器有字体最小 12px 限制,可能影响 rem 基准

  • 与 Vant 冲突,必须 exclude 排除

  • 需监听 resize 事件更新 font-size(amfe-flexible 已实现)

优缺点

优点

缺点

兼容性极好,覆盖 99.5% 设备

引入 JS 运行时计算,轻微性能开销

可用于精准等比缩放

与第三方 UI 库(Vant)需额外处理

生态成熟,文档丰富

字体最小值限制可能影响布局


方案 3:CSS clamp() 函数

原理:使用 CSS 原生 clamp(MIN, PREFERRED, MAX) 函数为属性设置弹性范围值,无需构建工具。

/* font-size: 最小 14px,理想 3.5vw,最大 20px */
font-size: clamp(14px, 3.5vw, 20px);
​
/* padding: 最小 8px,理想 2vw,最大 24px */
padding: clamp(8px, 2vw, 24px);
​
/* 卡片宽度:灵活比例 */
width: clamp(280px, 45vw, 480px);

实施步骤

无需安装,直接在 CSS/Less 中使用即可。

① 定义全局常用 clamp 值

@font-body: clamp(13px, 3.5vw, 16px);
@font-title: clamp(18px, 5vw, 28px);
@spacing: clamp(8px, 2vw, 16px);

② 兼容降级

/* 不支持 clamp 的浏览器使用固定值兜底 */
font-size: 16px;
font-size: clamp(14px, 3.5vw, 20px);
​
/* 或用 @supports 判断 */
@supports (font-size: clamp(1px, 1vw, 2px)) {
  body { font-size: clamp(14px, 3.5vw, 20px); }
}

浏览器兼容性

浏览器

版本要求

覆盖率

iOS Safari

13.4+ ⚠️

~93% 全球

Android Chrome

79+ ⚠️

~85% 国内

Chrome

79+

Firefox

75+

Safari

13.1+

IE

❌ 全系不支持

国内覆盖率偏低

大量低版本 Android 不支持

优缺点

优点

缺点

原生 CSS,零构建依赖

兼容性相对较差(~93%)

可按需控制每个值的变化范围

每个属性需单独写 clamp,工程量大

不允许超大屏变形(有 max 兜底)

无法整体等比缩放

适合关键元素(字体/间距/卡片)

不适合全局替换 px


方案 4:媒体查询断点(修补方案)

原理:通过 @media 在不同的屏幕宽度下覆盖 CSS 值,仅用于修补边界。

/* 超小屏 */
@media (max-width: 320px) { ... }
​
/* 小屏手机 */
@media (min-width: 321px) and (max-width: 375px) { ... }
​
/* 大屏手机 / 小平板 */
@media (min-width: 376px) and (max-width: 480px) { ... }
​
/* 平板 */
@media (min-width: 481px) and (max-width: 768px) { ... }
​
/* 桌面 */
@media (min-width: 769px) { ... }

浏览器兼容性:CSS2.1 即支持,✅ 无兼容问题 但只能修修补补,无法根本解决适配问题。


方案 5:组合方案(生产推荐)

实际生产环境通常多种方案组合使用

视图层面:postcss-px-to-viewport(自动转 vw)
字体层面:clamp() 控制范围(不无限放大)
布局层面:Flex + 百分比(流动布局)
边界修补:媒体查询(处理极端情况)
大屏限制:max-width 容器约束

当前项目推荐配置

// vite.config.js
import postcssPxToViewport from 'postcss-px-to-viewport'
​
export default defineConfig({
  css: {
    postcss: {
      plugins: [
        postcssPxToViewport({
          viewportWidth: 375,
          exclude: [/node_modules/],
          minPixelValue: 1,
        }),
      ],
    },
  },
})
// main.less
#app {
  min-width: 320px;
  max-width: 480px;
  margin: 0 auto;
}
body {
  font-size: clamp(13px, 3.5vw, 17px);
}

三、PC 端适配方案

方案 1:固定宽度居中容器

最常见方案,内容区域固定宽度,两侧留白。

.container {
  width: 100%;
  max-width: 1200px;  /* 或 1440px */
  margin: 0 auto;
  padding: 0 20px;
}

工程化:无需构建插件,配合响应式栅格即可。 兼容性:✅ 所有浏览器


方案 2:百分比 + Flex 布局(响应式栅格)

.row { display: flex; flex-wrap: wrap; }
.col-3 { flex: 0 0 25%; max-width: 25%; }     /* 4 列 */
.col-4 { flex: 0 0 33.33%; max-width: 33.33%; } /* 3 列 */
​
/* 断点切换列数 */
@media (max-width: 768px) {
  .col-3 { flex: 0 0 50%; }    /* 平板 2 列 */
  .col-4 { flex: 0 0 100%; }   /* 手机 1 列 */
}

兼容性

  • ✅ iOS Safari 7.1+ / Android 4.4+ / Chrome 29+ / IE 11+

  • ⚠️ IE 10 部分支持(不支持 flex-wrap)

  • ❌ IE 9- 不支持


方案 3:CSS Grid 布局

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

一行代码实现响应式网格。

兼容性

  • ✅ iOS Safari 10.3+ / Android 61+ / Chrome 57+ / Firefox 52+

  • ⚠️ IE 10/11 部分支持(需 -ms- 前缀)


方案 4:容器查询(Container Queries)

基于父容器尺寸而非视口的响应式方案。

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

兼容性

  • ⚠️ Chrome 105+ / Safari 16+ / Firefox 110+

  • ❌ IE 全系不支持

  • 全球覆盖率约 78%


四、各方案兼容性对比总表

方案

iOS

Android

Chrome

Safari

Firefox

IE

全球覆盖

国内覆盖

VW

6.1+ ✅

4.4+ ✅

31+ ✅

6.1+ ✅

31+ ✅

10+ ✅

>97%

>95%

Rem

4.1+ ✅

2.1+ ✅

全系 ✅

4.1+ ✅

全系 ✅

9+ ✅

>99.5%

>99%

clamp()

13.4+ ⚠️

79+ ⚠️

79+ ⚠️

13.1+ ⚠️

75+ ⚠️

~93%

~85%

Flex

7.1+ ✅

4.4+ ✅

29+ ✅

7.1+ ✅

28+ ✅

11+ ✅

>98%

>96%

Grid

10.3+ ✅

61+ ✅

57+ ✅

10.3+ ✅

52+ ✅

16 ⚠️

>97%

>95%

Container Q

16+ ⚠️

105+ ⚠️

105+ ⚠️

16+ ⚠️

110+ ⚠️

~78%

~65%

媒体查询

全系 ✅

全系 ✅

全系 ✅

全系 ✅

全系 ✅

9+ ✅

100%

100%


五、工程化实施清单

事项

说明

优先级

确定设计稿宽度

移动端 375px 或 750px,PC 端 1920px 或 1440px

必需

安装构建插件

根据方案选择 postcss-px-to-viewport / postcss-pxtorem

必需

配置 viewport meta

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

必需

排除 node_modules

避免转换第三方 UI 库(Vant / Element Plus)

必需

1px 不转换

配置 minPixelValue: 1selectorBlackList

推荐

根容器约束

min-width 防止超窄屏,max-width 防止大屏溢出

推荐

字体范围控制

clamp() 限制字体不无限放大/缩小

推荐

大屏断点适配

768px+ / 1200px+ 单独处理布局

可选

降级方案

不支持的浏览器使用 px 回退

可选

测试设备列表

iPhone SE / iPhone 15 / 主流 Android / iPad / PC 浏览器

推荐


六、调试方法

  1. Chrome DevTools 移动端模拟Ctrl+Shift+M 切换设备工具栏

  2. 响应式模式:在 DevTools 中拖拽边角测试不同宽度

  3. 真机测试:局域网访问 dev server,在不同真机上验证

  4. 常用测试宽度

宽度

设备

说明

320px

iPhone SE / 小屏 Android

极限窄屏

375px

iPhone 标准宽度

最常用宽度

390px

iPhone 15 标准

新机型

414px

iPhone Plus / 大屏手机

大屏手机

768px

iPad 竖屏

平板起点

1024px

iPad 横屏 / 小屏笔记本

平板/小屏 PC

1440px+

大屏桌面

PC 端标准


七、方案选择建议

项目类型

推荐方案

原因

移动端 H5(使用 Vant/NutUI)

VW + clamp + 容器约束

零侵入,自动转 vw,字体用 clamp 控制范围

移动端 H5(自定义 UI)

Rem + amfe-flexible

全量等比缩放,兼容性最好

PC 后台管理

固定宽度居中 + Flex 栅格

不需要等比缩放,只需合理布局

PC 端营销页

百分比 + 媒体查询断点

品牌展示,各设备体验一致

跨端(移动+PC)

VW + 最大宽度约束 + 断点

兼顾两端

纯内容型网站

CSS clamp() + Flex

简单轻量,无需构建插件


屏幕适配方案完全指南
https://halo.demox.asia/archives/screnn-adapter
作者
你的降灵
发布于
2026年06月27日
许可协议