structuredclone 在 safari ≤15.3、旧版 webview 等环境中不支持,会报 referenceerror;chrome 98+ 原生支持,ie 全系及低版本 electron 明确不支持,推荐运行时检测 + 场景化降级而非盲目引入 polyfill。

旧版浏览器(如 Safari ≤15.3、Chrome :is() 和 :where(),整条 CSS 规则会被直接丢弃——不是降级,是彻底忽略,连带后面的声明块也一并失效。
为什么整条规则被丢弃而不是部分生效
这两个伪类属于 CSS Selectors Level 4 规范,解析器遇到无法识别的伪类函数时,按标准必须将**整个选择器序列判为无效**。只要选择器里有一个非法 token(比如 :is()),整行规则就作废,浏览器不会尝试“跳过错误部分”再解析剩余合法内容。
- 现象:
:is(.btn, .btn-lg, )(末尾多逗号)、:where(.a::before)(含伪元素)、:is(:hover)(孤立伪类)都会触发整条规则失效 - 控制台通常只报模糊的
InvalidSelectorError或静默忽略,不标出具体哪一行、哪个字符错 - 特别注意 iOS 15.2 及更早 Safari:即使写了
@supports selector(:where(*)),也可能返回true但实际渲染失败
:is() 和 :where() 在旧内核里根本不会进入样式计算流程
它们不是“不支持某特性”,而是“语法层面不可解析”。CSS 引擎在 parse 阶段就卡住,后续 cascade、specificity、render 等环节根本不会启动。
-
:is()的权重逻辑(取内部最高权重)和:where()的零权重保证,都依赖现代解析器对函数式选择器的语义理解——老内核连函数调用结构都识别不了 - 像 360 浏览器、QQ 浏览器(基于旧 Trident/WebKit 分支)、IE11 等,连
@supports selector()都不支持,更别说执行其中的:is() - Electron 或 WebView 场景下,UA 字符串可能伪装成新版 Chrome,但内核仍是旧版,靠 UA 判断极易误判
如何安全降级而不破坏层叠顺序
手动拆解 :is() 或 :where() 时,权重变化会悄悄改写样式覆盖关系,这是最隐蔽的坑。
-
:is(.btn, .btn-primary, #submit)权重 =#submit的 (0-1-0);但手写成.btn, .btn-primary, #submit后,三者权重不同,#submit会压倒前两者 -
:where(.btn, #submit)权重恒为 0-0-0;拆解后若直接写.btn, #submit,权重变成 (0-0-1) 和 (0-1-0),反而可能覆盖已有规则 - 正确做法:
@supports selector(:is(*))包裹新写法,@supports not selector(:is(*))写降级规则,且两组声明块内容必须完全一致 - 兜底时若需零权重效果,得用
div .btn, div #submit这类低权重要素包裹,而非简单逗号分组
真正麻烦的不是语法报错,而是你检查 DOM 时发现样式“好像没加”,却查不到错误提示——它早已在解析阶段被静默吞掉,还顺手把本该生效的其他声明也拖下了水。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











