Ограничения CSS правил Internet Explorer - PullRequest
148 голосов
/ 28 марта 2012

Я прочитал противоречивую информацию о глупых ограничениях CSS в Internet Explorer. Я (кажется, я) понимаю, что вы можете иметь только 31 <style> и <link> теги (вместе взятые), и что на каждом листе может быть до 31 @import -ов (то есть 31 <link> -с, каждый до 31 @import -с это нормально, хотя и безумно).

Однако правило 4095 менее ясно - это правила 4095 на документ или на лист? Например, могу ли я <link> использовать две таблицы стилей, каждая с 4000 правилами, и заставить это работать, или это нарушит лимит?

Стороннее редактирование 2018

В этом сообщении блога msdn stylesheet-limit-in-internet-explorer приведена дополнительная информация.

Ответы [ 7 ]

216 голосов
/ 28 марта 2012

Ссылаясь на следующее от Microsoft:

Правила для IE9 :

  • A лист может содержать до 4095 селекторов (Демонстрация)
  • A лист может @ импортировать до 31 листа
  • @ поддерживает вложения с глубиной до 4 уровней

Правила для IE10 :

  • A лист может содержать до 65534 селекторов
  • A лист может @ импортировать до 4095 листов
  • @ поддерживает вложения до 4095 уровней глубины

Тестирование правила 4095 по пределу листа

В подтверждение я создал гист с 3 файлами.Один HTML и два CSS-файла.

  • Первый файл содержит 4096 селекторов и означает, что его последний селектор не будет прочитан.
  • Второй файл (4095.css) имеет на один селектор меньше и получает чтениеи прекрасно работает в IE (хотя он уже прочитал еще 4095 селекторов из предыдущего файла.
116 голосов
/ 10 декабря 2013

JavaScript-скрипт для подсчета ваших правил 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();
34 голосов
/ 23 февраля 2015

У меня недостаточно представителей, чтобы комментировать приведенный выше фрагмент, но этот счет учитывает правила @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

15 голосов
/ 12 декабря 2013

Согласно странице в блоге MSDN IEInternals под названием Пределы стилей в Internet Explorer ограничения, показанные выше (31 лист, 4095 правил на лист и 4 уровня), применяются к IE 6 - IE 9.в IE 10 ограничения были увеличены до следующего:

  • Лист может содержать до 65534 правил
  • В документе может использоваться до 4095 таблиц стилей
  • @ import nestingограничено 4095 уровнями (из-за ограничения таблицы стилей 4095)
5 голосов
/ 12 января 2015

Хорошее решение этой проблемы для людей, использующих Grunt:

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

3 голосов
/ 13 ноября 2015

Инструменты разработчика в редакции FireFox dev показывают правила CSS

Может пригодиться тем, кто все еще борется со старыми версиями IE / большими файлами CSS.

Веб-сайт FF Developer Edition

Dev tools - FF

0 голосов
/ 04 сентября 2015

Я также думаю, что стоит отметить, что любой файл CSS размером более 288 КБ будет считан только до этого ~ 288 КБ.Все, что будет после, будет полностью проигнорировано в IE.

...