【问题标题】:Internet Explorer's CSS rules limitsInternet Explorer 的 CSS 规则限制
【发布时间】:2012-04-12 00:04:17
【问题描述】:

我阅读了有关 Internet Explorer 愚蠢的 CSS 限制的相互矛盾的信息。我(想我是)理解你只能有 31 个 <style><link> 标签(组合),并且每张表最多可以有 31 个 @import-s(所以 31 个<link>-s,每个到 31 @import-s 很好,虽然很疯狂)。

但是,4095 规则不太清楚 - 这是每个文档还是每个工作表的 4095 规则?例如,我可以 <link> 到两个样式表,每个样式表都有 4000 条规则,并让它工作,或者这会打破限制吗?

3rd 方编辑 2018

在此msdn blog post stylesheet-limits-in-internet-explorer 上提供了更多信息。

【问题讨论】:

  • 根据habdas.org/2010/05/30/msie-4095-selector-limit,每个文档似乎有 4095 个限制,还有一个测试页面的链接,您可以自己尝试
  • 为什么在一个页面上需要 30 多个样式表呢?为什么需要 4,000 条规则?即使是我最复杂的页面也几乎没有超过 1,000 个节点,因此每个节点平均必须有超过 4 条规则才能达到限制...
  • @Kolink 一些(糟糕的)内容管理系统使用的模板可能会导致包含许多 CSS 文件。不幸的是,我已经多次看到达到 31 <style> 的限制
  • @Kolink - 我正在组件化我的 Web 应用程序。在我目前的尝试中,30 个组件 = 30 个(微小的)样式表,加上其他常见的嫌疑人,例如 normalize.css。换句话说,我可能正在实现类似于 andyb 所说的“坏”的东西。 :P
  • 我也在用组件制作我的网站,但每个页面都清楚地定义了它需要哪些组件并导入它们。也许您正在加载不需要的组件,或者您的组件过于具体,您应该将一些组件组合在一起 - 如果不了解更多信息,我无法判断。

标签: css internet-explorer stylesheet


【解决方案1】:

来自 Microsoft 的以下内容:

IE9的规则是:

  • 工作表最多可以包含 4095 个选择器(Demo)
  • 工作表最多可以@import 31 张工作表
  • @import 嵌套最多支持 4 层深度

IE10的规则是:

  • 工作表最多可包含 65534 个选择器
  • 工作表最多可以@import 4095 张工作表
  • @import 嵌套最多支持 4095 层

按工作表限制测试 4095 规则

作为确认,I've created a gist 带有 3 个文件。一个 HTML 和两个 CSS 文件。

  • 第一个文件包含 4096 个选择器,这意味着它的最终选择器不会被读入。
  • 第二个文件 (4095.css) 少了一个选择器,并且被读入,并且在 IE 中完美运行(即使它已经从前一个文件中读取了另外 4095 个选择器。

【讨论】:

  • 实际上是这两个相同的链接让我感到困惑。 KB 说“不应用前 4,095 条规则之后的所有样式规则。”,这对我来说意味着它是每页的,另一个链接说“一张表可能包含多达 4095 条规则”,这意味着它是每页的。 -工作表。
  • 非常感谢 - 这已确认它是每张纸,而不是每页。
  • 需要注意的是,4095 限制适用于 selectors,而不是 rules
  • 只是为了澄清:以下行将算作一个“选择器”还是两个? div.oneclass,div.anotherstyle {颜色:绿色};
  • @anthony,两个选择器,一个规则。
【解决方案2】:

计算 CSS 规则的 javascript 脚本:

function countCSSRules() {
    var results = '',
        log = '';
    if (!document.styleSheets) {
        return;
    }
    for (var i = 0; i < document.styleSheets.length; i++) {
        countSheet(document.styleSheets[i]);
    }
    function countSheet(sheet) {
        if (sheet && sheet.cssRules) {
            var count = countSelectors(sheet);

            log += '\nFile: ' + (sheet.href ? sheet.href : 'inline <style> tag');
            log += '\nRules: ' + sheet.cssRules.length;
            log += '\nSelectors: ' + count;
            log += '\n--------------------------';
            if (count >= 4096) {
                results += '\n********************************\nWARNING:\n There are ' + count + ' CSS rules in the stylesheet ' + sheet.href + ' - IE will ignore the last ' + (count - 4096) + ' rules!\n';
            }
        }
    }
    function countSelectors(group) {
        var count = 0;
        for (var j = 0, l = group.cssRules.length; j < l; j++) {
            var rule = group.cssRules[j];
            if (rule instanceof CSSImportRule) {
                countSheet(rule.styleSheet);
            }
            if (rule instanceof CSSMediaRule) {
                count += countSelectors(rule);
            }
            if( !rule.selectorText ) {
                continue;
            }
            count += rule.selectorText.split(',').length;
        }
        return count;
    }

    console.log(log);
    console.log(results);
};
countCSSRules();

【讨论】:

  • 你是提供这个的圣人。我有一个我无法在本地找到的错误,并且由于我们在 prod 中缩小了资产,因此无法追踪出了什么问题。我有一种感觉,我们超过了 IE 的选择器限制,而您的脚本为我找到了它。非常感谢!
  • 值得注意的是,您不应该在 IE 中运行此脚本,因为它永远不会发出警告。
  • 感谢您的脚本。它帮助我调试了一个不同的错误
  • 此脚本不准确。您应该为@media 规则添加一个分支,请参阅stackoverflow.com/a/25089619/938089
  • 很棒的脚本。请记住,如果样式表来自与网页不同的域,您将获得 sheet.cssRules 的空值
【解决方案3】:

我没有足够的代表来评论上述类似的 sn-p,但这一个算 @media 规则。将其放到 Chrome 控制台中。

function countCSSRules() {
    var results = '',
        log = '';
    if (!document.styleSheets) {
        return;
    }
    for (var i = 0; i < document.styleSheets.length; i++) {
        countSheet(document.styleSheets[i]);
    }
    function countSheet(sheet) {
        var count = 0;
        if (sheet && sheet.cssRules) {
            for (var j = 0, l = sheet.cssRules.length; j < l; j++) {
                if (!sheet.cssRules[j].selectorText) {
                    if (sheet.cssRules[j].cssRules) {
                        for (var m = 0, n = sheet.cssRules[j].cssRules.length; m < n; m++) {
                            if(sheet.cssRules[j].cssRules[m].selectorText) {
                                count += sheet.cssRules[j].cssRules[m].selectorText.split(',').length;
                            }
                        }
                    }
                }
                else {
                    count += sheet.cssRules[j].selectorText.split(',').length;
                }
            }
 
            log += '\nFile: ' + (sheet.href ? sheet.href : 'inline <style> tag');
            log += '\nRules: ' + sheet.cssRules.length;
            log += '\nSelectors: ' + count;
            log += '\n--------------------------';
            if (count >= 4096) {
                results += '\n********************************\nWARNING:\n There are ' + count + ' CSS rules in the stylesheet ' + sheet.href + ' - IE will ignore the last ' + (count - 4096) + ' rules!\n';
            }
        }
    }
    console.log(log);
    console.log(results);
};
countCSSRules();

来源:https://gist.github.com/krisbulman/0f5e27bba375b151515d

【讨论】:

  • 这很棒。感谢您编辑脚本以包含媒体查询。非常、难以置信、超级、非常有帮助!
  • 这个脚本比上面那个好。
【解决方案4】:

根据 MSDN IEInternals 博客上名为 Stylesheet Limits in Internet Explorer 的页面,上面显示的限制(31 张,每张 4095 条规则和 4 个级别)适用于 IE 6 到 IE 9。IE 10 中的限制增加到以下:

  • 一个工作表最多可以包含 65534 条规则
  • 一个文档最多可以使用 4095 个样式表
  • @import 嵌套限制为 4095 级(由于 4095 样式表限制)

【讨论】:

  • 同样,限制不是rules的数量,而是selector的数量。
  • 文本“4095 规则”或“65534 规则”直接来自 MS IEInternals 2011 博客文章中的文本,也可以在 KB Q262161 中找到。这可能是语义问题。在“规则”或“规则集”的许多定义中,“选择器”是“声明块”之外的“规则”部分,可以是单个选择器或选择器组。使用该定义,所有规则在技术上只有一个选择器,即使该选择器实际上是一组特定的单独选择器。 -> 继续 ->
  • 我通过在 IE 9 和 IE 10 中使用 isNaN1247 的要点 (gist.github.com/2225701) 确认 IE 10 的限制比 IE 9 更高(我想新的限制是 Night Owl 所说的 65534?): developer.microsoft.com/en-us/microsoft-edge/tools/vms/mac
【解决方案5】:

对于使用 Grunt 的人来说,这个问题的一个很好的解决方案:

https://github.com/Ponginae/grunt-bless

【讨论】:

  • 当然,使用前请查看issues
  • 它是 bless.js btw 的 grunt 包装器,看起来相当可靠。
【解决方案6】:

FireFox 开发版中的开发工具显示 CSS 规则

对于仍在使用旧 IE 版本/大型 CSS 文件的人来说可能会很方便。

FF Developer Edition Website

【讨论】:

    【解决方案7】:

    我认为还值得注意的是,任何大于 288kb 的 CSS 文件只会被读取到 ~288kb。之后的任何内容在 IE

    http://joshua.perina.com/africa/gambia/fajara/post/internet-explorer-css-file-size-limit

    我的建议是将大型应用程序的 CSS 文件拆分为模块和组件,并密切关注文件大小。

    【讨论】:

    猜你喜欢
    • 2023-03-09
    • 1970-01-01
    • 2014-01-17
    • 2013-01-04
    • 2014-04-05
    • 1970-01-01
    • 1970-01-01
    • 2012-03-26
    相关资源
    最近更新 更多