2012-04-03 37 views
5

Như tôi chắc chắn các bạn đã biết, Internet Explorer có thể xử lý các gradient đơn giản. Dưới đây là một đoạn trích từ Twitter Bootstrap, ví dụ:CSS: Các Gradients đơn giản trong Internet Explorer <= 8

filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0); 

Tuy nhiên, tôi đã nhìn thấy một số người sử dụng hai quy tắc CSS (một cho IE < 8 và một cho IE 8), như vậy:

filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#7fbf4d', endColorstr='#63a62f'); /* For Internet Explorer 5.5 - 7 */ 
-ms-filter: "progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#7fbf4d', endColorstr='#63a62f')"; /* For Internet Explorer 8 */ 

Câu hỏi của tôi là, quy tắc thứ hai có thực sự cần thiết không? Twitter Bootstrap khá kỹ lưỡng, nhưng nó không sử dụng bất kỳ quy tắc "-ms-filter" nào. Theo số this page, thuộc tính -ms-filter là một phần mở rộng cho CSS và có thể được sử dụng làm từ đồng nghĩa cho bộ lọc trong chế độ Tiêu chuẩn của IE8.

Trả lời

3

Đề nghị của tôi:

Sử dụng CSS3Pie - http://css3pie.com/

Đây là một thư viện JavaScript cho IE6, IE7 và IE8 rằng bản vá lỗi trong việc hỗ trợ cho một số tính năng CSS3, bao gồm gradient.

Có, bạn có thể sử dụng phong cách đặc biệt của IE filter nếu bạn muốn, nhưng CSS3Pie cho phép bạn sử dụng kiểu CSS chuẩn cho các tính năng này. Dễ dàng hơn nhiều.

Để thực sự trả lời câu hỏi trực tiếp của bạn:

Vâng, phong cách -ms-filter thường được yêu cầu. IE8 sẽ luôn thay cho chúng tôi thay vì filter, được sử dụng chủ yếu cho IE6 và IE7. Trong một số trường hợp, filter sẽ hoạt động trong IE8, nhưng không phải tất cả, vì vậy tốt nhất nên sử dụng -ms-filter để đảm bảo tính tương thích của IE8.

[CHỈNH SỬA] Tại sao họ thay đổi? Bởi vì khi họ phát hành IE8, Microsoft đã thực hiện một điểm lớn của cố gắng để được "tiêu chuẩn tuân thủ".

Để trình duyệt tuân thủ chuẩn, trình duyệt phải sử dụng tiền tố của nhà cung cấp cho bất kỳ thuộc tính CSS nào mà nó hỗ trợ không phải là tiêu chuẩn W3C hoàn chỉnh. Vì vậy, bằng cách thêm tiền tố -ms-, Microsoft đã cố gắng (muộn màng) hoàn tác ô nhiễm của họ về không gian tên CSS chung.

Ngoài ra, dấu ngoặc kép được thêm vào, vì cú pháp cũ filter không có dấu ngoặc kép là CSS không hợp lệ (chủ yếu là do dấu hai chấm sau progid) và gây ra sự cố với một số trình duyệt. (Tôi đã có một ví dụ một thời gian trước đây với Firefox 3.6, nơi nó đã được thả tất cả các phong cách theo một phong cách filter xoay một yếu tố - mất lứa tuổi để làm việc ra những gì đang xảy ra).

Thực tế là Microsoft giữ nguyên khả năng tương thích ngược với cú pháp gốc filter, phần lớn là vấn đề thực dụng. MS không thể đủ khả năng để phá vỡ tất cả các trang web bằng cách sử dụng cú pháp cũ. Nhưng có một ý nghĩa mạnh mẽ từ Microsoft rằng các nhà phát triển nên sử dụng cả hai vì họ sẽ thả hỗ trợ cho phong cách cũ filter trong các phiên bản tiếp theo của IE. Khi nó bật ra, họ đã giảm hỗ trợ cho cả hai filter-ms-filer trong một ngã swoop, nhưng các tác động được đưa ra tại việc phát hành IE8 là đủ để nó trở thành đề nghị thực hành để cung cấp cả hai cú pháp trong stylesheet của bạn.

Vào thời điểm IE8 được phát hành, XHTML là hương vị mới của tháng và viết mã được xác thực hoàn hảo là đầu danh sách cho nhiều nhà phát triển. Đây có lẽ là một động lực mạnh mẽ trong việc thay đổi cú pháp để bao gồm các dấu ngoặc kép. Vì các dấu hai chấm bị lạc, không thể viết CSS để xác nhận hợp lệ theo kiểu cũ filter. Sử dụng kiểu dáng -ms-filter mới thay thế cho phép mọi người viết CSS hợp lệ. Theo ý tưởng tốt, điều này không thực sự hiệu quả vì tất nhiên mọi người phải tiếp tục sử dụng cú pháp cũ, nhưng mục đích là tốt.

Điều đáng nói là các kiểu sở hữu độc quyền khác được đưa ra cùng một cách xử lý. Ví dụ: bạn có thể sử dụng -ms-behavior trong IE8 thay vì kiểu cũ behavior. Không ai sử dụng nó. Tại sao? Tôi thực sự không biết.

Một thực tế khác đáng biết là W3C đang trong quá trình chuẩn hóa số CSS property called filter. Nó sẽ làm một công việc hoàn toàn khác với phong cách của Microsoft filter và hoạt động hoàn toàn khác. Nếu/khi nó được chuẩn hóa và các trình duyệt bắt đầu hỗ trợ nó, sẽ có một xung đột rõ ràng giữa hai cú pháp.

+2

Tôi thực sự không thích CSS3Pie. Xem [tại đây] (http://stackoverflow.com/a/7668408/937084) và [tại đây] (https://twitter.com/#!/grantmccall/status/117649720297525248). Trong trường hợp gradient, phiên bản ** filter ** hoạt động trong IE6, IE7, IE8 và IE9. Trong bản xem trước người tiêu dùng của IE10, nó chỉ hoạt động ở chế độ tương thích. Phiên bản ** - ms-filter ** hoạt động trong IE8 và IE9, nhưng * không * IE10 — ngay cả trong chế độ tương thích. IE10 sử dụng ** - ms-linear-gradient **. Dường như phiên bản ** - ms-filter ** chỉ tốt cho IE8 và IE9, nhưng cả hai đều hỗ trợ ** filter ** quá, vậy tại sao lại bận tâm với phiên bản ** - ms-filter **? – Nick

+1

Tôi đã cập nhật câu trả lời với nhiều chi tiết hơn về whys và hows of -ms-filter. – Spudley

+0

BTW - Bạn nói đúng, CSS3Pie có thể chậm. Nhưng đó là bộ lọc. Không ai trong số họ là _that_ chậm, trừ khi bạn nghiêm túc sử dụng chúng quá mức. Và CSS3Pie có một lợi thế lớn của các bộ lọc ở chỗ nó hỗ trợ màu kênh alpha cho gradient của bạn, mà kiểu bộ lọc của MS thì không. Tùy chọn khác của bạn, tất nhiên, chỉ đơn giản là sử dụng một màu sắc mùa thu lại cho IE cũ. Trừ khi nó hoàn toàn hủy hoại thiết kế trang web của bạn hoặc đối tượng của bạn có tỷ lệ người dùng IE rất cao, đôi khi nó đơn giản hơn chỉ để cho họ có màu sắc và góc vuông. – Spudley

0

Có vẻ như bạn đã trả lời câu hỏi của riêng bạn. Có, họ cần. Microsoft cố gắng để đạt được nhiều hơn phù hợp với các tiêu chuẩn có nghĩa là một số phiên bản của IE có quy tắc cú pháp hơi khác nhau của riêng mình cho thuộc tính bộ lọc.

Trong IE7 chỉ filter: theo sau là progid:DXIma... v.v. sẽ hoạt động. Nhưng đối với IE8 + có dự phòng IE7 có thể sử dụng trong chế độ tương thích và thuộc tính tiền tố -ms- thích hợp hơn cho bộ lọc, biểu thị thuộc tính css của nhà cung cấp cụ thể và giá trị của nó bên trong qoutes.

+0

Phiên bản ** bộ lọc ** hoạt động trong IE6, IE7, IE8 và IE9, nhưng * không * IE10. Phiên bản ** - ms-filter ** cũng không hoạt động trong IE10. IE10 sử dụng ** - ms-linear-gradient **. Tất nhiên, IE10 chưa chính thức, do đó, nó có thể thay đổi. Dù sao, nếu phiên bản 6-9 hỗ trợ phiên bản ** filter ** thì tại sao lại bận tâm với phiên bản ** - ms-filter **? – Nick

+0

Tôi nên thêm rằng phiên bản ** filter ** hoạt động trong chế độ tương thích của IE10, nhưng phiên bản ** - ms-filter ** không bao giờ hoạt động trong IE10 — ngay cả trong chế độ tương thích. – Nick

+0

Microsoft hiện có 2 chính sách xung đột. Đầu tiên là họ muốn tuân thủ nhiều tiêu chuẩn hơn. Đây là những gì làm cho họ giới thiệu '-ms-filter' bởi vì đó là nhiều hay ít được coi là chính xác. Sau đó, chính sách thứ hai là hỗ trợ nền tảng và tính năng của riêng họ trong thời gian dài, đây là lý do cho chế độ tương thích và toàn bộ các thuộc tính tiếp tục hoạt động vì Microsoft cho biết họ có thể dự đoán chính xác những gì ai đó muốn làm ngay cả khi được nhắm mục tiêu ở phiên bản cũ hơn của IE. Đó là yêu cầu cho sự nhầm lẫn thực sự: s – sg3s

0

Điều gì sẽ gây hại cho việc này?

Nếu trình duyệt không hiểu dòng CSS, nó sẽ bỏ qua nó.

Hai dòng CSS này gần giống nhau. Tôi sẽ nguy hiểm một đoán rằng Microsoft đã quyết định thay đổi cú pháp cho độc quyền CSS từ IE8 trở đi sử dụng tiền tố - (dấu gạch nối) mà các trình duyệt khác đã được sử dụng cho yonks.

Về mặt kỹ thuật, CSS cũng không tuân thủ W3C, vì vậy một dòng CSS độc quyền khác không thể gây hại.

Không đáng để hiểu IE ở mức tốt nhất!

+0

Bạn đã cần rất nhiều dòng lặp đi lặp lại cho một gradient duy nhất, vậy tại sao thêm một dòng khác khi nó không cần thiết? Ngoài ra, giữ phiên bản ** - ms-filter ** khi phiên bản ** filter ** hoạt động tốt sẽ đi ngược lại nguyên tắc KISS và thêm vào kích thước tệp. Tôi chỉ tò mò nếu các nhà phát triển sử dụng cả hai phiên bản có một lý do hợp lý để làm như vậy. – Nick

+0

Oh yeah, và khi xem trước người tiêu dùng của IE10, phiên bản ** - ms-filter ** không còn được hỗ trợ, vì vậy nó dường như chỉ tốt cho IE8 và IE9. – Nick

Các vấn đề liên quan