Internet Explorer的CSS规则限制


150

我已经阅读了有关Internet Explorer愚蠢的CSS限制的冲突信息。我(想我)理解,您只能有31个<style><link>标签(组合),并且每张纸最多可以有31个@import-s(所以31 <link>-s,每个到31个@import-s都很好,尽管很疯狂)。

但是,4095规则不太明确-是每个文档还是每张4095规则?例如,我<link>可以创建两个样式表,每个样式表具有4000条规则,并且可以工作,还是会突破限制?

第三方编辑2018

在此msdn博客文章stylesheet-limits-internet-explorer上提供了更多信息。


1
根据habdas.org/2010/05/30/msie-4095-selector-limit,每个文档似乎有4095个限制,并且还有指向您可以尝试使用的测试页的链接
andyb 2012年

为什么在一个页面上仍然需要30个以上的样式表?为什么需要4,000条规则?即使是我最复杂的页面也几乎没有超过1,000个节点,因此平均每个节点必须有4条以上的规则才能达到限制...
Niet the Dark Absol 2012年

@Kolink某些(糟糕的)内容管理系统使用的模板可能会导致包含许多CSS文件。不幸的是,我已经<style>多次看到达到31的限制
andyb 2012年

@Kolink-我正在将我的Web应用程序组件化。在我目前的尝试中,有30个组件= 30(微小)样式表,以及其他通常的可疑元素,例如normalize.css。换句话说,我可能正在实现类似于andyb称为“坏”的东西。:P
巴格2012年

我也使站点脱离组件,但是每个页面都清楚地定义了它需要的组件并导入它们。也许您正在加载不需要的组件,或者您的组件过于具体,应该将它们组合在一起-我无法真正知道更多信息。
Niet the Dark Absol 2012年

Answers:


221

从Microsoft引用以下内容:

IE9的规则是:

  • 一张最多可以包含4095个选择器(演示)
  • 一张最多可以导入31张纸
  • @import嵌套最多支持4级

IE10的规则是:

  • 一个工作最多可以包含65534个选择器
  • 一张最多可以导入4095张纸
  • @import嵌套最多支持4095个层次

通过工作表限制测试4095规则

通过确认的方式,我创建了一个包含3个文件的要点。一个HTML和两个CSS文件。

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

2
实际上,这两个链接使我感到困惑。KB表示“未应用前4,095条规则之后的所有样式规则。”在我看来,这意味着每页,而另一链接则表明“一个工作表最多可包含4095条规则”,这意味着每页-片。
巴格2012年

2
非常感谢-这已经确认是每页而不是每页。
巴格2012年

30
应当指出,4095限制适用于选择器,而不是规则
Christopher Cortez 2013年

1
只是为了澄清:以下行将算作一个“选择器”还是两个?div.oneclass,div.anotherstyle {color:green};
安东尼

2
@安东尼,两个选择器,一个规则。
squidbe 2014年

116

一个用来计算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();

2
您是提供此信息的圣人。我有一个无法在本地找到的错误,并且由于我们在生产中精简了资产,因此无法找出问题所在。我觉得我们超出了IE的选择器限制,您的脚本为我找到了它。非常感谢!
robabby 2014年

9
值得注意的是,您不应在IE中运行此脚本,因为它永远不会发出警告。
user123444555621 2014年

1
谢谢你的脚本。它帮助我调试了另一个错误
Jdahern 2014年

4
该脚本不正确。您应该包括一个@media规则分支,请参阅stackoverflow.com/a/25089619/938089
罗伯W

1
很棒的剧本。请记住,如果样式表来自与网页不同的域,则sheet.cssRules将为空值
CodeToad 2015年

34

我没有足够的代表对上述类似代码段发表评论,但这是@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


1
这很棒。感谢您编辑脚本以包括媒体查询。非常,非常,超级,非常有帮助!
tiffylou,2015年

1
此脚本比上面的脚本更好。
gkempkens

15

根据MSDN IEInternals博客上标题为“ Internet Explorer中样式表限制”的页面,上面显示的限制(31个工作表,每工作表4095个规则和4个级别)应用于IE 6到IE9。这些限制在IE 10中增加到以下:

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

1
同样,限制不在于规则的数量,而在于选择器的数量。
connexo

文本“ 4095规则”或“ 65534规则”直接来自MS IEInternals 2011博客文章中的文本,也可以在知识库文章Q262161中找到。这可能是语义问题。在“规则”或“规则集”的许多定义中,“选择器”是“规则”中“声明块”之外的部分,它可以是单个选择器或选择器组。使用该定义,所有规则从技术上讲只有一个选择器,即使该选择器实际上是一组特定的单个选择器也是如此。->继续->
夜猫子

<-继续<-博客作者在评论中推测内部会克隆选择器组,这样选择器组中的每个选择器都将成为其自己的规则并被单独计数。因此,“ 65534选择器”在现实世界中具有更多相关意义,但“ 65534规则”在技术上仍然正确。
猫头鹰

我通过将isNaN1247的要旨(gist.github.com/2225701)与IE 9和IE 10:developer.microsoft
David Winiecki 2016年



-1

我认为还值得注意的是,任何大于288kb的CSS文件都只能读取到288kb左右。IE <= 9中的所有内容将被完全忽略。

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

我的建议是将大型应用程序的CSS文件分成模块和组件,并始终关注文件大小。


从一些扩展的研究来看,这似乎不是文件大小限制,而是选择器#限制。我找不到任何官方文件可以证明这一事实。
艾莉亚

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.