Ограничения правил CSS в Internet Explorer

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

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

Сторонняя редакция 2018

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

Ответ 1

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

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

  • Лист может содержать до 4095 селекторов (Демо)
  • Лист может @импортировать до 31 листа
  • @import nesting поддерживает до 4-х уровней глубиной

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

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

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

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

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

Ответ 2

Скрипт 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();

Ответ 3

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

Ответ 4

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

  • Лист может содержать до 65534 правил
  • Документ может использовать до 4095 таблиц стилей.
  • Распределение @import ограничено 4095 уровнями (из-за лимита стилей 4095)

Ответ 6

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

Может быть удобно для тех из вас, кто по-прежнему борется со старыми версиями IE/большими CSS файлами.

Веб-сайт FF Developer Edition

Инструменты разработчика - FF

Ответ 7

Я думаю, что также стоит отметить, что любой файл CSS размером больше 288kb будет считываться только до ~ 288kb. Все, что после этого будет полностью проигнорировано в IE <= 9.

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

Мой совет состоит в том, чтобы сохранить файлы CSS для более крупных приложений, разбитых на модули и компоненты, и постоянно следить за файлами.