【问题标题】:Can !important rules be used in IE's CSS expressions?!important 规则可以用在 IE 的 CSS 表达式中吗?
【发布时间】:2010-12-07 08:02:54
【问题描述】:

首先,我知道 CSS 表达式在很多方面都已失效和错误,并且尽可能避免使用!important。这是special case stylesheet

简而言之

我的问题是...... CSS 表达式有没有办法设置!important 标志?

例如这不起作用:

a { color:expression('red !important'); }

[编辑:感谢 MarmaladeToday 下面的评论]。 这也不起作用:

a { color:expression('red') !important; }

这可以通过其他方式完成吗?


详细说明

我实际上想要做的是模仿 IE6 和 7 中的 inherit 值。这行得通

color:expression(
    this.parentNode.currentStyle ?
        this.parentNode.currentStyle.color: 'red'
    );

但我也想设置!important 标志,而这不起作用

color:expression(
  (
    this.parentNode.currentStyle ?
        this.parentNode.currentStyle.color: 'red'
  ) + ' !important');

我知道,在 JavaScript 中,无法通过元素的 style 对象设置 !important。例如。 这行不通

element.style.color = 'red !important';

但是,可以通过元素的style 设置!important 属性

element.setAttribute('style', 'color:red !important;');

所以... CSS 表达式是否仅限于与 style 对象交互,因此,我想要实现的目标是不可能的 - 或者表达式有什么方法可以影响元素的属性,或者传递 !important以其他方式?


开始赏金

到目前为止还没有可靠的答案,所以我开始赏金了。

理想情况下,我正在寻找一种基于 CSS 的解决方案,用于在 IE6 和 IE7 中模拟 inherit !important,无论是否使用 CSS 表达式。 (请在发布之前验证您的建议是否有效)。

至少,一些权威参考的链接告诉我这是不可能的,这意味着我可以放下这个思路——我还没有看到任何提到使用 !important 规则的 CSS 表达式。

【问题讨论】:

  • 不知道这个问题在doctype.com 会不会更好?
  • @artlung - 为什么?到目前为止,我对 doctype.com 没有任何经验,但似乎以 HTML/CSS 为重点。您认为这是一个过于技术性的问题吗?

标签: javascript css internet-explorer inheritance css-expressions


【解决方案1】:

color:expression('red') !important;

【讨论】:

  • 对不起 - 我的意思是在原始描述中包含它。不,这也不起作用。
  • 我以为我有,但没有。认为尝试明显值得,因为它经常被忽视。你有没有看到这个:meyerweb.com/eric/thoughts/2007/04/23/inherit-expression-for-ie 可能是值得深思的。烦人我不能在这里评论其他答案.... Nate 几乎是正确的,因为 IE6 有时无法识别 !important 显然,这是它曾经被用作黑客的原因之一。但我想它是用于覆盖您的特殊情况样式表的实例。
  • 是的,Eric Meyer 的帖子是让我们开始使用表达式作为摆脱继承漏洞的一种可能方式之一 - 但看起来也许它们毕竟可以拯救我们。
【解决方案2】:

据我了解, !important 近来主要是一种黑客行为...特别是因为 IE 无法识别它。

【讨论】:

  • 嗨内特。不,!important 不是黑客。它主要设计用于在用户样式表中覆盖页面上的指定样式。 IE6+ 也支持它,尽管在 IE6 中存在一个错误,如果规则块包含具有!important 的特定属性,然后在没有!important 的同一块中设置相同的属性,则后者将占上风。毫无疑问,IE 也有一些其他奇怪的错误,但基本上它是有效的。我遇到的问题是 IE6 和 IE7 不能正确支持 inherit 值。
  • 很明显在 CSS2 规范中很重要:w3.org/TR/CSS2/cascade.html#important-rules
【解决方案3】:

这听起来很恶心,但是:

color: expression((function (_this) {
    window.setTimeout(function () {
        _this.setAttribute("style", "color:" +
            (_this.parentNode.currentStyle ?
                _this.parentNode.currentStyle.color : 'red') + " !important";
    }, 0);
    return _this.parentNode.currentStyle ?
        _this.parentNode.currentStyle.color : 'red';
})(this));

换句话说,这个:

  1. 立即返回"red"(或父颜色)。
  2. 设置一个超时,该超时将在之后立即设置"red !important"(或其他)。

请记住,这最终可能会占用您的浏览器。我没有测试它,涉及 CSS 表达式的东西往往会出错。

【讨论】:

  • 感谢安东尼的建议。出于兴趣,你为什么使用setTimout,而不是直接调用setAttribute?我们之前尝试过setAttribute,但没有尝试过setTimeout。不过,这两种方法似乎都行不通。该属性未设置且 !important 未应用。
【解决方案4】:

你可以试试the behavior property,它比表达式更通用。

试试这个,

继承.htc:

<SCRIPT language="JScript">
    //add your own inheritance logic here, you can use element.parentNode etc.
    var prop = element.currentStyle.behaviorProp;//specified in stylesheet
    var val = element.currentStyle.behaviorValue;//specified in stylesheet
    element.style[prop] = val;//set as inline style, you can also use setAttribute here.
</SCRIPT>

css:

body #div1 {
    color:blue;
}

#div1 {
    color:red;/*stays blue, because 'body #div1' is more specific*/
    behaviorProp:color;/*specify styleproperty for the .htc*/
    behaviorValue:green;/*WILL become green, because the .htc sets it as an inline style, which has priority.*/
    behavior:url(inherit.htc);
}

【讨论】:

  • 感谢您提供此示例,Vatos。看起来这对我们有用。使用behavior 会有点笨拙和专有,并且需要一个额外的.htc 文件,但它确实比标准 JavaScript 具有优势,它可以从 CSS 样式表中调用,因此它不需要用户我们的样式表必须添加一个 &lt;script&gt; 元素到页面,只是为了支持 IE6 和 7。
【解决方案5】:

quirksmode 的古老 ppk 在 CSS、JavaScript 和 !important 关键字方面做了一些工作。 (请注意,在 Firefox 或任何其他非 IE 浏览器中进行测试时,请使用cssRules 而不是下面的rules

这是链接:W3C DOM Compatibility

您显然可以通过这样做来阅读样式表中的样式规则是否重要(这将获得第二个样式表中第二个 css 规则中颜色属性的重要性级别,在所有浏览器中,除了 MICROSOFT INTERNET EXPLORER . 真是个无赖。

document.styleSheets[1].rules[1].style.getPropertyPriority('color')
//Returns important when the style is marked !important.
//Returns an empty string otherwise.

现在,他的研究揭示了另一种设置 !important 的方法,不幸的是,这显然也只适用于非 Internet Explorer 浏览器

// where x is a DOM element
x.style.setProperty('color','#00cc00','!important');
// Set the color of x or the second rule in the second style sheet to green.
document.styleSheets[1].rules[1].style.setProperty('color','#00cc00','!important');

显然这种奇怪的语法,如果你不设置为!important,需要将第三个参数设置为null

// where x is a DOM element
x.style.setProperty('color','#00cc00',null);
// Set the color of x or the second rule in the second style sheet to green.
document.styleSheets[1].rules[1].style.setProperty('color','#00cc00',null);

现在,MSDN 有一个名为“cssText”的属性,它悬挂在 DOM 元素的 style 对象上。它甚至表明 CSS 表达式是可以的。用法是:

x.style.cssText = 'color: #00cc00 !important';

现在,这可能很重要(呵呵),MSDN 页面说(强调我的):

可以使用 DHTML 表达式代替前面的值。 如 Internet Explorer 8 的表达式 在 IE8 模式下不支持。为了 更多信息,请参阅About Dynamic Properties

也值得一试ppk's tests of cssText

很遗憾,这台笔记本电脑上没有可用的 Windows Microsoft Internet Explorer 的相关版本,但也许这有点用处。我很好奇这是如何摆脱的,这是我遇到的问题(在 JavaScript 中设置 !important)但找到了其他方法来解决它,通常只是在类中移动或通过在相关选择器中使用 ID 来应用特异性.

祝你有个有趣的问题好运!

【讨论】:

  • 嗨,artlung。非常感谢这个周到的回答。您描述的是一种通过 JavaScript 与 !important 规则交互的方式。实际上,这可以通过在元素上设置style 属性来完成,正如我在问题中提到的那样 - 就像这样:element.setAttribute('style', 'color:red !important;');。不过,我正在寻找的是一种从 CSS 样式表中设置 !important 的方法。
【解决方案6】:

这些 CSS 表达式不起作用的原因是 IE 只计算级联中最后一个属性的表达式。

例如如果你有一个 HTML 文档,里面有一个链接和下面的“CSS”,

a {
    color: expression(function(e){
        alert('success');
        e.runtimeStyle.color = 'blue';
    }(this));
}
a { color: red; }

您将永远不会看到该警报(更不用说样式更改),因为从未计算过 CSS 表达式。所以不,您不能使用表达式来设置 !important 标志。

也就是说,不是当您尝试将其设置在同一属性上时。你可以作弊。但这确实让表达式有点复杂:

a {
    filter: expression(function(e){
        e.runtimeStyle.color = 'blue';
        alert('success');
        e.style.filter = '';
    }(this));
}
a { color: red; }

这里有几点需要注意。

如果您只是使用另一个 CSS 属性,则可以确定表达式 被计算。或者至少,更确定一点,因为如果在级联的更下方有另一个规则已经使用相同的属性,那么你仍然不走运。

其次,您必须使用runtimeStyle 而不是currentStyle。如果你在这里使用currentStyle,第二条规则最终还是会覆盖它。 runtimeStyle 覆盖所有其他 CSS(!important 声明除外)。所以它是 !important 的 JScript 等价物。

另请注意,我也在重置 filter 属性本身。这可以防止表达式被不断地重新评估。但是,尽管这可能会降低性能,但我认为这不是超级关键。我把它放在这里的主要原因是因为我在这些表达式中添加了alert()s,而你绝对不想让它们永远弹出。

实际上也可以使用您制作的任何其他属性。这也有效:

a {
    bogus: expression(function(e){
        e.runtimeStyle.color = 'blue';
    }(this));
}

但是,由于bogus 属性实际上并不存在,因此您无法使用 Javascript 对其进行重置,因此此不断地重新评估。

【讨论】:

  • 哇。谢谢,墨卡托。您清楚地了解 IE 的表达方式。如果它们出现(通过电子邮件?),我可能想问你更多的问题。您的回答最直接地回答了我的问题,因为它使用 CSS 表达式来模拟 IE6/7 中的继承。我喜欢它不需要外部脚本文件的事实。也许我们应该使用bogus 之类的东西,这样规则就不会被覆盖。而且我想我们确实想连续执行表达式,因为要继承的值可能会改变。 (如果您有兴趣将其贡献给 CleanSlateCSS 样式表,请告诉我)。
  • 我给你发了电子邮件。我能否真正回答你的任何问题是另一回事。
猜你喜欢
  • 2012-08-07
  • 1970-01-01
  • 2010-09-29
  • 1970-01-01
  • 2012-08-28
  • 1970-01-01
  • 2013-05-23
  • 1970-01-01
相关资源
最近更新 更多