jQuery重新应用本机不支持的CSS规则(例如在IE中)

jQuery重新应用本机不支持的CSS规则(例如在IE中),jquery,css,internet-explorer,cross-browser,Jquery,Css,Internet Explorer,Cross Browser,IE8不支持(例如,但不是唯一支持):last child,因此我经常发现自己在做类似的事情: /* CSS */ element:last-child, element.last-child{ /* properties */ } /* jQuery */ $('element:last-child').addClass('last-child'); $('link[rel="stylesheet"]').each(function(){ $.reapplyStyleshe

IE8不支持(例如,但不是唯一支持)
:last child
,因此我经常发现自己在做类似的事情:

/* CSS */
element:last-child,
element.last-child{
    /* properties */
}

/* jQuery */
$('element:last-child').addClass('last-child');
$('link[rel="stylesheet"]').each(function(){
    $.reapplyStylesheet($(this).attr('href'));
});
既然jQuery提供了对本机不受支持的CSS选择器的支持,那么有没有一种方法可以简单地评估CSS样式表,并让jQuery(重新)应用样式,而不必求助于这种琐碎的元素分类

比如:

/* CSS */
element:last-child,
element.last-child{
    /* properties */
}

/* jQuery */
$('element:last-child').addClass('last-child');
$('link[rel="stylesheet"]').each(function(){
    $.reapplyStylesheet($(this).attr('href'));
});
注意:考虑到实现特定于浏览器的CSS的方法太多了,肯定还有另一种(也许更好)方法可以实现这一点,不过我还是很好奇。

selectivizr是一个JavaScript实用程序,它模拟Internet Explorer 6-8中的CSS3伪类和属性选择器。只需将脚本包含在页面中,其余部分由selectivizr完成


最简单的方法是使用垫片库,如


下面是一个列表。

任何解决方案都必须像您已经在幕后做的那样做。jQuery支持本机不受支持的选择器,方法是将它们分开,并使用选择器的每个部分执行一些DOM遍历—它不会让浏览器更“理解”:最后一个子项等

这种DOM遍历必然比让CSS引擎解析并应用额外的类慢得多,特别是在本例中您关心的浏览器中。新浏览器会有足够快的JS引擎,在很多情况下你都不会注意到这一点——但这些浏览器也支持CSS3选择器

另一个症结是浏览器的构建忽略了(甚至没有尝试解析)他们不理解的选择器的CSS规则。因此,您必须将样式表作为一个大文本块来处理,从而完成所有分析和重新应用程序—您将无法通过正常机制访问“已破坏”的规则

假设您有一个系统:

  • 查看所有选择器
  • 找出当前浏览器无法使用的内容
  • 然后将这些选择器重新构造为浏览器可以使用的格式
  • 然后重新写入样式表的各个部分以添加新的选择器
  • 然后将所需的任何钩子应用于HTML(可能会像通常那样添加类)
  • 我认为,这是你需要做你想做的事情的基础。在旧的浏览器中,它会非常慢。更好的方法是从DOM的角度来看待它,即自动添加您当前手动执行的类(.last child)等。

    是最佳选择之一。引用网站:

    “利用HTML5和CSS3的新功能可能意味着牺牲对旧浏览器体验的控制。无论访问者使用何种浏览器或设备,Modernizer 2都是您创建最佳网站和应用程序的起点。”

    使用人:推特、谷歌、微软等


    我相信微软甚至推出了MVC 3版本。

    我不相信Modernizer选择器。它主要关注于添加对新html5元素(section、nav等)的支持,感谢@Joseph Silber-我测试了这些建议,最终归结为selectivizr和Modernizer。虽然《现代化》似乎更全面,但selectivizr却一蹴而就。