กฎ CSS ที่ จำกัด ของ Internet Explorer


150

ฉันได้อ่านข้อมูลที่ขัดแย้งกันเกี่ยวกับขีด จำกัด CSS ที่งี่เง่าของ Internet Explorer แล้ว ฉัน (คิดว่าฉันเป็น) เข้าใจว่าคุณสามารถมี 31 <style>และ<link>แท็ก (รวมกัน) และแต่ละแผ่นสามารถมีได้ถึง 31 @import-s (ดังนั้น 31 <link>-s แต่ละคนถึง 31 @import-s เป็นเรื่องที่ดีแม้ว่าจะบ้า)

อย่างไรก็ตามกฎ 4095 นั้นชัดเจนน้อยกว่า - นี่คือกฎ 4095 ต่อเอกสารหรือต่อแผ่นงานหรือไม่ ตัวอย่างเช่นฉันสามารถ<link>ใช้สไตล์ชีตสองแบบแต่ละแบบมี 4,000 กฎและใช้งานได้หรือไม่หรือจะทำให้ขีด จำกัด หรือไม่

บุคคลที่สามแก้ไข 2018

ในบทความนี้คุณจะได้รับข้อมูลเพิ่มเติมเกี่ยวกับการโพสต์สไตล์ชีตข้อ จำกัด ในอินเทอร์เน็ต explorer


1
ดูเหมือนว่าขีด จำกัด 4095 ต่อเอกสารเป็นไปตาม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

ฉันกำลังทำให้ไซต์ของฉันออกจากส่วนประกอบด้วยเช่นกัน แต่แต่ละหน้าจะกำหนดองค์ประกอบที่ต้องการและนำเข้าได้อย่างชัดเจน บางทีคุณกำลังโหลดส่วนประกอบที่คุณไม่ต้องการหรือบางทีส่วนประกอบของคุณเฉพาะเจาะจงเกินไปและคุณควรจัดกลุ่มบางอย่างเข้าด้วยกัน - ฉันไม่สามารถตัดสินได้โดยไม่รู้ตัว
Niet the Dark Absolute

คำตอบ:


221

อ้างถึงต่อไปนี้จาก Microsoft:

กฎสำหรับIE9คือ:

  • แผ่นอาจจะมีถึง 4095 เตอร์(Demo)
  • แผ่นหนึ่งอาจนำเข้า @ ได้ถึง 31 แผ่น
  • @import nesting รองรับได้สูงสุด 4 ระดับ

กฎสำหรับIE10คือ:

  • แผ่นหนึ่งอาจมีตัวเลือกได้ถึง 65534 ตัว
  • แผ่นหนึ่งอาจนำเข้า @ ได้ถึง 4095 แผ่น
  • @import nesting รองรับได้มากถึง 4095 ระดับ

ทดสอบกฎ 4095 ตามขีด จำกัด ชีต

โดยวิธีการยืนยันฉันได้สร้างส่วนสำคัญที่มี 3 ไฟล์ หนึ่งไฟล์ HTML และไฟล์ CSS สองไฟล์

  • ไฟล์แรกมีตัวเลือก 4096 และหมายความว่าตัวเลือกสุดท้ายไม่ได้รับการอ่าน
  • ไฟล์ที่สอง (4095.css) มีตัวเลือกน้อยกว่าหนึ่งตัวและได้รับการอ่านและทำงานได้อย่างสมบูรณ์ใน IE (แม้ว่ามันจะอ่านตัวเลือกอื่นอีก 4095 ตัวจากไฟล์ก่อนหน้า

2
จริงๆแล้วมันเป็นลิงก์สองลิงก์ที่ทำให้ฉันสับสน KB บอกว่า "กฎสไตล์ทั้งหมดหลังจากกฎ 4,095 แรกไม่ได้ใช้" ซึ่งสำหรับฉันแล้วก็หมายความว่ามันเป็นแบบต่อหน้าลิงค์อื่น ๆ บอกว่า "แผ่นงานอาจมีกฎได้ถึง 4095 กฎ" ซึ่งหมายความว่ามันเป็น -แผ่น.
Barg

2
ขอบคุณมาก - ที่ได้รับการยืนยันว่าเป็นแบบต่อแผ่นไม่ใช่แบบต่อหน้า
Barg

30
มันควรจะตั้งข้อสังเกตว่าขีด จำกัด 4095 นำไปใช้กับตัวเลือกไม่กฎ
Christopher Cortez

1
เพื่อความกระจ่าง: บรรทัดต่อไปนี้จะนับเป็น "ตัวเลือก" หนึ่งตัวหรือสองตัว? div.oneclass, div.anotherstyle {color: green};
แอนโธนี

2
@ แอนโทนี่สองตัวเลือกหนึ่งกฎ
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
สคริปต์ที่ดี โปรดทราบว่าถ้าสไตล์ชีตมาจากโดเมนอื่นที่ไม่ใช่หน้าเว็บคุณจะได้รับค่า Null สำหรับชีต ccsRules
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 ชื่อStylesheet Limits ใน Internet Explorerขีด จำกัด ที่แสดงด้านบน (31 แผ่น 4095 กฎต่อแผ่นและ 4 ระดับ) ที่ใช้กับ IE 6 ถึง IE 9 ข้อ จำกัด เพิ่มขึ้นใน IE 10 ต่อไปนี้ :

  • แผ่นงานอาจมีกฎได้ถึง 65534 กฎ
  • เอกสารอาจใช้สไตล์ได้ถึง 4095 แผ่น
  • @import nesting ถูก จำกัด ที่ระดับ 4095 (เนื่องจากขีด จำกัด ของสไตล์ชีท 4095)

1
อีกครั้งวงเงินที่ไม่ได้อยู่ในจำนวนของกฎแต่ในจำนวนเตอร์
connexo

ข้อความ "กฎ 4095" หรือ "65534 กฎ" โดยตรงจากข้อความบนบล็อก MS IEInternals 2011 และสามารถพบได้ใน KB Q262161 มันอาจเป็นเรื่องของความหมาย ในคำจำกัดความจำนวนมากของ "กฎ" หรือ "ชุดกฎ" "ตัวเลือก" เป็นส่วนหนึ่งของ "กฎ" นอก "บล็อกการประกาศ" ซึ่งสามารถเป็นตัวเลือกเดียวหรือกลุ่มตัวเลือก การใช้คำจำกัดความนั้นกฎทั้งหมดในทางเทคนิคจะมีตัวเลือกเพียงตัวเดียวแม้ว่าตัวเลือกนั้นจะเป็นกลุ่มของตัวเลือกเฉพาะแต่ละตัว -> ต่อเนื่อง ->
Night Owl

<- ต่อเนื่อง <- ผู้เขียนบล็อกคาดเดาในความคิดเห็นว่ากลุ่มตัวเลือกภายในถูกโคลนเพื่อให้ตัวเลือกแต่ละตัวในกลุ่มตัวเลือกกลายเป็นกฎของตัวเองและถูกนับเป็นรายบุคคล ดังนั้น "ตัวเลือก 65534" จึงมีความหมายที่เกี่ยวข้องกับโลกแห่งความจริงมากขึ้น แต่ "กฎ 65534" ยังคงถูกต้องทางเทคนิค
Night Owl

ฉันยืนยันว่า IE 10 มีขีด จำกัด ที่สูงกว่า (ฉันคิดว่าขีด จำกัด ใหม่คือ 65534 ตามที่ Night Owl พูด?) มากกว่า IE 9 โดยใช้ส่วนสำคัญของ isNaN1247 ( isNaN1247 gist.github.com/2225701 ) กับ IE 9 และ IE 10: นักพัฒนาซอฟต์แวร์ com / en-us / microsoft-edge / tools / vms / mac
David Winiecki

5

ทางออกที่ดีสำหรับปัญหานี้สำหรับผู้ใช้ Grunt:

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


แน่นอนตรวจสอบปัญหาก่อนที่จะใช้
โอลิเวอร์

มันเป็นเสื้อคลุมที่ทำเสียงฮึดฮัดสำหรับbless.js btw ซึ่งดูเหมือนจะค่อนข้างแข็ง
Tom Teman


-1

ฉันคิดว่ามันก็น่าสังเกตว่าไฟล์ CSS ใด ๆ ที่มีขนาดใหญ่กว่า 288kb จะอ่านได้จนกว่าจะถึง ~ 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.