你的想法行不通
条件语句的重点是在使用svg
背景定义filter
渐变以及旧版本 IE 的渐变时覆盖 IE9(例如,参见这个 SO question)。
要让 IE9svg
正确使用,需要将其设置为覆盖为早期版本设置的过滤器。这通常是通过使用 css 的级联来重置过滤器来完成的,因此为什么在定义渐变的原始 css 之后的条件注释中使用相同的选择器名称。后来的 IE9 css 将自动使用,因为它是相同的选择器,但在级联中稍后出现。
第二种方法是让 IE9 条件选择器比任何应用的梯度选择器具有更高的特异性。但是,由于您只是在 LESS 中使用各种选择器,这将是具有挑战性的,但并非无法克服。
那么为什么你的想法行不通
选择*
器具有0
特异性。它影响所有元素,但没有任何力量。因此它不能覆盖级联中的任何其他选择器,也不能通过蛮力覆盖。从本质上讲,在您的情况下,除了已经没有定义过滤器的集合元素之外,它不会做任何事情,从而为已定义的那些(包括您的渐变代码)filter: none
保留所有其他代码。filter
解决方法最有可能成功
由于您不想在具有渐变的各种元素上设置单个类(可能是处理它的最简单方法),而是处理由 LESS 生成的可能包含渐变的各种选择器,因此您将拥有通过扩展这些选择器的 CSS 来处理它。有多种方法可以做到这一点,其中一些可能仍然能够将其提供给条件,因此其他浏览器看不到它,但一个示例(所有浏览器都会选择)是计划在 IE9 中设置一个类html
,然后执行以下操作:
较少的
.someClass {
filter: gradientFilter;
.ie9resetFilter();
}
.someOtherClass {
filter: gradientFilter;
.ie9resetFilter();
}
.ie9resetFilter() {
html.ie9 & {
filter: none;
}
}
CSS 输出
.someClass {
filter: gradientFilter;
}
html.ie9 .someClass {
filter: none;
}
.someOtherClass {
filter: gradientFilter;
}
html.ie9 .someOtherClass {
filter: none;
}
如果您没有在 IE9 中对其他任何内容使用过滤器,那么...
如果您不关心为 IE9 覆盖过滤器调用的每个实例(无论它是什么类型的过滤器),那么您可以id
在html
orbody
元素上设置一个,并使用条件注释进行重载选择(使用事实“允许重复出现相同的简单选择器并且确实增加了特异性。”)。因此,假设您在id
上设置了“myID” body
,那么您可以在有条件的情况下执行此操作,以几乎保证覆盖任何filter
IE9:
<!--[if gte IE 9]>
<style type="text/css">
#myID#myID#myID#myID * { filter: none; } /* specificity is 400 */
</style>
<![endif]-->
我假设您的 LESS 中没有任何正常的选择器字符串,其特异性等于四个 id(无论如何我希望没有)。
这远非理想,但可以避免个别选择器覆盖。