2012-04-03 8 views
5

Jak jestem pewien, wszyscy wiecie, Internet Explorer może obsługiwać proste gradienty. Oto urywek z Twitter Bootstrap, na przykład:CSS: Proste gradienty w przeglądarce Internet Explorer <= 8

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

Jednak widziałem niektórzy ludzie użyć dwóch reguł CSS (jeden dla IE < 8 i jeden dla IE 8), tak jak poniżej:

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 */ 

Moje pytanie brzmi, czy druga zasada jest naprawdę potrzebna? Twitter Bootstrap jest dość dokładny, ale nie używa żadnych reguł "-ms-filter". Zgodnie z this page, atrybut -ms-filter jest rozszerzeniem do CSS i może być używany jako synonim filtru w trybie standardów IE8.

Odpowiedz

3

Moja sugestia:

Zastosowanie CSS3Pie - http://css3pie.com/

To jest biblioteką JavaScript dla IE6, IE7 i IE8, że łaty na wsparcie dla kilku funkcji CSS3, w tym gradienty.

Tak, możesz użyć okropnych stylów IE-filter, jeśli chcesz, ale CSS3Pie pozwala używać standardowych stylów CSS dla tych funkcji. Dużo łatwiej.

Aby właściwie odpowiedzieć na bezpośrednie pytanie:

Tak, jest zazwyczaj wymagany styl -ms-filter. IE8 zawsze będzie nas używać zamiast filter, który jest używany głównie w IE6 i IE7. W niektórych przypadkach filter będzie działać w IE8, ale nie wszystkie, więc najlepiej jest użyć -ms-filter, aby zapewnić zgodność z IE8.

[EDYTORZY] Dlaczego to zmienili? Ponieważ kiedy wypuścili IE8, Microsoft bardzo się starał, aby być "zgodnymi ze standardami".

Aby przeglądarka była zgodna ze standardem, powinna używać prefiksu dostawcy dla każdej obsługiwanej przez nią usługi CSS, która nie jest sfinalizowanym standardem W3C. Dodając prefiks -ms-, Microsoft starał się (z opóźnieniem) cofnąć zanieczyszczenie globalnej przestrzeni nazw CSS.

Ponadto dodano cytaty, ponieważ stara składnia filter bez cudzysłowów była nieprawidłowa CSS (głównie z powodu dwukropka po progid) i powodowała problemy z niektórymi przeglądarkami. (Miałem kiedyś przykład z Firefoxem 3.6, w którym odrzucano wszystkie style po stylu filter, które obracały elementem - zajęło im to całe wieki, aby dowiedzieć się, co się dzieje).

Fakt, że Microsoft zachował zgodność wsteczną z oryginalną składnią filter, był w dużej mierze kwestią pragmatyzmu. MS nie mógł pozwolić sobie na złamanie wszystkich stron przy użyciu starej składni. Ale Microsoft miał silne implikacje, że deweloperzy powinni używać obu, ponieważ odrzucą wsparcie dla starego stylu filter w kolejnych wersjach IE. Okazało się, że za jednym zamachem porzucili wsparcie zarówno dla filter, jak i dla -ms-filer, ale implikacje podane po wydaniu IE8 były wystarczające, aby stać się zalecaną praktyką w celu zapewnienia obu składni w twoim arkuszu stylów.

W momencie, gdy wydano IE8, XHTML był nowym smakiem miesiąca, a pisanie kodu, który sprawdził się doskonale, było na szczycie listy dla wielu programistów. Prawdopodobnie było to silną siłą napędową zmiany składni w celu uwzględnienia cytatów. Z powodu zbłąkanych dwukropków niemożliwe jest napisanie CSS, który sprawdza poprawność przy użyciu starego stylu filter. Używanie nowych stylów -ms-filter pozwoliło ludziom pisać prawidłowe CSS. Pomysły na dobry pomysł nie sprawdziły się, ponieważ ludzie musieli nadal używać starej składni, ale intencja była dobra.

Warto podkreślić, że inne opatentowane style zostały poddane takiemu samemu traktowaniu. Na przykład możesz użyć -ms-behavior w IE8 zamiast starego stylu behavior. Nikt tego nie używa. Czemu? Naprawdę nie wiem.

Kolejnym faktem wartym poznania jest to, że W3C jest w trakcie standaryzacji modelu CSS property called filter. Wykona zupełnie inną pracę niż styl Microsoft filter i będzie działać zupełnie inaczej. Jeśli/kiedy zostanie ustandaryzowany i przeglądarki zaczną go obsługiwać, nastąpi wyraźne zderzenie między tymi dwiema składniami.

+2

Nie bardzo lubię CSS3Pie. Zobacz [tutaj] (http://stackoverflow.com/a/7668408/937084) i [tutaj] (https://twitter.com/#!/grantmccall/status/117649720297525248). W przypadku gradientów wersja ** filter ** działa w IE6, IE7, IE8 i IE9. W podglądzie klienta IE10 działa on tylko w trybie zgodności. Wersja ** - ms-filter ** działa w IE8 i IE9, ale * nie * IE10 - nawet w trybie zgodności. IE10 używa ** - ms-linear-gradient **. Wygląda na to, że wersja **-ms-filter ** jest dobra tylko dla IE8 i IE9, ale obydwie obsługują ** filtr **, więc po co zawracać sobie głowę wersją ** - ms-filter **? – Nick

+1

Uaktualniłem odpowiedź, dodając więcej szczegółów o tym, co i dlaczego -ms-filter. – Spudley

+0

BTW - Masz rację, CSS3Pie może działać wolno. Ale są też filtry. Żadne z nich nie jest powolne, chyba że poważnie nadużywasz ich. A CSS3Pie ma dużą zaletę filtrów, ponieważ obsługuje kolory kanałów alfa dla twoich gradientów, których styl filtru MS nie ma. Inną opcją, oczywiście, jest po prostu użycie płaskiego fall-back dla starego IE. O ile nie zniszczy to całkowicie projektu Twojej strony, lub twoja publiczność ma bardzo wysoki odsetek użytkowników IE, czasami łatwiej jest pozwolić im mieć płaskie kolory i kwadratowe rogi. – Spudley

0

Wygląda na to, że odpowiedziałeś na własne pytanie. Tak, są potrzebne. Microsoft, próbując uzyskać więcej zgodności ze standardami, oznacza, że ​​niektóre wersje IE mają swoje własne nieco inne reguły składni dla właściwości filtru.

W IE7 po prostu filter:, a następnie progid:DXIma... itp. Będzie działać. Ale w przypadku IE8 + istnieje możliwość użycia kreacji IE7 w trybie zgodności oraz właściwszej prefiksowanej właściwości filtra, oznaczającej właściwość css określoną przez dostawcę i jej wartość wewnątrz qoutes.

+0

Wersja ** filtra ** działa w IE6, IE7, IE8 i IE9, ale * nie * IE10. Wersja ** - ms-filter ** również nie działa w IE10. IE10 używa ** - ms-linear-gradient **. Oczywiście IE10 nie jest jeszcze oficjalny, więc może ulec zmianie. W każdym razie, jeśli wszystkie wersje 6-9 obsługują wersję ** filtra **, to po co zawracać sobie głowę wersją ** - ms-filter **? – Nick

+0

Należy dodać, że wersja ** filtra ** działa w trybie zgodności IE10, ale ** - ms-filter ** wersja nigdy nie działa w IE10 - nawet w trybie zgodności. – Nick

+0

Firma Microsoft ma obecnie 2 sprzeczne zasady. Pierwszym jest to, że chcą być bardziej zgodni ze standardami. To właśnie spowodowało, że wprowadzili '-ms-filter', ponieważ jest to mniej lub bardziej uznawane za poprawne. Druga zasada polega na wspieraniu własnej platformy i funkcji przez długi czas, dlatego też tryb zgodności i cała gama właściwości nadal działają, ponieważ Microsoft domyśla się, że potrafi dokładnie przewidzieć, co ktoś chce zrobić, mimo że był ukierunkowane na starszą wersję IE. Prosi o zamieszanie: s – sg3s

0

Jaką szkodę mógłby zrobić, aby ją zostawić?

Jeśli przeglądarka nie zrozumie linii CSS, po prostu ją zignoruje.

Te dwie linie CSS są prawie identyczne. Zaryzykowałbym przypuszczenie, że Microsoft zdecydował się na zmianę składni zastrzeżonego CSS z IE8 z wykorzystaniem prefiksu - (łącznik), którego używały inne przeglądarki dla yonków.

Technicznie CSS nie jest zgodny z W3C w żaden sposób, więc inna linia zastrzeżonego CSS nie może wyrządzić żadnej szkody.

Nie warto próbować zrozumieć IE w najlepszych czasach!

+0

Potrzebujesz już tylu powtarzających się linii dla pojedynczego gradientu, więc po co dodawać kolejną linię, gdy nie jest potrzebna? Dodatkowo, utrzymanie wersji ** - ms-filter **, gdy ** filtr ** działa dobrze, jest sprzeczne z zasadą KISS i dodaje do rozmiaru pliku. Jestem ciekawy, czy deweloperzy, którzy używają obu wersji, mają logiczny powód. – Nick

+0

O tak, i jak na konsolę w IE10, wersja **-ms-filter ** nie jest już obsługiwana, więc jest najwyraźniej dobra tylko dla IE8 i IE9. – Nick