Giới hạn quy tắc CSS của Trình thám hiểm Internet


150

Tôi đã đọc thông tin mâu thuẫn về các giới hạn CSS ngớ ngẩn của Internet Explorer. Tôi (nghĩ rằng tôi) hiểu rằng bạn chỉ có thể có 31 <style><link>thẻ (kết hợp) và mỗi tờ có thể có tối đa 31 @importgiây (vì vậy 31 <link>giây, mỗi đến 31 @importgiây đều ổn, mặc dù điên rồ).

Tuy nhiên, quy tắc 4095 ít rõ ràng hơn - đây là quy tắc 4095 cho mỗi tài liệu hay trên mỗi tờ? Chẳng hạn, tôi có thể <link>hai biểu định kiểu, mỗi biểu đồ có 4000 quy tắc và có hoạt động không, hoặc điều này có phá vỡ giới hạn không?

Chỉnh sửa bên thứ 3 năm 2018

Trên blog này msd bài viết biểu định kiểu-giới hạn trong internet-explorer thông tin thêm được cung cấp.


1
Có vẻ như giới hạn 4095 là cho mỗi tài liệu theo habdas.org/2010/05/30/msie-4095-selector-limit và cũng có một liên kết đến một trang thử nghiệm mà bạn có thể tự mình thử
andyb

Tại sao bạn vẫn cần nhiều hơn 30 bảng định kiểu trên một trang? Tại sao bạn cần 4.000 quy tắc? Ngay cả các trang phức tạp nhất của tôi hầu như không nhận được hơn 1.000 nút, do đó, bạn phải có hơn 4 quy tắc cho mỗi nút trung bình để đạt đến giới hạn ...
Niet the Dark Absol

@Kolink một số hệ thống quản lý nội dung (xấu) sử dụng các mẫu có thể dẫn đến nhiều tệp CSS được đưa vào. Thật không may, tôi đã thấy <style>giới hạn 31 đạt được trong một số dịp
andyb

@Kolink - Tôi đang thiết lập ứng dụng web của mình. Trong nỗ lực hiện tại của tôi, 30 thành phần = 30 (nhỏ) biểu định kiểu, cộng với các nghi phạm thông thường khác như normalize.css. Nói cách khác, có lẽ tôi đang thực hiện một cái gì đó tương tự như những gì andyb gọi là "xấu". : P
Barg

Tôi cũng đang tạo trang web của mình ra khỏi các thành phần, nhưng mỗi trang xác định rõ ràng thành phần nào nó cần và nhập chúng. Có lẽ bạn đang tải các thành phần bạn không cần, hoặc có lẽ các thành phần của bạn quá cụ thể và bạn nên nhóm lại một số - tôi thực sự không thể phán xét mà không biết thêm.
Niet the Dark Tuyệt đối

Câu trả lời:


221

Giới thiệu những điều sau từ Microsoft:

Các quy tắc cho IE9 là:

  • Một tờ có thể chứa tới 4095 bộ chọn (Bản trình diễn)
  • Một tờ có thể @import tối đa 31 tờ
  • @import lồng nhau hỗ trợ sâu tới 4 cấp

Các quy tắc cho IE10 là:

  • Một tờ có thể chứa tới 65534 bộ chọn
  • Một tờ có thể @import lên tới 4095 tờ
  • @import lồng nhau hỗ trợ sâu tới 4095 cấp

Kiểm tra quy tắc 4095 theo giới hạn trang tính

Bằng cách xác nhận, tôi đã tạo ra một ý chính với 3 tệp. Một HTML và hai tệp CSS.

  • Tệp đầu tiên chứa 4096 bộ chọn và có nghĩa là bộ chọn cuối cùng của nó không được đọc.
  • Tệp thứ hai (4095.css) có một bộ chọn ít hơn và được đọc và hoạt động hoàn hảo trong IE (mặc dù nó đã đọc 4095 bộ chọn khác từ tệp trước đó.

2
Đó thực sự là hai liên kết khiến tôi bối rối. KB nói "Tất cả các quy tắc kiểu sau 4.095 quy tắc đầu tiên không được áp dụng." -tấm.
Sà lan

2
Cảm ơn rất nhiều - điều đó đã xác nhận rằng nó là trên mỗi trang, không phải trên mỗi trang.
Sà lan

30
Cần lưu ý rằng giới hạn 4095 áp dụng cho các bộ chọn , không phải quy tắc .
Christopher Cortez

1
chỉ để làm rõ: dòng sau đây sẽ được tính là một "bộ chọn" hay hai? div.oneclass, div.anotherstyle {color: green};
anthony

2
@anthony, hai bộ chọn, một quy tắc.
mực

116

Một tập lệnh javascript để đếm các quy tắc CSS của bạn:

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
Bạn là một vị thánh vì đã cung cấp điều này. Tôi đã có một lỗi mà tôi không thể định vị được tại địa phương và do việc thu nhỏ tài sản của chúng tôi trong sản phẩm, không thể theo dõi những gì đang xảy ra. Tôi có cảm giác chúng tôi đã vượt quá giới hạn chọn của IE và tập lệnh của bạn đã tìm thấy nó cho tôi. Cảm ơn bạn rất nhiều!
cướp

9
Điều đáng chú ý là bạn không nên chạy tập lệnh này trong IE, vì nó sẽ không bao giờ phát ra cảnh báo.
user123444555621

1
Cảm ơn bạn cho kịch bản. Nó giúp tôi gỡ lỗi một lỗi khác
Jdaotta

4
Kịch bản này không chính xác. Bạn nên bao gồm một nhánh cho @mediacác quy tắc, xem stackoverflow.com/a/25089619/938089 .
Rob W

1
kịch bản tuyệt vời. Hãy nhớ rằng nếu các bảng định kiểu đến từ một tên miền khác với trang web, bạn sẽ nhận được giá trị null cho sheet.cssRules
CodeToad

34

Tôi không có đủ đại diện để nhận xét về đoạn trích tương tự ở trên, nhưng đoạn này tính các quy tắc @media. Thả nó trong bảng điều khiển 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();

nguồn: https://gist.github.com/krisbulman/0f5e27bba375b151515d


1
Điều đó thật tuyệt. Cảm ơn bạn đã chỉnh sửa tập lệnh để bao gồm các truy vấn phương tiện truyền thông. Rất, vô cùng, siêu, rất hữu ích !!
tiffylou

1
Kịch bản này là tốt hơn so với ở trên.
gkempkens

15

Theo một trang trên blog MSDN IEIternals có tên Giới hạn Biểu định kiểu trong Internet Explorer, các giới hạn được hiển thị ở trên (31 tờ, 4095 quy tắc trên mỗi trang và 4 cấp) được áp dụng cho IE 6 đến IE 9. Các giới hạn đã được tăng lên trong IE 10 đến sau :

  • Một tờ có thể chứa tới 65534 quy tắc
  • Một tài liệu có thể sử dụng tới 4095 bảng định kiểu
  • @import lồng nhau bị giới hạn ở mức 4095 (do giới hạn biểu định kiểu 4095)

1
Một lần nữa, giới hạn không nằm ở số lượng quy tắc , mà là số lượng bộ chọn .
Connexo 04/11/2015

Văn bản "4095 quy tắc" hoặc "65534 quy tắc" được lấy trực tiếp từ văn bản trên bài đăng trên blog của MS IEIternals 2011 và cũng có thể được tìm thấy trong KB Q262161. Đây có thể là một vấn đề ngữ nghĩa. Trong nhiều định nghĩa của "quy tắc" hoặc "bộ quy tắc", "bộ chọn" là một phần của "quy tắc" bên ngoài "khối khai báo" có thể là một bộ chọn hoặc một nhóm bộ chọn. Sử dụng định nghĩa đó, tất cả các quy tắc về mặt kỹ thuật chỉ có một bộ chọn ngay cả khi bộ chọn đó thực sự là một nhóm các bộ chọn riêng biệt. -> tiếp tục ->
Night Owl

<- tiếp tục <- Tác giả blog suy đoán trong các nhận xét rằng bên trong các nhóm bộ chọn được sao chép sao cho mỗi bộ chọn riêng lẻ trong một nhóm bộ chọn trở thành quy tắc riêng và được tính riêng lẻ. Do đó, "65534 bộ chọn" có ý nghĩa thế giới thực phù hợp hơn nhưng "quy tắc 65534" vẫn đúng về mặt kỹ thuật.
Cú đêm

Tôi đã xác nhận rằng IE 10 có giới hạn cao hơn (tôi cho rằng giới hạn mới là 65534 như Night Owl đã nói?) So với IE 9 bằng cách sử dụng ý chính của isNaN1247 ( gist.github.com/2225701 ) với IE 9 và IE 10: developer.microsoft. com / en-us / microsoft-edge / tools / vms / mac
David Winiecki



-1

Tôi nghĩ cũng đáng lưu ý rằng bất kỳ tệp CSS nào lớn hơn 288kb sẽ chỉ được đọc cho đến khi đó ~ 288kb. Mọi thứ sau đó sẽ bị bỏ qua hoàn toàn trong IE <= 9.

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

Lời khuyên của tôi là giữ các tệp CSS cho các ứng dụng lớn hơn được chia thành các mô-đun & thành phần và theo dõi liên tục về kích thước tệp.


Từ một số nghiên cứu mở rộng, có vẻ như đó không phải là giới hạn kích thước tệp, mà là giới hạn # bộ chọn. Tôi không thể tìm thấy bất kỳ tài liệu chính thức xác minh thực tế này.
Arya

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.