Dla zwykłego użytkownika Internet Explorer to po prostu pierwsza linia dostępu do Internetu. Nie każdy z nich wie jednak, że jest to linia stosunkowo mało bezpieczna i niestabilna. Wiele mówi się o istniejących już od wielu lat i ciągle rozwijanych alternatywach. I pomimo, że sporo osób skusiło się już na wymianę używanej przeglądarki to rynek nie tylko najnowszej, ale i starszych odsłon IE jest nadal prężny. Zbyt prężny, co najbardziej odbija się na twórcach witryn internetowych. Niepodporządkowanie się standardom powoduje, że często aby praca wychodząca spod ich ręki była prawidłowo interpretowana przez przeglądarkę Microsoftu trzeba użyć pewnego typu zamienników…
Dlaczego dyskryminuję IE?
Bo mam przez tą przeglądarkę więcej pracy. Pracy której by nie było, gdyby wielce wykształceni, po jeszcze większych pod względem stopnia prestiżu uczelniach programiści potrafili „sklepać” ten twór porządnie, wg. istniejących od wielu lat standardów. I nie tylko mi to przysparza nerwów. Wiem, wiem – za chwilę znajdzie się tutaj jakiś specjalista z ogromnej korporacji developerskiej który wytknie mi, że nie szanuję przez to swoich klientów. Ich akurat traktuję poważnie i poświęcam swój czas w takiej ilości, aby zrobić co ma być wykonane porządnie. W hobbistycznych projektach powiem dobitnie i szczerze… w pewnym stopniu lekceważę użytkowników tegoż browsera. Przynajmniej tych którzy świadomie go używają i co najmniej w wersjach niższych niż siódemka. Bo z całej serii chłamu którą wydała korporacja z Redmond tylko ostatnia, „stabilna” (z nazwy) wersja choć odrobinę pokrywa się z wyznaczonymi regułami. Użytkownikom wersji szóstej… współczuję, a ci którzy z premedytacją korzystają z jeszcze starszych odsłon nie zasługują nawet na to.
Żeby nie być gołosłownym wypadałoby podać kilka przyczyn moich ostrych słów.
- ilość wykrywanych luk i prędkość ich łatania jest niekiedy zastraszająco długa – przykładem są tutaj niektóre błędy opisane na Secunii (dla IE7 w tym przypadku).
- fakt braku wsparcia dla wersji niższych niż szósta tej przeglądarki, a co za tym idzie niełatanie dziur wykrywanych w nich (niemiło byłoby wstać kiedyś rano i zobaczyć, że konto bankowe z którego korzystaliśmy dzień wcześniej poprzez przeglądarkę z Redmond jest puste, prawda?).
- pomimo zrobienia kilku kroków w przód nadal MSIE jest jednym z wolniejszych tego typu rozwiązań.
- jest wiele alternatyw takich jak Firefox, Opera (recenzja Opery 9.6x), czy Safari. Są one proste w obsłudze, wręcz intuicyjne, a dzięki zaimplementowanym, dodatkowym modułom, czy wtyczkom potrafią w znaczny sposób pomóc w surfowaniu po sieci.
- alternatywne przeglądarki względnie poprawnie interpretują standardy sieciowe dotyczące wyświetlania stron przez co nigdy nie zobaczysz prawidłowo napisanej strony w niepoprawnie ułożonym stylu.
To tylko namiastka różnic. W sieci znajduje się wiele artykułów pokazujących wyższość przeglądarek, jeszcze kilka lat temu niszowych od tej promowanej przez amerykańskiego giganta. Dlatego nawracajcie swoich znajomych, bo w tym wypadku naprawdę „pozornie inne” znaczy lepsze…

Nie w jeden dzień Rzym zbudowano…
Pomimo kilku słów mojej dezaprobaty, i wielu przeszłych lat negatywnych opinii innych ludzi nie da się oczywiście z dnia na dzień nawrócić wszystkich „niewiernych” :] Dlatego meritum dzisiejszego wpisu będzie tematyka komentarzy warunkowych i haków dla „zbuntowanej” przeglądarki.

Różne typy komentarzy.
Ukryte komentarze warunkowe
Od wersji 5 Internet Explorer obsługuje ukryte (pozytywne) komentarze warunkowe (z angielskiego downlevel-hidden (positive) conditional comments). Obsługuje, ale tylko w wersji pod Windowsem (IE/Win), pod Macintoshem już nie (IE/Mac). W zależności od treści w nich zawartych są one widzialne lub nie przez daną przeglądarkę. Jest to szczególnie przydatne jeżeli dany element strony musimy inaczej opisać w IE, niż w jej zamiennikach. Za pewnie sami twórcy zorientowali się wtedy jaki dziki twór stworzyli i choć ciut chcieli się zrehabilitować pozwalając webmasterom chociażby w nadmiarowy sposób tworzyć strony zgodne z ich „dziełem”.
<!--[if IE]>
kod pomiędzy tymi komentarzami zadziała tylko w odsłonach IE
<![endif]-->
Oto przykład najprostszego zastosowania komentarzy. Można ją wykorzystać np. w sekcji head w celu zaimportowania arkusza stylów wykorzystywanego przez produkt z Doliny Krzemowej.
<!--[if IE]>
<link type="text/css" rel="stylesheet" href="ie_only.css" />
<![endif]-->
Pierwszy komentarz można także stosownie modyfikować. Obowiązują tu elementy logiczne takie jak negacja, czy znane z systemów *nixowych operatory porównania. Ważnym jest także, aby wiedzieć, że komentarze te istnieją tylko w kodzie (X)HTML, więc jeśli posiadamy na stronie dla przykładu integralny arkusz stylów to nie możemy tychże warunków używać wewnątrz kodu CSS.
<!-- dla IE 5: --> <!--[if IE 5]>
<!-- dla IE niższego niż 6: --> <!--[if lt IE 6]>
<!-- dla IE równego lub niższego od 7: --> <!--[if lte IE 7]>
<!-- dla IE innego niż 5.5: --> <!--[if !IE 5.500]>
<!-- dla IE równego lub wyższego niż 6: --> <!--[if gte IE 6]>
<!-- dla IE wyższego niż 5: --> <!--[if gt IE 5]>
<!-- dla IE różnego od 6: --> <!--[if !(IE 6)]>
<!-- dla IE 5: --> <!--[if (IE 5)]>
<!-- dla IE 6 i IE 7: --> <!--[if (gt IE 5)&(lte IE 7)]>
<!-- dla IE 5 lub IE 6: --> <!--[if (IE 5)|(IE 6)]>
Jak można zobaczyć po czwartym przykładzie dozwolone jest używanie wartości „po przecinku”. Jest to tzw. wektor wersji (z angielskiego version vector) i trzeba w nim użyć 4rech znaków. W praktyce nie używa się tego prócz wersji 5.500, gdyż różnice pomiędzy poszczególnymi, bardziej skrupulatnymi odsłonami są niewielkie.
Dozwolone są także łączenia warunków za pomocą znaku & lub | oraz określanie wersji przeglądarki poprzez użycie nawiasów.

Operatory porównania wraz z negacją.
Jest także jeszcze jedna konstrukcja ukrytych komentarzy która pozwala na wysyłanie partii kodu tylko do przeglądarek innych niż IE (a dokładniej ukrywa ona go przed Internet Explorerem). Początkowo miały to wykonywać komentarze odkryte (o których będzie w dalszej części artykułu), ponieważ jednak ingerują one w prawidłowość struktury HTML to można to zrobić poprzez następującą formę.
<!--[if !IE]><!-->
kod pomiędzy tymi komentarzami zadziała w przeglądarkach innych niż IE
<!--<![endif]-->
Posiłkując się ostatnim wersem możemy skonstruować kod który będzie wyświetlał różny tekst w zależności od rodzaju przeglądarki.
<body>
<p>
Używasz
<!--[if !IE]><!-->
diabelsko dobrej, alternatywnej przeglądarki!
<!--<![endif]-->
<!--[if lt IE 7]>
archaicznego i dzurawego kodu insynującego miano przeglądarki :(
<![endif]-->
<!--[if IE 7]>
przeglądarki która pretenduje do tego miana... z mizernym skutkiem :/
<![endif]-->
</p>
</body>
Co w rezultacie da (zauważ, że wynik będzie się różnił w zależności od używanej przez Ciebie przeglądarki):
Używasz: diabelsko dobrej, alternatywnej przeglądarki!
Ciekawostka w postaci odkrytych komentarzy warunkowych
Odkryte (negatywne) komentarze warunkowe (z angielskiego downlevel-revealed (negative) conditional comments) jak już wspomniałem miały służyć do ukrywania kodu bądź tekstu przed przeglądarkami IE lub przed ich konkretnymi wersjami (np. przed wersjami obsługującymi ukryte komentarze warunkowe, czyli >= 5.0). Ich użycie powoduje, że strona przestaje być prawidłowym dokumentem (X)HTML, dlatego nie zalecam ich stosowania.
<![if !IE]>
kod pomiędzy tymi komentarzami zadziała w przeglądarkach innych niż IE
<![endif]>
Zaleca się jednak używanie alternatywnej, już wspomnianej w poprzednim paragrafie techniki „pozytywnych komentarzy”.
<!--[if !IE]><!-->
<script src="ie_javascript.js" type="text/javascript"></script>
<!--<![endif]-->
Anglojęzyczne tłumaczenie specyfiki komentarzy warunkowych można zaczerpnąć z MSDN.
Elementarz komentarzy warunkowych w JavaScript / JScript!
Nie każdy wie, że od 4rtej odsłony MSIE także komentarze warunkowe dostępne są w kodzie Javascript / JScript.
<script type="text/javascript">
/*@cc_on
Kod warunkowy
@*/
</script>
W dyrektywę /*@cc_on i @*/ wstawiamy kod warunkowy. Pierwsza fraza pochodzi od angielskiego Conditional Compilation, czyli po polsku kompilacja warunkowa.
Same warunki opierają się o dyrektywy @if (jeżeli), @elif (inaczej jeżeli), @else (ostatecznie jeżeli) i @end (ostateczna wytyczna). Same użycie instrukcji warunkowych nie pozwoli nam na sprawdzenie jakiej przeglądarki używa użytkownik. Należy po danej nazwie dyrektywy dodać @*/ co spowoduje, że zostanie wykonana ona w przeglądarkach alternatywnych.
/*@cc_on
@if (@_x86)
document.write("Przeglądarka IE, 32bitowy procesor Intela")
@else
document.write("Przeglądarka IE, inny procesor");
@end
@*/
Nie umieściliśmy po pierwszym warunku podanego wyżej ciągu znaków, dlatego obydwa warunki zostaną wykonane w wypadku Internet Explorera. Można jednak zmusić skrypt do odniesienia się w przypadku @else tylko jeżeli nie korzystamy z IE.
/*@cc_on
/*@if (@_x86)
document.write("Przeglądarka IE, 32bitowy procesor Intela")
@else @*/
document.write("Przeglądarka alternatywna, inny procesor");
/*@end
@*/
W tym wypadku część document.write("Przeglądarka alternatywna, inny procesor"); została odkomentowana i zostanie wykonana w przypadku użycia alternatywnych browserów.
Można spytać w tym momencie: „w jaki sposób wykryć wersję Microsoftowskiej przeglądarki?”. W dwóch wcześniejszych przykładach zawarłem warunki z argumentem tego typu: @_x86. Jest to jedna z wbudowanych, przedefiniowanych zmiennych których ogółem jest dwanaście (o tylu przynajmniej wiem, a jedną z nich celowo pominąłem z racji zwracania stałej wartości).

Predefiniowane zmienne kompilacji warunkowych.
Dla przykładu wykorzystując wiedzę o tym, że wersja JScript 3.x była zaimplementowana w IE4, wersja 4 do 5.5 w IE5+, a 5.6 w IE6 możemy poprzez użycie zmiennej @_jscript_version utworzyć odpowiednie komentarze warunkowe.
/*@cc_on
/*@if (@_jscript_version < 4)
document.write("Internet Explorer 4");
@elif (@_jscript_version <= 5.5)
document.write("Internet Explorer 5+");
@elif (@_jscript_version == 5.6)
document.write("Internet Explorer 6/7");
@else @*/
document.write("Alternatywa :D");
/*@end
@*/
Ostatecznie jeżeli będziemy mieć taką potrzebę możemy posiłkować się użyciem własnych zmiennych, definiując je poprzez dyrektywę @set.
/*@cc_on
@set zmiennax = 4;
@set zmiennay = @_jscript_version;
/*@if (@zmiennay != @zmiennax)
document.write("To nie jest IE4!")
@else
document.write("IE4 :(");
@end
@*/
Ciekawostka numer dwa – tag comment
Drugą ciekawostką dzisiejszego artykułu której nie powinno się stosować z tego samego powodu co poprzedniej jest tag comment. Nie jest to standardowy znacznik ani HTML-a, ani XHTML-a. IE potraktuje go jako zwykły komentarz. Inne przeglądarki powinny za to wyświetlić tekst znajdujący się w nim. Dodatkową różnicą jest fakt, że w tym wypadku i IE/Win, i IE/Mac tak samo wspierają tą „funkcjonalność”, przez co tekst będzie niewidoczny w obydwu wersjach.
<p>To <comment>nie</comment> jest MSIE.</p>
To nie jest MSIE.
Omijamy niedoskonałości interpretowania CSS przez MSIE (haki)
Haki CSS to konstrukcje zmieszania różnorodnych znaków z regułami dostępnymi standardowo w arkuszach stylów. Nowoczesne przeglądarki takie konstrukcje w zależności od formy pominą lub zmodyfikują do prawidłowego stylu. IE ich nie ignoruje, po prostu na nich operuje. Nawet w siódmej odsłonie…
Standardowym hakiem jest użycie * przed daną dyrektywą CSS. Zadziała ona we wszystkich wersjach tej przeglądarki, poczynając od piątki i patrząc wzwyż.
p {
background-color: #fff;
* background-color: #000; /* zadziala tylko w 8 > IE > 4 */
}
Krótko wyjaśniając. Wszystkim przeglądarkom obsługującym arkusze stylów zostanie przekazany biały kolor tła dla elementu p, z tymże dla Internet Explorera dodatkowo dyrektywa ta zostanie nadpisana tak, że w rezultacie kolor tego tła będzie w nim czarny (druga linijka).
* html #id {
background-color: #ccc; /* nada elementowi o identyfikatorze id tło o odcieniu szarym */
}
Oto inny sposób użycia „gwiazdki”. Sposób który działa tylko i wyłącznie na IE6.
*+html #id {
background-color: #ccc; /* nada elementowi o identyfikatorze id tło o odcieniu szarym */
}
Jak przypomniał _wsl z webhosting.pl, aby wyselekcjonować właściwości w selektorze tylko dla IE7 należy posłużyć się powyższa konstrukcją, która od poprzedniej różni się tylko plusem umieszczonym za znakiem gwiazdki. Obydwa powyższe przykłady są zgodne ze standardami CSS.
Jeśli na początku właściwości umieścimy znak _ to ograniczymy renderowanie dla wersji 5.5 i 6.0. Dodanie podkreślenia, bądź myślnika (co znane jest z używania rozszerzeń poszczególnych przeglądarek, opisywanych przeze mnie np. tutaj) jest dozwolone wg. specyfikacji co znaczy, że użycie takiej formy dyrektywy nie pozbywa nas walidacji dokumentu CSS.
div#special p {
margin-left: 10px;
_margin-left: 15px; /* styl zadziała tylko w IE5.5 i IE6 */
}
W podobny sposób poprzez użycie backslasha (\) wewnątrz właściwości możemy ograniczyć jej działanie do przeglądarek (!IE) z numerkami innymi niż 5.x (czyli praktycznie zezwolić na działanie w każdej innej wersji i we wszystkich pozostałych browserach). Należy wiedzieć także, że hak ten nie zadziała jeżeli ukośnik wsteczny umieścimy na początku frazy.
#container {
width: 250px;
widt\h: 500px; /* tylko dla IE5.x szerokość nie zostanie nadpisana do 500px */
}
#withBorder {
border: 1px solid #ccc;
bor\der: 5px solid #ccc; /* tylko dla IE5.x szerokość krawędzi nie zostanie nadpisana do 5px */
}
Idąc za rozwiązaniem na Tantek.com możemy uzyskać powyższy wynik także poprzez następującą konstrukcję.
.hack {
height: 800px; /* dla IE5.x/Windows */
voice-family: "\"}\""; /* selektor nie bedzie dalej przetwarzany dla powyzszego przykladu */
voice-family: inherit;
height: 640px; /* nadpisanie w alternatywach */
}
Podatne na ten błąd wersje możemy oczywiście zmusić w inny sposób do prawidłowej interpretacji arkusza.
html>body .hack { /* bez spacji przy > */
height: 640px;
}
Komuś może nasunąć się teraz pytanie, jak odróżnić już wspomniane przeze mnie tutaj wersje piątą na Macinthosha i Windowsa?
/* poczatek dla IE5/Mac \*/
#ieMac {
height: 50px;
}
/* koniec */
Oto konstrukcja którą należy użyć, aby zaaprobować styl pod IE/Mac.
/* poczatek dla innych niz IE5/Mac *//*/
#notIeMac {
height: 150px;
}
/* */
A tak wyglądałoby to dla przeglądarek innych niż IE/Mac. Bardzo fajnie (w języku angielskim) jest to opisane na StopDesign.
Co mogliście zauważyć większość z tych metod pomija siódme wydanie Internet Explorera. Developerzy tej wersji już dawno na swoim blogu pisali, aby usunąć ze swoich stron haki. W najnowszej wersji przeglądarki został zastosowany tryb zbliżonej kompatybilności z standardami, pewnie stąd te zalecenia. Nie mniej jednak grupa konstrukcji związanych z własnościami pozostała i po części została rozszerzona.
/* zbior hackow dla IE7 */
html {
` background: #cdcdcd;
~ background: #cdcdcd;
! background: #cdcdcd;
@ background: #cdcdcd;
# background: #cdcdcd;
$ background: #cdcdcd;
% background: #cdcdcd;
^ background: #cdcdcd;
& background: #cdcdcd;
* background: #cdcdcd;
( background: #cdcdcd;
) background: #cdcdcd;
= background: #cdcdcd;
+ background: #cdcdcd;
[ background: #cdcdcd;
] background: #cdcdcd;
{ background: #cdcdcd;
| background: #cdcdcd;
, background: #cdcdcd;
< background: #cdcdcd;
. background: #cdcdcd;
> background: #cdcdcd;
/ background: #cdcdcd;
? background: #cdcdcd;
}
Znakami które sprawiają, że IE7 zaczyna interpretować regułę są więc praktycznie wszystkie dostępne spoza polskiego alfabetu na standardowej klawiaturze użytkownika. Co ciekawsze można je w specyficzny sposób łączyć co daje efekt równoznaczny z pojedynczą linią ostatniego przykładu z tymże dla poprzednich odsłon browsera.
.zlaczone {
`~!@#$%^&* background: #cdcdcd; /* < IE 7 */
}
We wszystkich wersjach obsługujących haki prócz siódmej (jej niestabilne odsłony są jednak jeszcze podatne na ten błąd) możemy do właściwości dodać !important o wyższym priorytecie niż zwykła reguła i nieobsługiwanym w takim wypadku przez wcześniej wymienione przeglądarki.
div#dzialanieImportant {
width: 800px !important; /* inne */
width: 640px; /* IE5.x / IE6.x / IE7beta */
}
No i na finiszu zarys rozszerzenia expressions
Kiedy każda z powyższych metod zawodzi z ostateczną pomocą (pomijając rozwiązania zewnętrzne) przychodzi nam metoda zaawansowanego użytkowania haków z poziomu CSS, czyli rozszerzenie expressions.
expressions (dynamiczne właściwości) – rozszerzenie przeglądarek IE (włącznie z siódmą odsłoną) pozwalające na używanie pseudokodu JavaScript (gdyż jest on ograniczony strukturą CSS, czego przykładem jest brak możliwości deklaracji zmiennych za pomocą var, czy używanie przecinków zamiast średników) na elementach arkusza stylów.
Składnia:
blok {
własciwość: expression(JavaScript);
}
Nie przeprowadzę tu wykładu na temat JavaScript, którego znajomość jest niezbędna do operowania na expressions. Podam jednak kilka przykładów obrazujących co może być parametrem tego rozszerzenia.
Elementarnymi słowami kluczowymi są document (będący obiektem) oraz this (będący referencją do aktualnie przetwarzanego obiektu). W pierwszym wypadku używając odpowiednich właściwości możemy na przykład ustawić absolutną pozycję danego elementu względem rozmiarów okna przeglądarki, bądź nadać stronie maksymalną, dozwoloną szerokość względem rozdzielczości ekranu użytkownika (czego nie da się zrobić w starszych odsłonach Internet Explorera z powodu nie obsługiwania przez nie dyrektyw max-height, min-height, max-width i min-width). Przedstawiam dwa przykłady, które tylko i wyłącznie mają zobrazować możliwości operowania JS-em w kodzie CSS.
div#container {
max-width: 800px;
/* ponizej mamy dwa przyklady tzw. wyrazenia dynamicznego */
width: expression(document.body.clientWidth > 800 ? "800px" : "100%"); /* ustawi 800px szerokosci jezeli szerokosc klienta jest wieksza niz 800px, w przeciwnym wypadku nastąpi skalowanie do tej wartosci */
min-height: 600px;
height: expression(document.body.clientHeight < 600 ? "100%" : "600px"); /* ustawi 100% wysokosci jezeli wysokosc klienta jest mniejsza niz 600px, w przeciwnym wypadku nastąpi skalowanie do tej wartosci */
}
p#logo {
position: absolute;
left: expression((document.body.offsetWidth - 500) + "px"); /* ustalenie pozycji lewej wzgledem szerokosci okna przegladarki - dla XHTML nalezaloby posilkowac sie obiektem window */
bottom: expression((document.body.offsetHeight - 200) + "px"); /* ustalenie pozycji dolnej wzgledem wysokosci okna przegladarki - dla XHTML nalezaloby posilkowac sie obiektem window */
color: expression(this.parentNode.lastChild.style.color = '#f0f0f0'); /* ustalenie koloru czcionki ostatniego potomka rodzica przetwarzanego elementu DOM */
width: 300px;
height: 20px;
}
W wypadku zmiany koloru skorzystaliśmy z konstrukcji odniesienia się do rodzica elementu (parentNode), po czym do ostatniego potomka tegoż rodzica (lastChild), by na koniec po prostu nadać pożądany kolor (style.color).
W wypadku stylów możemy nadać wartość własności także poprzez setProperty() zalecane przez W3C.
color: expression(this.parentNode.lastChild.style.setProperty("color", "#f0f0f0", null)); /* forma preferowana przez w3c */
Takich własności jest oczywiście więcej, a przykładami są:
- wspomniane
parentNode – wskazuje na rodzica elementu w drzewie dokumentu,
childNodes – tablica elementów potomnych, których istnienie można sprawdzić poprzez użycie metody .hasChildNodes() lub przez sprawdzenie jej długości argumentem .length. Do danych potomków odnosimy się jak do zwykłej tablicy, czyli np. 3ci element odczytywalibyśmy w formie element.childNodes[2];,
firstChild – pierwszy element potomny,
lastChild – ostatni element potomny,
previousSibling – poprzedni element,
nextSibling – następny element,
nodeName – nazwa aktualnego elementu,
nodeValue – wartość aktualnego elementu.

Własności DOM dla drzewa dokumentu.
Korzystając z tego rozszerzenia należy to robić z reguły w osobnym arkuszu przeznaczonym tylko dla MSIE. Jeżeli robimy to jednak w arkuszu ogólnodostępnym to zaleca się poprzedzanie właściwości ciągiem -ie (podobnie jak dla przeglądarek fundacji Mozilla stosuje się -moz).
div#practiceEval {
-ie-noeval = expression(p = document.createElement("p"), this.parentNode.appendChild(p));
-ie-witheval = expression(get_width = document.body.clientWidth,
eval(if ( get_width > 800 ) {
this.appendChild(document.createTextNode(get_width))
})
);
}
I na koniec bardziej skomplikowany, finalny przykład. Pierwsza właściwość tworzy tag typu p i przenosi go na koniec zawartości rodzica. Ma on ukazać użycie przecinka zamiast średnika w wielolinijkowym kodzie. W -ie-witheval użyliśmy za to funkcji eval() dzięki której w jej parametrze mogą znajdować się wyrażenia zawierające takie elementy jak instrukcje warunkowe, czy wyłapywanie błędów. Nadal jednak niedozwolona jest deklaracja zmiennych z użyciem wyrażenia var oraz posługiwanie się średnikami w celu oddzielenia partii kodu.
Wspomniałeś coś o rozwiązaniach zewnętrznych, to znaczy?
Jednym z takich rozwiązań jest skrypt (o wielkości 1kB!) CSS Browser Selector który dzięki możliwości dodawania do właściwości nazw klasy określających przeglądarkę lub system ułatwia pisanie pod nie kodu arkusza stylów.
.win.ie5 #test {
margin: 5px
}
Powyższy kod ustawiony zostanie dla identyfikatora test i przeglądarki IE5 systemu Windows. Nadany zostanie oczywiście margines o szerokości pięciu pikseli.
Skrypt korzysta z JavaScriptu co może powodować, że nie zostanie on zaaplikowany każdemu użytkownikowi, albo zostanie to wykonane dopiero po załadowaniu DOM.
—–
Coś niezrozumiałego? Jakieś pytania? Zapraszam do komentowania.
Zapraszam do zapoznania się także z powiązanymi artykułami:
Wpis ten został opublikowany dnia:
poniedziałek, 22 Grudzień 2008 o godzinie 3:10
w działach (x)HTML, CSS, JavaScript, Webhosting.
Możesz śledzić rozwój tematu, w tym odpowiedzi dla tego artykułu poprzez kanał informacyjny RSS 2.0.
Możesz także zostawić swój komentarz lub trackbackować ze swojej własnej strony.
B. dobry art (: Dobrze jest mieć w jednym miejscu wszystkie możliwe hacki do tego ścierwa, którego przeglądarką nazwać nie można… Niestety napisać kod źródłowy stronki bez używania ich jest niemalże niewykonalne w większości wypadków, mając na względzie poprawność wyświetlania pod każdą przeglądarką. O ileż życie byłoby prostsze, gdyby nie IE :P
A może jakieś pomysły jak rozwiązać poblem walidacji CSS przy metodzie
dla półprzezroczystych obrazków .png w IE? (;
Dodać tą metodę w stylu stricte dla IE poprzez użycie ukrytych komentarzy warunkowych :] Przykładowo:
<!--[if IE]> <style type="text/css"> div { display: block; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="img.png", sizingMethod="crop") width: 550px; height: 400px; } </style> <![endif]--> <!--[if !IE]><!--> <style type="text/css"> div { display: block; float: left; background: #fff url('img.png') no-repeat; width: 550px; height: 400px; } </style> <!--<![endif]-->W wyniku walidacji otrzymamy: Dokument ten jest poprawnie napisanym arkuszem CSS wersja 2.1 ! :D
Ewentualnie można też wrzucić grafikę bez kanału alpha, ale za to wraz z background-image narzucić opacity oraz filter: alpha(opacity=50); (dla IE).
Nawet nie zdawałem sobie sprawy, że od strony technicznej IE jest aż tak zacofane, a raczej niedorozwinięte ;] Ile się namęczyłem jak robiłem do szkoły stronę… Pod ff i operą wyglądała elegancko, a IE nie mogło sobie dać rady z:
a:hover { color:#1E0816; background-color:white; font-style: italic; }Programistą nie jestem ale po odjechaniu kursorem z interesującego odnośnika robił się pomarańczowy prostokąt… Tylko w IE ;]
Panowie w komentarzach jest (a przynajmniej powinien :D) dostępny BBCode (np. [code], [html], [css], itp.) ;]
i mnie się bardzo artykuł podobał:] szczególnie jeśli chodzi o część związaną z css.. o, której wstyd przyznać nie miałem pojęcia..
Fajny mały poradnik w tego typu sprawach, bo nie raz nie dwa, miało się, czy będzie się miało z tym problemy;]
Pozdrawiam;]
Mnie tylko od jakiegoś czasu zastanawia po co my (webmasterzy) to robimy? Z jednej strony klniemy na to ie6 (bo jednak ie7 to dar niebos w porównaniu z ie6), a z drugiej stajemy na rzęsach, zeby to ie6 utrzymać przy życiu. No bo czym innym są tego typu hacki?
Co do samego artykułu to świetny. Zestaw ostatnich desek ratunku w przypadku, kiedy strona działa wszędzie poza MSIE…
Cieszy mnie, że się Wam podoba :D Obawiałem się, że znowu napisałem zbyt dużo i po którymś akapicie ludzie padną ;] A dzi3ciol na to jeszcze, że „mały poradnik”… oj bo zacznę pisać więcej hahaha! (już słyszę te krzyki „nieeee! tylko nie to!!!”) ;]
Co do kwestii dlaczego my to robimy. Hmmm… wydaję mi się, że główny problem leży w różnych studiach developerskich. Szczególnie tych większych, tych które obsługują poważne firmy. Tam wymaga się, aby dana strona działała pod IE i twórcy nie mają wyjścia, bo ta przeglądarka nadal ma spory udział w rynku. A przecież taki np. bank nie zrezygnuje z kilkudziesięciu procent klientów. Oczywiście mogliby oni przeprowadzić jakąś kampanię nawracania swoich klientów, pytanie tylko po co? Po co tracić pieniądze, nie wiedząc dokładnie jakie korzyści to przyniesie?
W naszym przypadku jest już ciut inaczej. Jak robisz coś hobbistycznie to możesz olać IE6. Albo ewentualnie możesz wrzucić adnotację na stronie o tym dlaczego ta strona wygląda tak, a nie inaczej pod IE. Tak jak zrobiłem to na utnij.eu. Tu jest już kwestia bardziej luźna i wszystko zależy od tego dla kogo chcemy udostępniać stronę.
Nie mniej jednak tacy freelancerzy jak my w pojedynkę za dużo nie zdziałają. Dopóki nie nawrócą się ci wielcy to możemy tylko próbować… tak mi się zdaje…
Co do większych firm to cieszy mnie, że 37signals bodajże jakiś czas temu ogłosił, że w nowych aplikacjach postanawiają zlewać ie6. To akurat dobry znak. Pewnie z czasem będą kolejni.
Niestety udział w rynku ie6 ciągle jest jaki jest (choć ma miłą tendencję). Szkoda, że MS strzelił sobie w stopę Vistą (która nie jest aż taka zła, ale w połaczeniu z trendem na krytukujemy MS oraz piękne sterowniki dało to taki efekt jaki dało) oraz zabezpieczonym autoupdaterem w XP straszącym, ze możesz mieć nielegalny system (kto przy zdrowych zmysłach będzie chciał ryzykować).
W takich chwilach z jednej strony żałuję, że IE nie ma 95% rynku. Wtedy chociaż nie było problemu.
ps. Zwiększ troszkę kontrast w textarea bo ja ledwo co w nim widzę.
Cieszmy się z tego, że przynajmniej na naszym rodzimym rynku walka alternatyw z MSIE pod względem udziałów jest w miarę wyrównana i przechyla się powolutku na korzyść tych pierwszych.
Co do kontrastu, zmieniłem – ciut przyciemniłem tekst w przyciskach i polach tekstowych. Tak to jest jak się na co dzień nie korzysta z LCD (itp.) i się nie widzi takich rzeczy :D Dzięki za zwrócenie uwagi.
[...] źródło: m1chu.eu Follow us on Twitter 1,510 śledzących RSS Feed 162 czytelników Haki CSS i komentarze warunkowe dla niepokornego Internet Explorera 1 głosuj! Kompleksowy artykuł na temat haków CSS i komentarzy warunkowych dla różnych [...]
[...] This post was mentioned on Twitter by Piotr Nalepa, cube_ice. cube_ice said: http://tinyurl.com/ykw2f5n Haki CSS i komentarze warunkowe dla niepokornego Internet Explorera | m1chu.eu – another devblog [...]
witam, u mnie pojawił się problem z IE odnośnie różnicy w wyświetlaniu opływającego tekstu obraz ( zdjęcie, a w zasadzie button ) o 3 px. tzw three pixel text jog.
Może ktoś z kolegów pomoże jak rozwiązać ten problem?
Pozdrawiam
tomazi
Jakiś screen z tego jak to wygląda?
[...] 8 086)Wstęp do programowania zorientowanego obiektowo w PHP5… (wyświetleń: 8 048)Haki CSS i komentarze warunkowe dla niepokornego Internet Explorera (wyświetleń: 7 807)Jak zabezpieczyć skrypt PHP/MySQL? Część 2: luki Local File Include (LFI) [...]
Miło spotkać kogoś o podobnych poglądach – „Nie dla MSIE”. Dzięki za ciekawy artykuł, który – mnie, laikowi i hobbyście – pomógł w zrozumieniu trudnej sztuki poskramiania IE. Pozdrawiam :)
Witam.
Cieszy mnie, że podobał Ci się artykuł. Jeżeli chcesz być jeszcze bardziej na bieżąco, kliknij „Lubię to!” w widgetcie Facebooka :]
Pozdrawiam.
m1chu
Witam,
nawet w dzisiejszych czasach można się spotkać z IE6 u klientów.
Na szczęście jest artykuł w sieci który pomoże zapobiec problemom z IE6.
Pozdrawiam,
MK