【问题标题】:What determines the order CSS is "specified" between two elements when loaded from different files?当从不同文件加载时,是什么决定了两个元素之间“指定”的 CSS 顺序?
【发布时间】:2015-06-30 17:47:42
【问题描述】:

我正在帮助调试一个 CSS 问题,其中两个相同的选择器在两个配置相同的服务器之间以不同的顺序加载。一条规则从页面中定义的样式表加载,另一条规则通过注入样式表文件的 Javascript 加载。

根据级联规则,当我阅读它们时,它应该归结为指定规则的顺序。看起来问题似乎是一个竞争条件,但不清楚竞争条件的基础是什么。在 Chrome 的网络选项卡中,文件在两台服务器之间以相同的顺序列出;但是,当您深入到“元素”选项卡中的元素级别时,会首先列出在给定服务器上优先的规则。

当这样加载时,什么决定了 CSS 在两个元素之间“指定”的顺序?

【问题讨论】:

  • javascript什么时候开始执行?当页面完全加载或内联?请提供 CSS 和 JS 部分所在的代码小示例。

标签: css browser css-specificity css-cascade


【解决方案1】:

首先是选择器强度。

如果我使用架构,它是:
inline > identifier (100) > class (10) > tag (1) - 您可以计算括号中的“点”来查找选择器强度。

你可能知道。

现在,当您有两个相同强度的选择器时,它们被应用于一个元素,例如。

#main p {color: red}
#top p {color: green}

和 HTML

<div id=main>
    <div id=top>
        <p></p>
    </div>
</div>

段落将为绿色,在开发工具中,红色将被删除。两个选择器的强度相同,最新的获胜。

其他例子是:

#main #top p {color: red} /* will be red, stronger selector */
#main p {color: green}

在 HTML 中,主要因素是样式链接到文档的顺序,以及规则的顺序(直接在 HTML 或 CSS 中)。首先加载哪个 CSS 文件无关紧要(例如,由于文件大小),HTML 文档中的位置很重要。

【讨论】:

  • 根据 OP,他正在处理 “两个相同的选择器。” 这使得你的答案中唯一相关的部分是最后一段......这是(可疑?)在我的回答之后添加。
  • @canon:不确定是之前还是之后,我想写更多关于如何应用规则的内容。我没有阅读您的答案,只是想将其填写到我的答案中,您同时拥有相同的答案:-)
【解决方案2】:

如果选择器相同,则归结为... CSS 和DOM 中的顺序。所以,问题是,您将动态生成的&lt;link&gt;(或&lt;style&gt;)相对于原始&lt;link&gt;(或&lt;style&gt;)放在哪里? DOM 中的顺序很重要。

如果您想确保首先评估您的动态创建的 CSS,请将其添加到 &lt;head&gt; 的顶部:

document.head.insertBefore(myLink, document.head.firstChild);

如果您希望最后对其进行评估,请将其附加到 &lt;body&gt;:

document.body.appendChild(myLink);

最后评估的规则将被应用(除非使用!important

这是一个例子:

<!DOCTYPE html>
<html>
  <head>
    <style>
      p {
        color: green;
      }
    </style>
  </head>
  <body>
    <p>test</p>  
    <script>
      (function() {

        var red = document.createElement("style");
        red.textContent = "p { color: red }";
        // We'll add this to the top of head. You'll never even notice because it will
        // be overridden by the existing green style.
        document.head.insertBefore(red, document.head.firstChild);

        var blue = document.createElement("style");
        blue.textContent = "p { color: blue }";
        // We'll add this to the end of the body after a three second delay. It will 
        // override the other styles.
        setTimeout(function() {
          document.body.appendChild(blue);
        }, 3000);

      })();
    </script>
  </body>
</html>

【讨论】:

  • 谢谢!我检查了 Chrome 中的 Elements 选项卡,两个服务器之间每个 CSS 文件的 标记出现的顺序不同。下一步将确定原因。动态加载的文件是通过 Modernizr.load 添加的,所以我猜它会以某种方式发挥作用。
猜你喜欢
  • 2011-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-17
  • 1970-01-01
  • 2016-02-15
相关资源
最近更新 更多