Internet ExplorerのCSSルールの制限


150

Internet Explorerの愚かなCSS制限に関する矛盾する情報を読みました。私は(私はそう思います)31 <style><link>タグ(結合)しか持てず、各シートには最大31 @import-s が含まれることを理解しています(したがって、31 <link>-sはそれぞれ31 @import-sで問題ありません)。

ただし、4095ルールはそれほど明確ではありません。この4095ルールはドキュメントごとですか、それともシートごとですか?たとえば<link>、それぞれ4000ルールのスタイルシートを2つ作成して機能させることはできますか、それとも制限を超えますか?

サードパーティ編集2018

このmsdnブログの投稿stylesheet-limits-in-internet-explorerに詳細情報が記載されています。


1
4095の制限はhabdas.org/2010/05/30/msie-4095-selector-limitによるとドキュメントごとであり、自分で試すことができるテストページへのリンクもあります
andyb

とにかく、1つのページに30を超えるスタイルシートが必要なのはなぜですか。4,000のルールが必要なのはなぜですか?私の最も複雑なページでさえ、ノード数が1,000を超えることはほとんどないため、制限に達するにはノードあたりのルール数が4を超える必要があります...
Niet the Dark Absol 2012年

@Kolink一部の(悪い)コンテンツ管理システムはテンプレートを使用しているため、多くのCSSファイルが含まれる可能性があります。残念ながら、私は31の<style>制限に何度も到達したことを見てきました
andyb '28

@Kolink-Webアプリケーションをコンポーネント化しています。私の現在の試みでは、30のコンポーネント= 30(小さな)スタイルシートに加えて、normalize.cssなどの他の通常の容疑者があります。言い換えれば、私はおそらく、andybが「悪い」と呼ぶものに似たものを実装しています。:P
Barg

私のサイトもコンポーネントで作成していますが、各ページでは、必要なコンポーネントを明確に定義し、それらをインポートしています。おそらく、不要なコンポーネントをロードしているのか、コンポーネントが具体的すぎてグループ化する必要があるのか​​もしれません-詳細がわからないと判断できません。
Niet the Darkアブソル

回答:


221

マイクロソフトから以下を参照:

IE9のルールは次のとおりです。

  • シートは、 4095のセレクタまで含んでいてもよい(デモ)
  • 1つのシートで最大31枚のシートをインポートできます
  • @importネストは最大4レベルの深さをサポートします

IE10のルールは次のとおりです。

  • シートは 65534のセレクタまで含まれていてもよいです
  • シートが 4095枚まで@importあり
  • @importネストは最大4095レベルの深さをサポートします

シート制限による4095ルールのテスト

確認のために、3つのファイルを含む要点作成しました。1つのHTML、および2つのCSSファイル。

  • 最初のファイルには4096のセレクターが含まれており、最終的なセレクターが読み込まれません。
  • 2番目のファイル(4095.css)のセレクターは1つ少なく、読み込まれ、IEで完全に動作します(以前のファイルから別の4095セレクターを既に読み取っていたとしても)。

2
実際、混乱しているのは同じ2つのリンクです。KBには、「最初の4,095ルール以降のすべてのスタイルルールは適用されません。」とあります。これは、ページごとであることを意味し、他のリンクは、「シートには最大4095のルールが含まれる場合があります」とあります。 -シート。
Barg

2
ありがとうございました。これにより、ページごとではなくシートごとであることが確認されました。
Barg

30
4095の制限はルールではなくセレクターに適用されることに注意してください。
クリストファーコルテス2013

1
明確にするために、次の行は1つの「セレクター」または2つとして数えますか?div.oneclass、div.anotherstyle {色:緑};
anthony 2013年

2
@ anthony、2つのセレクター、1つのルール。
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 14年

9
このスクリプトは警告を出力しないため、IEでこのスクリプトを実行しないでください。
user123444555621 2014

1
台本ありがとうございます。それは私が別のエラーをデバッグするのに役立ちました
Jdahern '

4
このスクリプトは不正確です。@mediaルールのブランチを含める必要があります。stackoverflow.com/ a / 25089619/938089を参照してください。
Rob W

1
素晴らしいスクリプト。スタイルシートがWebページとは異なるドメインからのものである場合、sheet.cssRulesのnull値が取得されることに注意してください
CodeToad

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 2015

15

Internet Explorerのスタイルシートの制限という題名のMSDN IEInternalsブログのページによると、IE 6からIE 9までに適用された上記の制限(31シート、1シートあたり4095のルール、および4レベル)は、IE 10で次のように拡張されました。 :

  • シートには最大65534のルールを含めることができます
  • ドキュメントは最大4095のスタイルシートを使用できます
  • @importのネストは4095レベルに制限されています(4095スタイルシートの制限により)。

1
ここでも、制限はルールの数ではなく、セレクタの数にあります。
connexo 2015年

「4095ルール」または「65534ルール」というテキストは、MS IEInternals 2011ブログ投稿のテキストから直接のものであり、KB Q262161にもあります。それはおそらく意味論の問題です。「ルール」または「ルールセット」の多くの定義では、「セレクタ」は、「宣言ブロック」の外側の「ルール」の一部であり、単一のセレクタまたはセレクタグループにすることができます。そのセレクターが実際には特定の個々のセレクターのグループである場合でも、その定義を使用すると、技術的にはすべてのルールにセレクターは1つしかありません。->続き->
Night Owl

<-続き<-ブログの作成者は、セレクタグループ内の各セレクタが独自のルールになり、個別にカウントされるように、セレクタグループが内部的に複製されるとコメントで推測しています。したがって、「65534セレクター」はより現実的な意味を持っていますが、「65534ルール」は依然として技術的に正しいです。
Night Owl

IE 9とIE 10でisNaN1247の要点(gist.github.com/2225701)を使用して、IE 9よりもIE 10の方がIE 9より高い制限があることを確認しました(新しい制限は65534であると思いますか?)。developer.microsoft。 com / en-us / microsoft-edge / tools / vms / mac
David Winiecki



-1

また、288kbを超えるCSSファイルは、その288kbまでしか読み取られないことにも注意してください。それ以降は、IE <= 9では完全に無視されます。

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

私のアドバイスは、より大きなアプリケーションのCSSファイルをモジュールとコンポーネントに分割し、ファイルサイズを常に監視することです。


いくつかの拡張された研究から、それはファイルサイズの制限ではなく、セレクターの制限のように見えます。この事実を証明する公式文書は見つかりませんでした。
アリア

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.