我是否遗漏了某些内容,或者此示例的行为 - http://dabblet.com/result/gist/1716833 - 在Webkits / Fx中是否相当奇怪?
有一个带标签的输入和以下选择器:
input:hover + .target {
background: red;
}
当您将label
附加到input
,而不仅仅是input
本身时,会触发此样式。更多:label
与for
和input
包裹在label
之间存在差异 - 如果您首先悬停input
,然后将光标直接移动到.target
- 奇怪的悬停不会在包装版本中触发。
这只能在Firefox和Safari / Chrome中重现,但在Opera中没问题。
所以,问题是:如果在规范的某个地方描述了这个问题?我找不到任何适当的地方来描述它并说明哪种行为是对的。
答案 0 :(得分:11)
现在在HTML规范中;直到将October 2012 WD添加到W3C HTML5(强调我的)之后才开始:
:hover
伪类被定义为匹配元素"而用户指定具有指点设备的元素"。出于仅定义:hover
伪类的目的,HTML用户代理必须将元素视为用户指定的元素,如果它是:
用户使用指点设备指示的元素。
具有用户使用指点设备指示的后代的元素。
一个元素,它是当前匹配的
label
元素的标记控件:悬停。
同一文字显示在living spec。
中我几年前在我网站的联系表单的先前设计中发现了这种行为,其中label:hover
也在任何表单输入元素上触发:hover
,该元素是其后代或由for
属性引用。
此行为实际上已添加到this bug report中this (rather short) mailing list thread的最新Gecko版本(Firefox' s布局引擎)中,并且已在WebKit many years back中实现。如你所知,这种行为在Opera中并没有重现;看起来Opera Software和微软都没有收到备忘录。
我可以在规范中找到 与此行为有关的内容here,但我不确定(我用斜体字注释):
- 当用户使用指点设备指定元素时,
:hover
伪类适用,但不一定要激活它。例如,当光标(鼠标指针)悬停在元素生成的框上时,可视用户代理可以应用此伪类。[...]
选择器不定义“
:active
”或“:hover
”元素的父级是否也处于该状态。 [它似乎也没有为元素的子元素定义相同的内容。]注意:如果“
:hover
”状态适用于某个元素,因为其子项是由定位设备指定的,那么“:hover
可能'应用于不在指针设备下面的元素。
但我可以得出的结论是,这种行为至少是Gecko和WebKit的设计。
关于你在这里所说的内容:
更多:
label
与for
和input
包裹在label
之间存在差异 - 如果您将{{1}悬停首先,然后将光标直接移动到input
- 奇怪的悬停在包装版本中不会触发。
鉴于上述行为,这里留下的唯一可能性就是你只是被级联所困扰。
基本上,这个规则:
.target
比这条规则更具体:
/* 1 type, 1 pseudo-class, 1 class -> specificity = (0, 2, 1) */
input:hover + .target {
background: red;
}
因此,在适用的浏览器中,第一个复选框的/* 1 class, 1 pseudo-class -> specificity = (0, 2, 0) */
.target:hover {
background: lime;
}
在悬停时始终为红色,因为更具体的规则始终优先。第二个复选框后跟label.target
,因此不适用此行为;当光标位于span.target
上时,只有第二条规则才能生效。