Internet Explorer의 CSS 규칙 제한


150

Internet Explorer의 어리석은 CSS 제한에 관한 상충되는 정보를 읽었습니다. 나는 당신이 31 <style><link>태그 (결합) 만 가질 수 있으며 각 시트는 최대 31 @import-s 를 가질 수 있음을 이해하고 있습니다 (31- <link>s, 각 31- @imports는 훌륭하지만 훌륭합니다).

그러나 4095 규칙은 명확하지 않습니다.이 4095 규칙이 문서 또는 시트 당입니까? 예를 들어, <link>각각 4000 개의 규칙이있는 두 개의 스타일 시트를 사용하여 작동시킬 수 있습니까?

타사 편집 2018

msdn 블로그 게시물 stylesheet-limits-in-internet-explorer에서 추가 정보가 제공됩니다.


1
40hab 제한은 habdas.org/2010/05/30/msie-4095-selector-limit 에 따라 문서 당 한 것처럼 보이고 직접 시도해 볼 수있는 테스트 페이지에 대한 링크도 있습니다
andyb

어쨌든 한 페이지에 30 개 이상의 스타일 시트가 필요한 이유는 무엇입니까? 왜 4,000 규칙이 필요할까요? 가장 복잡한 페이지조차도 1,000 개가 넘는 노드를 거의 얻지 못하므로 한계에 도달하려면 노드 당 평균 4 개 이상의 규칙이 있어야합니다.
Niet the Dark Absol

@Kolink 일부 (잘못된) 컨텐츠 관리 시스템은 많은 CSS 파일이 포함될 수있는 템플릿을 사용합니다. 불행히도, 나는 <style>여러 차례에 걸쳐 31 개의 한계에 도달 한 것을 보았습니다
andyb

@ Kolink-웹 응용 프로그램을 구성 요소 화하고 있습니다. 내 현재 시도에서 30 개의 구성 요소 = 30 (작은) 스타일 시트와 normalize.css와 같은 다른 일반적인 용의자. 다시 말해, 아마도 andyb가 '나쁜'이라고 말하는 것과 비슷한 것을 구현하고있을 것입니다. : P
Barg

내 사이트도 구성 요소로 만들지 않지만 각 페이지에는 필요한 구성 요소를 명확하게 정의하고 가져옵니다. 아마도 필요하지 않은 구성 요소를로드하거나 구성 요소가 너무 구체적 일 수 있으며 함께 그룹화해야합니다. 더 이상 알지 못하면 실제로 판단 할 수 없습니다.
암흑의 절대자 니엣

답변:


221

Microsoft에서 다음을 참조하십시오.

IE9 의 규칙 은 다음과 같습니다.

  • 시트는 4095 선택기까지 포함 할 수 있습니다 (데모)
  • 시트 31 장까지 @Import 수도
  • @import nesting은 최대 4 단계의 깊이를 지원합니다

IE10 의 규칙 은 다음과 같습니다.

  • 시트는 65534 선택기까지 포함 할 수 있습니다
  • 시트는 4095 장까지 @import 수 있습니다
  • @import nesting은 최대 4095 레벨까지 지원

시트 제한으로 4095 규칙 테스트

확인 을 위해 3 개의 파일 로 요점만들었습니다 . 하나의 HTML과 두 개의 CSS 파일.

  • 첫 번째 파일에는 4096 개의 선택기가 포함되어 있으며 마지막 선택기가 읽지 않음을 의미합니다.
  • 두 번째 파일 (4095.css)에는 하나의 적은 선택기가 있으며 읽기가 가능하며 이전 파일에서 다른 4095 선택기를 이미 읽었음에도 불구하고 IE에서 완벽하게 작동합니다.

2
실제로 혼란 스러웠던 동일한 두 개의 링크입니다. KB는 "첫 번째 4,095 규칙 이후의 모든 스타일 규칙이 적용되지 않습니다."라고 표시합니다. 이는 페이지 당임을 의미하고 다른 링크는 "시트는 최대 4095 규칙을 포함 할 수 있습니다"라는 의미입니다. -시트.
Barg

2
대단히 감사합니다-페이지 당이 아니라 시트 당임을 확인했습니다.
Barg

30
4095 제한은 규칙이 아닌 선택자에 적용됩니다 .
Christopher Cortez

1
설명을 위해 다음 줄이 하나의 "선택기"또는 두 개로 간주됩니까? div.oneclass, div.anotherstyle {색상 : 녹색};
Anthony

2
@anthony, 두 개의 선택기, 하나의 규칙.
squidbe

116

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의 선택기 한도를 초과 한 느낌이 들었고 스크립트가 나를 위해 찾았습니다. 정말 고맙습니다!
robabby

9
IE에서이 스크립트를 실행하면 경고 메시지가 표시되지 않으므로이 스크립트를 실행하면 안됩니다.
user123444555621

1
스크립트 주셔서 감사합니다. 다른 오류를 디버깅하는 데 도움이되었습니다
Jdahern

4
이 스크립트는 정확하지 않습니다. @media규칙에 대한 분기를 포함해야합니다 ( stackoverflow.com/a/25089619/938089 참조) .
Rob W

1
훌륭한 대본. 스타일 시트는 웹 페이지가 아닌 다른 도메인의 경우, 당신은 sheet.cssRules에 null 값을 얻을 것이다 것을 명심
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

Internet ExplorerStylesheet Limits 라는 제목의 MSDN IEInternals 블로그 페이지에 따르면 IE 9를 통해 IE 6에 적용되는 위에 표시된 제한 (31 시트, 시트 당 4095 규칙 및 4 수준)이 IE 9에서 다음과 같이 증가했습니다. :

  • 시트에는 최대 65534 개의 규칙이 포함될 수 있습니다.
  • 문서는 최대 4095 개의 스타일 시트를 사용할 수 있습니다
  • @import 중첩은 4095 수준으로 제한됩니다 (4095 스타일 시트 제한으로 인해).

1
다시 한도는 규칙 의 수가 아니라 선택 자의 수입니다 .
connexo

"4095 규칙"또는 "65534 규칙"텍스트는 MS IEInternals 2011 블로그 게시물의 텍스트에서 직접 가져온 것이며 KB Q262161에서도 찾을 수 있습니다. 의미론의 문제 일 수 있습니다. "규칙"또는 "규칙 세트"의 많은 정의에서 "선택기"는 "선언 블록"외부의 "규칙"부분으로 단일 선택기 또는 선택기 그룹 일 수 있습니다. 해당 선택기가 실제로 특정 개별 선택기의 그룹 인 경우에도 해당 정의를 사용하면 모든 규칙에 기술적으로 하나의 선택기가 있습니다. -> 계속->
Night Owl

<-continue <-블로그 작성자는 선택기 그룹의 각 개별 선택기가 자체 규칙이되고 개별적으로 계산되도록 내부적으로 선택기 그룹이 복제된다는 의견을 추측합니다. 따라서 "65534 선택기"는보다 실제적인 의미를 갖지만 "65534 규칙"은 여전히 ​​기술적으로 정확합니다.
나이트 올빼미

IE 9와 IE 10 : developer.microsoft 와 함께 isNaN1247의 요지 ( gist.github.com/2225701 )를 사용하여 IE 9보다 IE 10이 더 높은 한계 (Night Owl이 말했듯이 65534라고 가정 )를 확인 했습니다. com / en-us / microsoft-edge / tools / vms / mac
David Winiecki



-1

288kb보다 큰 CSS 파일은 ~ 288kb까지만 읽을 수 있다는 점도 주목할 가치가 있다고 생각합니다. 이후의 모든 것은 IE <= 9에서 완전히 무시됩니다.

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

내 조언은 더 큰 응용 프로그램의 CSS 파일을 모듈 및 구성 요소로 나누고 파일 크기를 계속 주시하는 것입니다.


일부 확장 연구에서 파일 크기 제한이 아니라 선택기 # 제한처럼 보입니다. 이 사실을 증명하는 공식 문서를 찾을 수 없습니다.
Arya

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.