一开始就装懂,其实浏览器根本不吃这套语法。在Safari 15.4之前、Firefox 120及更早的版本,以及那些基于Chromium 105以下内核的Electron环境里,`:has()`这个选择器会被直接静默忽略。你甚至会在DevTools的Styles面板里找不到它的影子。更隐蔽的一个坑是

`或``这些行内元素设`width`。它们对`width`是免疫的。正确的做法是把文字包在一个块级容器里,比如` 侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述Safari 15.4到16.3里的兄弟选择器陷阱
如果你心血来潮,想用`.card:has(img + .text)`这种带兄弟选择器`+`的写法,在Safari 15.4到16.3之间大概率会吃瘪——它不会报错,但样式就是纹丝不动。最稳妥的方案,是放弃对兄弟关系的依赖,回归最简洁的结构:
* 确保``和文字容器是同级子元素。
* 用`.card:has(img) .text`这种直接后代选择器,兼容性最好。
* **绝对不要**嵌套`:has()`,比如`:has(:has(img))`,所有浏览器都一概不支持。
* 也不要把`:has()`规则包在`@media`或`@supports`里,旧版Safari会直接跳过。
真正容易被忽略的其实是DOM节点类型的干扰,比如注释、空白文本节点会让`:nth-child()`这类选择器定位偏移。但`:has(img)`不受这个影响,只要HTML里有个`
`标签,它就匹配。这一点,反而比那些依赖计数的选择器用法要鲁棒得多。