Internet Explorer'ın CSS kuralları sınırları


150

Internet Explorer'ın saçma CSS sınırları ile ilgili çelişkili bilgileri okudum. Yalnızca 31'inizin <style>ve <link>etiketlerinizin (birleştirilmiş) olabileceğini ve her sayfanın 31'e kadar olabileceğini @import(yani 31 <link>-s, her biri 31 @import-s iyi, deli olsa da ) anlıyorum .

Ancak, 4095 kuralı daha az açıktır - bu 4095 kuralı belge veya sayfa başına mı? Örneğin <link>, her biri 4000 kural içeren iki stil sayfasına gidebilir miyim ve çalışmasını sağlayabilir miyim , yoksa bu sınırı aşabilir mi?

3. taraf düzenleme 2018

Bu msdn blog yazı stil-limitleri-in-internet-explorer hakkında daha fazla bilgi verilmektedir.


1
Görünüşe göre 4095 limiti habdas.org/2010/05/30/msie-4095-selector-limit'e göre belge başına ve kendinizi deneyebileceğiniz bir test sayfasına bağlantı var
andyb

Neden tek bir sayfada 30'dan fazla stil sayfasına ihtiyacınız var? Neden 4.000 kurala ihtiyacınız var? En karmaşık sayfalarım bile 1000'den fazla düğüme sahip değil, bu yüzden sınıra ulaşmak için düğüm ortalaması başına 4'ten fazla kurala sahip olmanız gerekir ...
Niet the Dark Absol

@Kolink bazı (kötü) içerik yönetim sistemleri, birçok CSS dosyasının eklenmesine yol açabilecek şablonlar kullanır. Ne yazık ki, 31 <style>sınırın birkaç kez ulaştığını gördüm
andyb

@Kolink - Web uygulamamı bileşenleştiriyorum. Şu anki denememde 30 bileşen = 30 (küçük) stil sayfası ve normalize.css gibi diğer olağan şüpheliler. Başka bir deyişle, muhtemelen andyb'nin 'kötü' olarak adlandırdığı şeye benzer bir şey uyguluyorum. : P
Barg

Sitemi de bileşenlerden çıkarıyorum, ancak her sayfa hangi bileşenlere ihtiyaç duyduğunu açıkça belirliyor ve ithal ediyor. Belki ihtiyacınız olmayan bileşenleri yüklüyorsunuz, ya da belki de bileşenleriniz çok özeldir ve bazılarını birlikte gruplandırmalısınız - daha fazlasını bilmeden gerçekten yargılayamam.
Niet the Dark Absol

Yanıtlar:


221

Microsoft'tan aşağıdakilere başvurarak:

IE9 için kurallar :

  • Bir sayfada en fazla 4095 seçici bulunabilir (Demo)
  • Bir sayfa 31 sayfaya kadar içe aktarma yapabilir
  • @import nesting 4 seviyeye kadar derinliği destekler

IE10 için kurallar :

  • Bir sayfada 65534 adede kadar seçici bulunabilir
  • Bir sayfa 4095 yaprağa kadar ithalat yapabilir
  • @import nesting 4095 seviyeye kadar derinliği destekler

4095 kuralını sayfa sınırına göre test etme

Onaylama yoluyla, 3 dosyalı bir özgeçmiş oluşturdum . Bir HTML ve iki CSS dosyası.

  • İlk dosya 4096 seçici içerir ve son seçicinin okunmadığı anlamına gelir.
  • İkinci dosya (4095.css) daha az bir seçiciye sahiptir ve okunur ve IE'de mükemmel çalışır (önceki dosyadan başka bir 4095 seçiciyi zaten okumasına rağmen).

2
Aslında bu iki bağlantı beni şaşırttı. KB, "ilk 4.095 kuralından sonraki tüm stil kuralları uygulanmadı" diyor. Bu, bana göre sayfa başına olduğunu belirtirken, diğer bağlantıda "Bir sayfa, 4095 kuralına kadar içerebilir" anlamına gelir. -yaprak.
Mart'ta Barg

2
Çok teşekkürler - bu sayfa başına değil sayfa başına doğrulandı.
Mart'ta Barg

30
4095 sınırının kurallar için değil seçiciler için geçerli olduğuna dikkat edilmelidir .
Christopher Cortez

1
sadece açıklama için: aşağıdaki satır bir "seçici" veya iki olarak sayılır mı? div.oneclass, div.anotherstyle {renk: yeşil};
Anthony

2
@anthony, iki seçici, bir kural.
squidbe

116

CSS kurallarınızı saymak için bir javascript betiği:

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
Bunu sağlamak için bir azizsiniz. Yerel olarak bulamadığım bir hata aldım ve eşyadaki varlık minimizasyonu nedeniyle, neyin yanlış gittiğini izlemek mümkün değildi. IE'nin seçici sınırını aştığımızı hissettim ve senaryonuz bunu benim için buldu. Çok teşekkür ederim!
robabby

9
Bu betiği IE'de çalıştırmamanız gerektiğini belirtmek gerekir, çünkü asla uyarı yaymaz.
user123444555621

1
Senaryo için teşekkürler. Farklı bir hatayı ayıklamama yardımcı oldu
Jdahern

4
Bu komut dosyası yanlış. @mediaKurallar için bir şube eklemelisiniz , bkz. Stackoverflow.com/a/25089619/938089 .
Rob W

1
harika bir senaryo. stil sayfalarının web sayfasından farklı bir alandan gelmesi durumunda, sheet.cssRules
CodeToad

34

Yukarıdaki benzer snippet hakkında yorum yapmak için yeterli temsilcim yok, ancak bu @media kurallarını sayar. Chrome konsoluna bırakın.

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

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


1
Bu harika. Medya sorgularını içerecek şekilde komut dosyasını düzenlediğiniz için teşekkür ederiz. Çok, inanılmaz, süper, son derece yararlı !!
tiffylou

1
Bu senaryo yukarıdakinden daha iyidir.
gkempkens

15

MSDN IEInternals blogundaki Internet Explorer'da Stil Sayfası Sınırları başlıklı bir sayfaya göre , IE 6'ya IE 9'a uygulanan yukarıda gösterilen sınırlar (31 sayfa, yaprak başına 4095 kural ve 4 seviye). :

  • Bir sayfada en fazla 65534 kural bulunabilir
  • Bir belge en fazla 4095 stil sayfası kullanabilir
  • @import iç içe yerleştirme 4095 düzeyleriyle sınırlıdır (4095 stil sayfası sınırı nedeniyle)

1
Yine, sınır kuralların sayısında değil, seçici sayısındadır .
connexo

"4095 kuralları" veya "65534 kuralları" metni doğrudan MS IEInternals 2011 blog yazısındaki metindir ve KB Q262161'de de bulunabilir. Muhtemelen bir anlambilim meselesi. "Kural" veya "kural seti" nin birçok tanımında "seçici", "kural" ın "bildirim bloğu" dışındaki tek bir seçici veya bir seçici grup olabilen kısmıdır. Bu tanım kullanıldığında, bu seçici aslında belirli bireysel seçicilerden oluşan bir grup olsa bile teknik olarak yalnızca bir seçiciye sahiptir. -> devam ->
Gece Baykuş

<- devamı <- Blog yazarı, açıklama gruplarında dahili olarak seçici grupların, seçici gruptaki her bir seçicinin kendi kuralı olacağı ve ayrı ayrı sayılacağı şekilde klonlandığını tahmin etmektedir. Dolayısıyla, "65534 seçicilerinin" daha anlamlı gerçek dünya anlamı vardır, ancak "65534 kuralları" hala teknik olarak doğrudur.
Gece Kuşu

IE 9 ve IE 10: developer.microsoft ile isNaN1247'nin gist ( gist.github.com/2225701 ) kullanarak IE 10'un IE 9'dan daha yüksek bir limite sahip olduğunu (yeni sınırın Gece Baykuşu dediği gibi 65534 olduğunu varsayalım) doğruladım . com / tr-tr / microsoft-edge / tools / vms / mac
David Winiecki



-1

Ayrıca 288kb'den büyük herhangi bir CSS dosyasının sadece ~ 288kb'ye kadar okunacağını da belirtmek gerekir. IE <= 9'da sonraki her şey göz ardı edilecektir.

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

Benim tavsiyem, daha büyük uygulamalar için CSS dosyalarının modüllere ve bileşenlere ayrılması ve dosya boyutuna sürekli olarak bakılmasıdır.


Bazı genişletilmiş araştırmalardan, bir dosya boyutu sınırı değil, bir seçici # sınırı gibi görünüyor. Bu gerçeği doğrulayan resmi bir belge bulamadım.
Arya

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.