我一直在尝试使用javascript动态编写样式表。在Firefox中,可以在setProperty
cssRules
的样式上使用styleSheets
方法,例如......
document.styleSheets[0].cssRules[0].style
.setProperty(propertyName, propertyValue, 'important');
...在样式上设置!important
标志。我没有在Internet Explorer中找到相应的内容(setAttribute
方法没有在样式上设置!important
标志的选项。一些实验发现,对于确切的样式,例如border-top-width,
,我可以重写cssText
字符串以添加!important
,但后来我发现如果你单独设置所有边框,IE会重写实际规则是一个简写形式,因此它会重写为border-top
,border-right
等,每个都会被设置,但没有!important
标记。此外,如果我通过简写形式明确设置, 接受重写cssText
以获取!important
标记。
所以问题是,有没有人知道一种方法,当动态地将样式写入styleSheets
规则时,让IE一致地为该规则设置!important
标志?
感谢您的帮助,
斯科特
答案 0 :(得分:2)
我花了一些时间做一些测试,并得出结论,我重写cssText
正在努力添加{{1对IE的一些神秘的内部标志设置,即使!important
本身重写的缩短属性没有反映出来。
显然,cssText
属性(如果在重写之后检查以添加cssText
)和Microsoft Developer Toolbar对元素的检查都没有显示该属性具有{{{ 1}}设置它。但是,该元素显示为我的重写工作。我通过在图像边框的基本样式上放置!important
来测试它,如下所示:
!important
然后使用javascript我创建了我的styleSheets对象,并添加了一个更具体的规则(使用图像的!important
)并且已经在img {border: 3px solid green !important;}
之后用id
重写了cssText
通过!important
的javascript调用设置style
对象的styleSheets
。然后我设置元素的内联样式,将顶部颜色更改为黄色。结果与我期望的borderTopColor = red
标志一样。红色胜出,因为它是比原始绿色更晚(并且更具体)的调用,并且内联样式不会覆盖它。如果我删除!important
的重写,则颜色将恢复为绿色,如果我删除绿色!important
,则颜色将恢复为黄色。
我也用绿色测试了这个,选择器的特异性高于我对红色的javascript写风格。这也表现得像预期的那样,绿色赢了,因为它现在具有更高的选择器特异性与红色声明的竞争!important
。
这是在IE8,IE7和IE6上测试的(是的,它也在那里工作)。虽然重写/设置!important
的{{1}}并不像在属性上使用直接javascript调用设置它那么容易,但至少它可以正常工作。真正的'错误'是cssText
和开发人员工具栏都没有给我正确的信息,即在这些样式上设置了styleSheets
标志,所以如果有人落后并检查网站,他们可能会对为什么某些事情发生的风格感到困惑(为什么看似不重要的东西就好像它的表现一样)。
答案 1 :(得分:0)
我认为你最好的选择是编写你的css,这样你就不必使用!important来覆盖级联中的样式。它很糟糕,但这就是IE崩溃的原因。