Limiti delle regole CSS di Internet Explorer


150

Ho letto informazioni contrastanti sui sciocchi limiti CSS di Internet Explorer. Capisco (penso di essere) che puoi avere solo 31 <style>e <link>tag (combinati) e che ogni foglio può avere fino a 31 @import-s (quindi 31 <link>-s, ciascuno a 31 @import-s va bene, anche se folle).

Tuttavia, la regola 4095 è meno chiara: si tratta di 4095 regole per documento o per foglio? Ad esempio, posso <link>fare due fogli di stile, ognuno con 4000 regole, e farlo funzionare, o questo supererà il limite?

Modifica di terze parti 2018

Su questo post sul blog di msdn sono disponibili ulteriori informazioni sui fogli di stile-limits-in-internet-explorer .


1
Sembra che il limite 4095 sia per documento secondo habdas.org/2010/05/30/msie-4095-selector-limit e c'è anche un link a una pagina di prova che potresti provare tu stesso
andyb

Perché dovresti avere bisogno di più di 30 fogli di stile su una singola pagina? Perché avresti bisogno di 4.000 regole? Anche le mie pagine più complesse riescono a malapena a superare i 1.000 nodi, quindi per raggiungere il limite dovresti avere più di 4 regole per nodo in media ...
Niet the Dark Absol

@Kolink alcuni (cattivi) sistemi di gestione dei contenuti utilizzano modelli che possono portare all'inclusione di molti file CSS. Sfortunatamente, ho visto il <style>limite di 31 raggiunto in diverse occasioni
Andyb,

@Kolink - Sto componendo la mia applicazione web. Nel mio tentativo attuale, 30 componenti = 30 (minuscoli) fogli di stile, più gli altri soliti sospetti come normalize.css. In altre parole, probabilmente sto implementando qualcosa di simile a ciò che andyb definisce "cattivo". : P
Barg

Sto anche trasformando il mio sito in componenti, ma ogni pagina definisce chiaramente quali componenti necessita e li importa. Forse stai caricando componenti di cui non hai bisogno, o forse i tuoi componenti sono troppo specifici e dovresti raggrupparli insieme - non posso davvero giudicare senza saperne di più.
Niet the Dark Absol,

Risposte:


221

Riferendosi a quanto segue da Microsoft:

Le regole per IE9 sono:

  • Un foglio può contenere fino a 4095 selettori (Demo)
  • Un foglio può importare fino a 31 fogli
  • Il nesting @import supporta fino a 4 livelli di profondità

Le regole per IE10 sono:

  • Un foglio può contenere fino a 65534 selettori
  • Un foglio può importare fino a 4095 fogli
  • La nidificazione @import supporta fino a 4095 livelli di profondità

Test della regola 4095 per limite del foglio

A titolo di conferma, ho creato una sintesi con 3 file. Un HTML e due file CSS.

  • Il primo file contiene 4096 selettori e significa che il selettore finale non viene letto.
  • Il secondo file (4095.css) ha un selettore in meno, viene letto e funziona perfettamente in IE (anche se ha già letto altri 4095 selettori dal file precedente.

2
In realtà sono quegli stessi due link che mi hanno confuso. Il KB dice "Tutte le regole di stile dopo che non sono state applicate le prime 4.095 regole", che per me implica che è per pagina, l'altro link dice "Un foglio può contenere fino a 4095 regole", il che implica che è per -foglio.
Barg,

2
Grazie mille - questo ha confermato che è per foglio, non per pagina.
Barg

30
Va notato che il limite 4095 si applica ai selettori , non alle regole .
Christopher Cortez,

1
solo per chiarimenti: la seguente riga conta come un "selettore", o due? div.oneclass, div.anotherstyle {color: verde};
anthony,

2
@anthony, due selettori, una regola.
Squidbe,

116

Uno script javascript per contare le tue regole CSS:

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
Sei un santo per averlo fornito. Ho avuto un bug che non riuscivo a localizzare localmente e, a causa della nostra minificazione delle risorse in prod, non era possibile rintracciare ciò che stava andando storto. Avevo la sensazione che stessimo superando il limite di selezione di IE e la tua sceneggiatura l'ha trovata per me. Grazie mille!
Robabby,

9
Vale la pena notare che non è necessario eseguire questo script in IE, poiché non emetterà mai l'avviso.
user123444555621

1
Grazie per la sceneggiatura. Mi ha aiutato a eseguire il debug di un errore diverso
Jdahern,

4
Questo script non è preciso. È necessario includere un ramo per le @mediaregole, consultare stackoverflow.com/a/25089619/938089 .
Rob W

1
ottima sceneggiatura. tieni presente che se i fogli di stile provengono da un dominio diverso rispetto alla pagina web, otterrai un valore nullo per sheet.cssRules
CodeToad

34

Non ho abbastanza rappresentante per commentare lo snippet simile sopra, ma questo conta le regole @media. Rilascialo nella console di 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();

fonte: https://gist.github.com/krisbulman/0f5e27bba375b151515d


1
Questo è fantastico Grazie per aver modificato lo script per includere query multimediali. Molto, incredibilmente, super, molto utile !!
tiffylou,

1
Questo script è migliore di quello sopra.
gkempkens,

15

Secondo una pagina del blog IEInternals di MSDN intitolata Limiti del foglio di stile in Internet Explorer, i limiti mostrati sopra (31 fogli, 4095 regole per foglio e 4 livelli) applicati da IE 6 a IE 9. I limiti sono stati aumentati in IE 10 a quanto segue :

  • Un foglio può contenere fino a 65534 regole
  • Un documento può utilizzare fino a 4095 fogli di stile
  • La nidificazione di @import è limitata a 4095 livelli (a causa del limite del foglio di stile 4095)

1
Ancora una volta, il limite non è nel numero di regole , ma nel numero di selettori .
connexo

Il testo "4095 regole" o "65534 regole" proviene direttamente dal testo di un post sul blog di MS IEInternals 2011 e si trova anche in KB Q262161. È probabilmente una questione di semantica. In molte definizioni di "regola" o "set di regole" il "selettore" è la parte della "regola" al di fuori del "blocco di dichiarazione" che può essere un singolo selettore o un gruppo di selettori. Utilizzando tale definizione, tutte le regole hanno tecnicamente un solo selettore anche se quel selettore è in realtà un gruppo di singoli selettori specifici. -> continua ->
Night Owl

<- continua <- L'autore del blog specula nei commenti che internamente i gruppi di selettori vengono clonati in modo tale che ogni singolo selettore in un gruppo di selettori diventi la propria regola e venga conteggiato individualmente. Pertanto, "65534 selettori" ha un significato più rilevante nel mondo reale, ma "65534 regole" è ancora tecnicamente corretto.
Nottambulo,

Ho confermato che IE 10 ha un limite più alto (suppongo che il nuovo limite sia 65534 come ha detto Night Owl?) Rispetto a IE 9 utilizzando l'essenza di isNaN1247 ( gist.github.com/2225701 ) con IE 9 e IE 10: developer.microsoft. com / it-it / microsoft-edge / tools / vms / mac
David Winiecki


4

Gli strumenti per sviluppatori all'interno dell'edizione dev di FireFox mostrano le regole CSS

Potrebbe essere utile per quelli di voi che combattono ancora con versioni precedenti di IE / file CSS di grandi dimensioni.

Sito Web FF Developer Edition

Strumenti di sviluppo - FF


-1

Penso che valga anche la pena notare che qualsiasi file CSS di dimensioni superiori a 288 KB verrà letto solo fino a ~ 288 KB. Qualsiasi elemento successivo verrà completamente ignorato in IE <= 9.

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

Il mio consiglio è di mantenere i file CSS per le applicazioni più grandi suddivisi in moduli e componenti e tenere d'occhio costantemente la dimensione dei file.


Da alcune ricerche estese, non sembra che sia un limite di dimensione del file, ma piuttosto un limite del selettore #. Non sono riuscito a trovare alcuna documentazione ufficiale che confermi questo fatto.
Arya,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.