web-dev-qa-db-ja.com

Internet ExplorerのCSSルールの制限

Internet Explorerの愚かなCSS制限に関する矛盾する情報を読みました。私は(考えている)、あなたは31個の<style><link>タグしか持てず、各シートは最大31個の@import- sを持つことができることを理解しています(だから31<link>- s、31までの@import- sは、非常識ではありますが)大丈夫です。

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

サードパーティ編集2018

これについて msdn blog post stylesheet-limits-in-internet-Explorer 詳細情報が提供されます。

149
Barg

Microsoftから以下を参照:

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

  • シートには最大4095のセレクターを含めることができます (デモ)
  • sheetは最大31枚の@importが可能
  • @importネストは最大4レベルの深さをサポートします

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

  • sheetには最大65534のセレクターを含めることができます
  • sheetは、最大4095枚のシートを@importできます
  • @importネストは、最大4095レベルの深さをサポートします

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

確認のため、3つのファイルで Gistを作成しました を確認します。 1つのHTMLと2つのCSSファイル。

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

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();
116
EpokK

上記の同様のスニペットについてコメントするのに十分な担当者がいませんが、これは@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

34
krisbulman

Internet Explorerのスタイルシートの制限 というタイトルのMSDN IEInternalsブログのページによると、上記の制限(31シート、シートごとの4095ルール、4レベル)がIE 6に適用されますIE 9. IE 10では、制限が次のように引き上げられました。

  • シートには最大65534のルールを含めることができます
  • 文書は最大4095のスタイルシートを使用できます
  • @importのネストは4095レベルに制限されています(4095スタイルシートの制限のため)
15
Night Owl

Gruntを使用している人々にとってのこの問題に対する素晴らしい解決策:

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

5
Tom Teman

FireFox devエディション内の開発者ツールはCSSルールを表示します

まだ古いIEバージョン/大きなCSSファイルと戦っている人にとっては便利かもしれません。

FF Developer Edition Webサイト

Dev tools - FF

4
Mike Hague