为什么getComputedStyle不能使用伪类,例如:hover?

las*_*hou 11 javascript dom css-selectors

window.getComputedStyle根据文档,该函数应该能够获得计算的伪类样式,如:hover .

它也被解释为另一个问题的答案

但正如最后一条评论在该问题中所说的那样,事实上它根本不起作用,它只返回正常的风格,而不是:悬停风格.你可以在这个jsfiddle中看到自己.警报返回红色,而不是绿色.

developer.mozilla.org上文档也有一个例子,但这也不起作用 - 见这里.

这个问题中,回答者在评论中指出它根本不起作用,但没有给出解释.

可能是在函数返回正确的值之前必须完全呈现样式表吗?我试过设置一些延迟,但似乎没有任何工作.

我尝试过最新的Firefox,Chrome和IE浏览器.有人知道为什么这个功能没有按预期工作吗?

Zet*_*eta 13

var style = window.getComputedStyle(element[, pseudoElt]);
Run Code Online (Sandbox Code Playgroud)

其中pseudoElt"指定要匹配的伪元素的字符串".伪元素类似于::before或者::after,那些是由CSS样式生成的元素.:hover,:visited或其他类似的影响是pseuodo- .它们不会创建新元素,而是将专门的类样式应用于元素.

获取伪类的计算样式是不可能的,至少不能getComputedStyle.然而,您可以遍历CSS规则并尝试找到合适的选择器,但我不建议您这样做,因为某些浏览器不会遵循DOM-Level-2-Style规则而您必须检查哪个规则会影响您的具体元素:

/* Style */
p a:hover{ color:yellow; background:black;}
p > a:hover{ color:green; background:white;}
p > a+a:hover{ color:fuchsia; background:blue;}
Run Code Online (Sandbox Code Playgroud)
// JS
var i,j, sel = /a:hover/;
for(i = 0; i < document.styleSheets.length; ++i){
    for(j = 0; j < document.styleSheets[i].cssRules.length; ++j){    
        if(sel.test(document.styleSheets[i].cssRules[j].selectorText)){
            console.log(
                document.styleSheets[i].cssRules[j].selectorText,
                document.styleSheets[i].cssRules[j].style.cssText
            );
        }
    }
}
Run Code Online (Sandbox Code Playgroud)
Result:
p a:hover color: yellow; background: none repeat scroll 0% 0% black; 
p > a:hover color: green; background: none repeat scroll 0% 0% white;
p > a + a:hover color: fuchsia; background: none repeat scroll 0% 0% blue;

也可以看看:

  • `document.styleSheets [].cssRules`不适用于从外部源加载的样式表(即`<link>`) (3认同)