专题合集 · 浏览器兼容性
前端Wiki/专题合集/浏览器兼容性手册

浏览器兼容性手册

本页收录caniuse 中文版视角的浏览器兼容性全景:31 个关键特性的最低支持版本总表、渐进增强 / 优雅降级策略、@supports 特性检测、Polyfill 与 Babel 编译目标、Autoprefixer,以及 1px 边框、sticky 兼容等经典兼容问题的落地方案。数据截至 2026-11-05。

01特性兼容总表

下表汇总 31 个高频前端特性的最低支持版本,覆盖 Chrome、Edge、Firefox、Safari 与 iOS Safari 五端。单元格数字为该浏览器首个完整支持的版本;◐ 表示该版本起仅部分支持(脚注说明);✗ 表示从未支持。

特性ChromeEdgeFirefoxSafariiOS Safari
CSS Flexbox 布局29122899
CSS Grid 布局57165210.110.3
position: sticky56 ◐16 ◐32 ◐7.18
aspect-ratio 宽高比8888891515
容器查询 @container10610611016.016.0
:has() 选择器10510512115.415.4
CSS 自定义属性 var()4916311010
flex 中的 gap84846314.114.5
CSS color-mix()11111111316.216.2
inset 简写属性87876614.114.5
text-wrap: balance13013012117.517.5
<dialog> 元素37799815.415.4
details / summary12794966
picture / srcset 响应式图片3813389.19.3
WebP 图片格式32186516.014
AVIF 图片格式851219316.416.0
fetch API42143910.110.3
async / await5515521111
可选链 ?.80807413.113.4
空值合并 ??80807213.113.4
Array.prototype.at()92929015.415.4
structuredClone()98989415.415.4
IntersectionObserver51 ◐165512.112.2
ResizeObserver64796913.113.4
WebSocket16121176
Service Worker45174411.111.3
ESM import6116601111
import.meta6479621212
Web Components(Custom Elements v1)677963◐ 10.1◐ 10.1
CSS 原生嵌套12012011717.217.2
:is() / :where() 选择器8888781414
表注:◐ = 该版本起为部分支持——position: sticky 在 Chrome/Edge 56–90、Firefox 32–58 存在已知渲染 bug(如对 table 元素无效),完整支持分别为 91 / 91 / 59;IntersectionObserver 在 Chrome 51–57 为部分支持;Web Components 在 Safari 10.1 起支持 Custom Elements v1,但不支持 customized built-in elements(如 is="my-btn"),故记为 ◐。Flexbox 更早的带前缀版本(Chrome 21 / Safari 6.1 / iOS 7,需 -webkit-)未计入。数据来源:caniuse-lite 1.0.30001820(caniuse.com)与 MDN Web Docs,截至 2026-11-05;label 标签上的 ◐ 悬停可查看说明。
⏱ 如何读这张表
  • 以 iOS Safari 列为移动端底线:国内安卓内核常滞后 Chrome 1~2 年,可按目标用户机型倒推
  • Edge 12~18 为 EdgeHTML 内核(旧版),Edge 79+ 为 Chromium 内核,两段能力差距大;Edge 79+ 基本与 Chrome 同步
  • 「IE 全系 ✗」是 2026 年的常态:IE 11 已于 2022 年退役,除非合同明确要求,不必再以 IE 为目标做兼容
  • 版本只反映「能不能用」,不代表「没有 bug」:新特性前 1~2 个小版本常有实现差异,生产环境建议滞后一到档使用

02兼容策略

渐进增强 vs 优雅降级

这是应对兼容差距的两种方向相反的工程哲学。

对比维度渐进增强(Progressive Enhancement)优雅降级(Graceful Degradation)
出发点先保证所有浏览器可用的核心内容与功能,再向上叠加高级体验先按最新浏览器完整实现,再为旧浏览器打补丁、退化体验
实现顺序语义化 HTML → 基础 CSS → 增强布局 → 增强交互(JS)完整方案 → 缺失 API 时转降级分支或提示升级
典型手段@supports 特性检测、无 JS 的可用性、结构化降级样式polyfill 补齐 API、浏览器嗅探、功能开关回退
适用场景内容型站点、SEO 友好、面向广泛用户(如电商、资讯)工具型应用、内部系统、交互复杂且用户可控(如在线编辑器)
风险增强代码量随特性增加,需克制降级分支容易长期堆叠,维护成本高

实际项目中两者常组合使用:内容与核心链路渐进增强(弱网、旧设备也能完成主任务),辅助能力优雅降级(如不支持 container queries 时退回媒体查询布局)。

特性检测:@supports

与其猜测浏览器版本,不如直接问浏览器「你支持吗」。CSS 的 @supports 与 JS 的 CSS.supports() 是标准答案,比 UserAgent 嗅探可靠得多。

最小代码示例:CSS 与 JS 两种特性检测

/* CSS:仅当浏览器支持容器查询时才启用增强布局 */
@supports (container-type: inline-size) {
  .card { container-type: inline-size; }
  @container (min-width: 480px) {
    .card__body { display: grid; grid-template-columns: 1fr 2fr; }
  }
}
/* 不支持时整体降级为媒体查询方案 */
@media (min-width: 768px) {
  .card__body { display: grid; grid-template-columns: 1fr 2fr; }
}

// JS:运行时探测后再加载 polyfill 或走降级分支
if ('IntersectionObserver' in window) {
  const io = new IntersectionObserver(lazyLoad);
  io.observe(imgEl);
} else {
  // 不支持时直接用 loading="lazy" 或滚动事件兜底
  imgEl.loading = 'lazy';
}
if (window.structuredClone) { clone = structuredClone(obj) }
else { clone = JSON.parse(JSON.stringify(obj)) }

Polyfill 与 Babel 编译目标

特性检测决定「要不要补」,Polyfill 负责「补什么」,Babel 负责「把语法编译成目标浏览器能解析的形式」。两者分工:语法转译(箭头函数、可选链等)靠 Babel/SWC 编译,运行时 API 缺失(Promise、Array.prototype.at 等)靠 Polyfill 注入(见 Babel 与 Polyfill 词条)。

手段解决问题典型配置 / 说明
@babel/preset-env + targets按目标浏览器按需转译语法设置 targets: { chrome: '90', ios: '13' },编译器自动决定转译范围
core-js / polyfill补齐 Promise、Array.at、structuredClone 等运行时 API配合 useBuiltIns: 'usage' 只注入用到的 API,控制体积
browserslist统一声明目标浏览器范围> 0.5%, last 2 versions, not dead,Autoprefixer、Babel、ESLint 共用
动态 polyfill 服务避免全量打包按请求头 UA 返回所需 polyfill;也可配合模块隔离自行实现

最小代码示例:browserslist 与 Babel targets

// .browserslistrc(被 Babel、Autoprefixer、ESLint 共用)
> 0.5%
last 2 versions
not dead
not ie 11      // 明确放弃 IE

// babel.config.js
module.exports = {
  presets: [[
    '@babel/preset-env', {
      targets: { chrome: '90', firefox: '88', safari: '14', ios: '13' },
      useBuiltIns: 'usage',   // 按代码实际用到的 API 注入 core-js
      corejs: 3
    }
  ]]
};

Autoprefixer 与 CSS 兼容

CSS 的兼容成本主要在厂商前缀与属性命名差异。Autoprefixer 基于 browserslist 自动补齐 -webkit- / -moz- 等前缀,PostCSS 生态还能配合 PostCSS 插件把现代 CSS(如嵌套)降级编译,让书写体验与兼容性解耦(见 CSS 嵌套语法)。

/* 源码(只写标准语法) */
.sticky { position: sticky; top: 0; }

/* Autoprefixer 按 browserslist 自动输出: */
.sticky {
  position: -webkit-sticky;  /* Safari 6.1~13 需要 */
  position: sticky;
  top: 0;
}

浏览器市场份额说明

兼容目标不是「支持所有浏览器」,而是「覆盖目标用户的主流环境」。决策建议:

03经典兼容问题与方案

这些是兼容史上反复出现的问题。现代环境下多数已无需处理,但面试与存量项目维护中仍是高频考点。

问题兼容背景经典方案(旧写法)现代方案
半透明IE 8 不支持 rgba / opacity 会被子元素继承filter: alpha(opacity=50);或 PNG24 背景图 trick直接用 rgba() / opacity;毛玻璃用 backdrop-filter(Safari 需 -webkit-)
圆角IE 8 及以下不支持 border-radius-webkit-border-radius + border-radius: 0\9 或九宫格图片圆角直接写 border-radius;前缀由 Autoprefixer 处理
Flexbox 2009 旧语法IOS 6 / Android 4.4 以下只支持 display:-webkit-box三套写法并列:display:-webkit-box; display:-ms-flexbox; display:flex仅写 display:flex;参见 flex(现代设备全覆盖)
1px 边框过粗高 DPR 屏上 1px CSS 像素对应 2~3 物理像素transform: scaleY(0.5) 伪元素细边框;border-image 或 0.5px(iOS 8+ 支持)0.5px(Chrome 129+ / Safari 16.4+ 已稳定)或保留 scale 方案(兼容性最稳)
position: sticky 失效Safari 13 前需 -webkit-;IE 全系不支持加 position:-webkit-sticky;IE 用 JS 滚动监听模拟Autoprefixer 自动补前缀;详见 position: sticky
图片懒加载旧浏览器无 IntersectionObserverscroll 事件 + getBoundingClientRect 判断(配合 节流);或 IntersectionObserver + 降级原生 <img loading="lazy">(Chrome 76+ / Safari 15.4+),见 图片懒加载
移动端 300ms 点击延迟双击缩放检测导致FastClick 库 / touchstart 模拟设置 touch-action: manipulation 或现代浏览器已默认消除(viewport 含 width=device-width 时)
input 占位符样式旧版 IE / Safari 不支持 :placeholderJS 模拟占位文本(value + focus 判断)::placeholder 加 :-ms-input-placeholder(Autoprefixer 已覆盖)

04使用建议

数据说明:本表数据来源为 caniuse.com(caniuse-lite 1.0.30001820)与 MDN Web Docs,采集日期 2026-11-05。浏览器版本更迭较快,建议以 caniuse.com 实时数据为准。更多相关学习见 CSS3 教程目录、HTML5 教程目录、JavaScript 教程目录 与 词条大全。