Обмеження правил CSS Internet Explorer


150

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

Однак правило 4095 менш зрозуміле - це 4095 правил на документ чи на аркуші? Наприклад, чи можу я <link>до двох таблиць стилів, кожен з яких має 4000 правил, і чи буде це працювати, або це порушить межу?

3-я партійна редакція 2018 року

На цій сторінці MSDN-повідомлення в блозі стилів-меж-в-Інтернеті подано додаткову інформацію.


1
Схоже, обмеження 4095 - на документ згідно habdas.org/2010/05/30/msie-4095-selector-limit, а також є посилання на тестову сторінку, яку ви можете спробувати самі
andyb

Навіщо тобі взагалі потрібно більше 30 таблиць стилів на одній сторінці? Навіщо вам потрібно 4000 правил? Навіть на моїх найскладніших сторінках ледве виходить понад 1000 вузлів, тож вам доведеться мати понад 4 правила на середній вузол, щоб досягти межі ...
Niet The Dark Absol

@Kolink деякі (погані) системи управління вмістом використовують шаблони, які можуть призвести до включення багатьох файлів CSS. На жаль, я <style>неодноразово бачив 31 межу, досягнуту
Andyb

@Kolink - я компонентую свій веб-додаток. У моїй теперішній спробі 30 компонентів = 30 (крихітних) таблиць стилів, плюс інші звичайні підозрювані, такі як normalize.css. Іншими словами, я, мабуть, реалізую щось подібне до того, що andyb називає «поганим». : P
Barg

Я також створюю свій сайт із компонентів, але кожна сторінка чітко визначає, які саме компоненти йому потрібні та імпортує. Можливо, ви завантажуєте компоненти, які вам не потрібні, або, можливо, ваші компоненти занадто конкретні, і ви повинні згрупувати деякі разом - я не можу реально судити, не знаючи більше.
Niet the Dark Absol

Відповіді:


221

Посилаючись на наступне від Microsoft:

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

  • Лист може містити до 4095 селекторів (Демо)
  • Лист може @import до 31 аркушів
  • @import вкладення підтримує глибину до 4 рівнів

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

  • Лист може містити до 65534 селектор
  • Лист може @import до 4095 аркушів
  • @import гніздування підтримує до 4095 рівнів глибиною

Тестування правила 4095 за межами аркуша

Для підтвердження я створив суть із 3 файлами. Один HTML і два CSS файли.

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

2
Насправді ті самі дві ланки мене збентежили. КБ каже: "Усі правила стилю після перших 4095 правил не застосовуються", що для мене означає, що це сторінка, на іншому посиланні написано: "Аркуш може містити до 4095 правил", що означає, що він відповідає -склад.
Барг

2
Велике спасибі - що підтвердило, що це на аркуші, а не на сторінці.
Барг

30
Слід зазначити, що обмеження 4095 стосується селекторів , а не правил .
Крістофер Кортес

1
лише для уточнення: чи вважатиметься наступний рядок одним "селектором" чи двома? div.oneclass, div.anotherstyle {color: green};
Антоній

2
@anthony, два селектори, одне правило.
кальмар

116

Сценарій 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();

2
Ви - святий для надання цього. У мене виникла помилка, яку я не міг знайти локально, і через наше мінімізацію активів у продажі не вдалося відстежити, що йшло не так. У мене було відчуття, що ми перевищили ліміт вибору IE, і твій сценарій знайшов це для мене. Дуже дякую!
халат

9
Варто зазначити, що не слід запускати цей скрипт в IE, оскільки він ніколи не надсилатиме попередження.
користувач123444555621

1
Дякую за сценарій Це допомогло мені налагодити іншу помилку
Jdahern

4
Цей сценарій неточний. Ви повинні включити гілку для @mediaправил, див. Stackoverflow.com/a/25089619/938089 .
Роб Ш

1
чудовий сценарій. майте на увазі, що якщо таблиці стилів з іншого домену, ніж веб-сторінка, ви отримаєте нульове значення для sheet.cssRules
CodeToad

34

У мене недостатньо респондентів, щоб коментувати описаний вище фрагмент, але цей підрахунок правил @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


1
Це чудово. Дякуємо, що редагували сценарій, щоб включити медіа-запити. Дуже, неймовірно, супер, дуже корисно !!
tiffylou

1
Цей сценарій кращий за вищевказаним.
gkempkens

15

Згідно зі сторінкою в блозі MSDN IEInternals під назвою " Обмеження стильових таблиць в Internet Explorer " обмеження, показані вище (31 аркуш, 4095 правил на аркуш і 4 рівні), застосовані до IE 6 до IE 9. Обмеження були збільшені в IE 10 до наступного :

  • Аркуш може містити до 65534 правил
  • Документ може використовувати до 4095 таблиць стилів
  • @import вкладення обмежено 4095 рівнями (через обмеження таблиці стилів 4095)

1
Знову ж таки, межа полягає не в кількості правил , а в кількості селекторів .
коннексо

Текст "4095 правил" або "65534 правила" є безпосередньо з тексту в публікації блогу MS IEInternals 2011, а також його можна знайти в KB Q262161. Це, мабуть, справа семантики. У багатьох визначеннях "правило" або "набір правил" "селектор" є частиною "правила" поза "блоком оголошення", яка може бути одним селектором або селекторною групою. Використовуючи це визначення, всі правила технічно мають лише один селектор, навіть якщо цей селектор насправді є групою конкретних окремих селекторів. -> продовження ->
Нічна сова

<- продовження <- Автор блогу розмірковує у коментарях, що внутрішньо групи селекторів клонуються таким чином, що кожен окремий вибір у групі селекторів стає власним правилом і рахується індивідуально. Таким чином, "65534 селектори" має більш реальне значення реального світу, але "65534 правила" все ще технічно правильні.
Сова

Я підтвердив, що IE 10 має вищу межу (я вважаю, що новий ліміт - 65534, як сказав Night Owl?), Ніж IE 9, використовуючи суть isNaN1247 ( gist.github.com/2225701 ) з IE 9 та IE 10: developer.microsoft. com / en-us / microsoft-edge / tools / vms / mac
David Winiecki


4

Інструменти для розробників у FireFox Dev Edition показують правила CSS

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

Веб-сайт FF Developer Edition

Інструменти розробки - FF


-1

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

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

Моя порада - тримати файли CSS для великих додатків на модулі та компоненти та постійно стежити за розмірами файлів.


З деяких розширених досліджень це виглядає не так, як це обмеження розміру файлу, а скоріше селектор № обмеження. Я не зміг знайти жодної офіційної документації, яка б підтверджувала цей факт.
Ар'я

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.