混合 App 中 :is() 兼容性取决于 WebView 内核版本而非操作系统;iOS WKWebView 自 iOS 15.4 原生支持 :is(),Android 则因 WebView 碎片化需运行时检测或构建时降级为传统选择器。

在混合 App 开发中,:matches() 伪类(现已被 :is() 取代)的兼容性差异主要体现在 WebView 内核版本上,而非 iOS 或 Android 系统本身直接决定。iOS 所有 WebView 均基于 WKWebView,强制使用较新 WebKit 内核(iOS 15.4+ 已完整支持 :is(),但不支持已废弃的 :matches());Android 则高度依赖系统 WebView 版本,低版本(如 Android 7–9 默认 WebView 基于 Chromium 51–66)完全不识别 :matches() 或 :is(),部分机型甚至禁用或降级 WebView。
确认实际运行环境而非操作系统
不要按 #ifdef APP-ANDROID 或 #ifdef APP-IOS 粗粒度判断,而应检测运行时 WebView 的实际能力:
- 使用
if (CSS.supports('selector(:is(a, b))'))运行时检测支持性,比 UA 判断更可靠 - iOS 端无需额外 polyfill —— WKWebView 自 iOS 15.4 起原生支持
:is(),且 Apple 不允许降级内核 - Android 端需重点关注:华为 EMUI、小米 MIUI、旧版三星等常冻结 WebView 版本,可能长期停留在 Chromium 60 左右,
:is()和:matches()均不可用
统一降级为兼容写法
避免条件编译样式,改用工具链自动转换:
- 在构建流程中接入
postcss-selector-not或postcss-preset-env(配置stage: 3),将:is(.btn, .link)自动展开为.btn, .link - 禁用源码中
:matches()—— 它已在 CSS 规范中被正式移除,所有现代工具链不再处理,仅保留:is()作为标准替代 - 若必须动态生成选择器,用 JavaScript 拼接字符串代替伪类,例如:
element.classList.contains('btn') || element.classList.contains('link')
规避场景优先于修复
多数混合 App 场景中,:is() 并非不可替代,过度依赖反而增加兼容风险:
- 表单状态组合(如
:is(:focus, :hover))可拆为独立规则,或改用 class 控制(.state-focus/.state-hover) - 组件封装时,用 BEM 或 CSS-in-JS 动态绑定 class,比复杂选择器更可控、更易测试
- 对老 Android 设备(尤其 WebView
本质上这不是 iOS/Android 的“平台差异”,而是 WebView 内核碎片化问题。解决核心是放弃假设、实测内核能力,并把选择器逻辑从 CSS 层下沉到构建或 JS 层做收敛。


















