好消息,各位!此错误已在 WebKit 浏览器 Safari(5.1)和 Chrome(13)的稳定版本中修复。
在 WebKit 中发现可靠的错误并不常见,在我看来,WebKit 在 CSS 质量支持方面处于领先地位。Alexander Futekov 通过电子邮件让我知道这个错误,我个人从未遇到过。
问题在于将相邻 (+) 或通用 (~) 兄弟选择器与伪类结合使用。 如下所示:
h1 ~ p { color: black; }
h1:hover ~ p { color: red; }
没什么问题,对吧? 似乎很简单。但在 WebKit 中不起作用,没有任何反应。有很多奇怪的特性可能会影响它并看似修复部分问题。 例如
/* This affects both paragraphs */
h1 ~ p { font: 18px Helvetica, Arial, Sans-Serif; }
/* This works */
h1:hover + p { color: red; }
/* This only affects first
... and does nothing without previous rule */
h1:hover ~ p { color: blue; }
我没有测试每一个,但显然所有伪选择器(:focus、:hover、:checked、:enabled 等)都存在问题。
仅使用 CSS 修复!
Alexander 还提供了一个巧妙的仅使用 CSS 的修复方案。在 body
上使用一个不执行任何操作的动画。
/* Warning: while this works, it may cause high CPU load */
<code class="lang-css prettyprint">body { -webkit-animation: bugfix infinite 1s; }
@-webkit-keyframes bugfix { from { padding: 0; } to { padding: 0; } }
针对 WebKit 独有问题的 WebKit 独有修复。 **温馨提示:**读者 Adam Ferguson 和 Simon Goellner 都写信告诉我,此修复程序直接导致他们正在处理的网站出现严重的 CPU 占用。
François Germain 还在 一个测试页面 上提出了一个修复方案。
记录详尽
这当然不是第一个关于此问题的报告。以下是一些错误报告
- bugs.webkit.org/show_bug.cgi?id=12520
- bugs.webkit.org/show_bug.cgi?id=17680
- bugs.webkit.org/show_bug.cgi?id=18026
- bugs.webkit.org/show_bug.cgi?id=18027
- bugs.webkit.org/show_bug.cgi?id=26539
- bugs.webkit.org/show_bug.cgi?id=29029
- bugs.webkit.org/show_bug.cgi?id=32695
- bugs.webkit.org/show_bug.cgi?id=45168
以及其他提及此问题的出版物
- 使用纯 CSS3 显示和隐藏内容,在 照顾老年人 部分
- 基于 CSS3 :target 的界面,在 蜘蛛和爬行动物的问题 部分
- dev.opera.com/forums/topic/600712 – 关于此错误的简短讨论
- 纯 CSS 可折叠树形菜单,在“另一个演示,另一个错误”部分
- 面包屑(和 CSS3 通用兄弟选择器),在“注意事项”部分
- CSS3 – 几乎是个好主意,但对于 Safari 和 Chrome 等所有浏览器来说,其中对 WebKit 浏览器因该错误而受到严厉批评。
- WebKit 错误:悬停和兄弟选择器,一篇关于此错误的文章,其中包含一些潜在的修复方案。
- Safari CSS :hover 和相邻兄弟选择器错误 – 另一篇关于此问题的博文
- Safari 错误报告:带有相邻选择器的悬停不起作用,Quirksmode 对该问题的看法。
嗯,有趣。我必须牢记这一点,因为我倾向于使用越来越多的不同选择器。
谢谢!
大约一个月前我遇到了同样的问题。它还会影响与堆叠的相邻兄弟选择器组合的动态伪选择器。例如,以下代码不起作用
/* 在 WebKit 中不起作用 */
h1:hover + p + p { color: red; }
我还注意到,在相邻兄弟选择器上使用 -webkit-transition 会导致 Chrome 冻结。但那是 Chrome 3 时的版本;即使选择器不起作用,冻结问题也可能消失了。我应该检查一下。
感谢分享 Alexander 的解决方案!
哇,我尝试过使用类似的东西来为 CSS 中的动画制作播放按钮,很高兴看到一个修复方案。
对我来说就像一个不错的教程.. 我以前从未深入到这种程度…
这个错误存在了很久,而且真的很烦人。我不知道有修复方案,不错!
但我强烈不同意 WebKit 中“CSS 质量支持”的说法,听到你这么说我真的很惊讶。在我看来,WebKit 擅长快速实施功能,但其方式存在极大的错误。Mozilla 和 Opera 通常具有更可靠的实现,但它们构建这些实现需要更长的时间。
写得很好的博文,而且我已经了解到,有些群体比其他群体更有倾向性(因为我们很多人都是不同的),会分享同样的想法。我希望你的博客能够正常运行。如果需要任何网页设计、开发、SEO、PPC 营销、软件开发相关工作,我已发布了一篇与你的博客相关的博文,请访问我们的网站 http://www.ukwebsitedesigncompany.co.uk
我讨厌人们这样做。如果我们都去你的博客上留下毫无意义的评论并链接回我们的网站,你会有什么感觉?
感谢发布此修复方案…
感谢添加我的文章 Chris – 我真的震惊于这在 -webkit 中不起作用。很高兴看到此问题的解决方案,但有人知道为什么此解决方法有效吗? 完全没有道理!
我知道!我当时也在想这个。
您好,
我很高兴有一个解决方法 – 这正是我要找的,而且有人做到了!但遗憾的是,四年后它仍然没有修复。
关于解决方法:CSS 的工作原理如下
1. 第一行引用要执行的动画;然后
2. 第二行指示不动画填充。
“bugfix”只是一个引用名称。
因此,我认为 WebKit 错误与 body 的填充有关,但仅在特定情况下。
不确定是否还有其他人想通透地思考这个问题,但我想知道
a) 我的滚动网站教程(第二个引用的网站)依赖于在固定定位元素内动画绝对定位的元素。这两个元素都包含在 body 内。如果未声明位置,则 body 的位置(static/relative/absolute)是什么,它的填充是什么?
b) 子元素的位置是否会影响祖父元素的填充?
尽管如此,很高兴看到一个解决方案。
我以前认为 ~ 仅影响 jQuery,而不是 CSS。
+、> 和 < 也可用于 CSS 吗?
对我来说更令人困惑的是,WebKit 似乎将 a:link 视为 a:link 和 a:visited。
很高兴知道为此有一个解决方法!
关于此技巧的电池寿命损耗方面是否有后续跟进?
请注意,此错误也存在于属性选择器 + 相邻选择器中,
即 .element[data-state=true]~div
幸运的是,提出的解决方案完美有效。