为什么hover会在CSS中的相应标签上触发输入?

时间:2012-02-01 15:34:53

标签: html css firefox css-selectors webkit

我是否遗漏了某些内容,或者此示例的行为 - http://dabblet.com/result/gist/1716833 - 在Webkits / Fx中是否相当奇怪?

有一个带标签的输入和以下选择器:

input:hover + .target {
    background: red;
}

当您将label附加到input,而不仅仅是input本身时,会触发此样式。更多:labelforinput包裹在label之间存在差异 - 如果您首先悬停input,然后将光标直接移动到.target - 奇怪的悬停不会在包装版本中触发。

这只能在Firefox和Safari / Chrome中重现,但在Opera中没问题。

所以,问题是:如果在规范的某个地方描述了这个问题?我找不到任何适当的地方来描述它并说明哪种行为是对的。

1 个答案:

答案 0 :(得分:11)

现在在HTML规范中;直到将October 2012 WD添加到W3C HTML5(强调我的)之后才开始:

  

:hover伪类被定义为匹配元素"而用户指定具有指点设备的元素"。出于仅定义:hover伪类的目的,HTML用户代理必须将元素视为用户指定的元素,如果它是:

     
      
  • 用户使用指点设备指示的元素。

  •   
  • 具有用户使用指点设备指示的后代的元素。

  •   
  • 一个元素,它是当前匹配的label元素的标记控件:悬停。

  •   

同一文字显示在living spec


我几年前在我网站的联系表单的先前设计中发现了这种行为,其中label:hover也在任何表单输入元素上触发:hover,该元素是其后代或由for属性引用。

此行为实际上已添加到this bug reportthis (rather short) mailing list thread的最新Gecko版本(Firefox' s布局引擎)中,并且已在WebKit many years back中实现。如你所知,这种行为在Opera中并没有重现;看起来Opera Software和微软都没有收到备忘录。

我可以在规范中找到 与此行为有关的内容here,但我不确定(我用斜体字注释):

  
      
  • 当用户使用指点设备指定元素时,:hover伪类适用,但不一定要激活它。例如,当光标(鼠标指针)悬停在元素生成的框上时,可视用户代理可以应用此伪类。
  •   
     

[...]

     

选择器不定义“:active”或“:hover”元素的父级是否也处于该状态。 [它似乎也没有为元素的子元素定义相同的内容。]

     
    

注意:如果“:hover”状态适用于某个元素,因为其子项是由定位设备指定的,那么“:hover可能'应用于不在指针设备下面的元素。

  

但我可以得出的结论是,这种行为至少是Gecko和WebKit的设计。


关于你在这里所说的内容:

  

更多:labelforinput包裹在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上时,只有第二条规则才能生效。