Ограничения правил 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)
Ответ 5
Хорошее решение этой проблемы для людей, использующих Grunt:
https://github.com/Ponginae/grunt-bless
Ответ 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 для более крупных приложений, разбитых на модули и компоненты, и постоянно следить за файлами.