
IE 6 hatte tatsächlich die beste CSS-Unterstützung aller Browser, als er herauskam... vor SIEBEN Jahren. Die kleinen Fehler in seiner CSS-Unterstützung verfolgen uns bis heute. Ich erhalte immer noch Kommentare von Leuten, die jede Technik rundweg ablehnen, die in IE 6 nicht funktioniert. Obwohl ich generell davon absehe, den Einschränkungen von IE 6 nachzugeben, halte ich es dennoch für wichtig, Dinge darin so gut wie möglich richtig aussehen zu lassen. Hier sind die wichtigsten Bugs in IE, die dich jedes Mal erwischen werden.
Das Box-Modell
Dies ist vielleicht der häufigste und frustrierendste Fehler überhaupt in IE 6 und darunter. Nehmen wir an, Sie deklarieren eine Box wie diese
div#box {
width: 100px;
border: 2px solid black;
padding: 10px;
}
IE 6 berechnet die Breite der Box auf 100px.
Moderne Browser berechnen die Breite der Box auf 124px.
Diese Art von Diskrepanz kann zu RIESIGEN Layout-Problemen führen. Ich denke sogar, die IE-Version ergibt logisch etwas mehr Sinn, aber so wurde die Spezifikation nicht geschrieben. IE 6 kann es tatsächlich richtig hinbekommen, wenn Sie sich im Standardmodus befinden, was heutzutage selten ist, da bereits die Verwendung eines HTML 4.0 Transitional Doctype den Quirks-Modus und das Box-Modell-Problem auslöst.
Ich arbeite im Allgemeinen an diesem Problem vorbei, indem ich einfach keinen Abstand (padding) für Boxen verwende, die ich für das Layout nutze. Wenn diese Box einen Text in einem <p>-Element enthält, wende ich den benötigten Abstand direkt auf dieses p-Element an. Das umgeht das Problem einfach, aber es funktioniert.
Der Doppel-Abstand-Bug
Unter Verwendung unseres obigen Box-Beispiels, nehmen wir an, wir müssen diese nach rechts floaten
div#box {
float: right;
margin-right: 20px;
}
IE 6 wird die 20px auf 40px verdoppeln. Wiederum kann dies zu potenziell riesigen Layout-Problemen führen. Die üblicherweise verbreitete "Lösung" dafür ist, "display: inline;" zum Div hinzuzufügen. Ich bin mir nicht sicher, wie diese "Lösung" so viel Zuspruch gefunden hat, aber sie ist eher unpraktisch. Wir können keine statischen Breiten für Inline-Elemente festlegen, oder?
Ich umgehe diesen Bug auch gerne, wann immer möglich. Wenn Sie diese Box wirklich vom rechten Rand ihres Elternelements wegdrücken müssen, können Sie dies wahrscheinlich tun, indem Sie dem Elternelement Padding hinzufügen, was Ihre Gitterstruktur sowieso eher konsistent hält. Vergessen Sie auch nicht das Padding. Dieser Bug beeinträchtigt das Padding nicht, sodass Sie oft damit durchkommen, Padding zur benötigten Seite hinzuzufügen, um dasselbe Ergebnis zu erzielen.
Keine Min-Breiten / Min-Höhen
Das Festlegen von min-width und min-height für Elemente ist so natürlich und logisch, dass es mir manchmal Tränen in die Augen treibt, wenn ich daran denke, dass ich mich nicht darauf verlassen kann. IE 6 macht es nicht nur falsch, er ignoriert es einfach komplett. Min-height ist unglaublich nützlich für etwas wie ein Footer. Sagen wir, Ihr Footer muss mindestens 100 Pixel hoch sein, weil Sie dort ein Hintergrundbild verwenden, aber Sie möchten keine statische Höhe festlegen, da Sie möchten, dass er schön wächst, wenn beispielsweise die Textgröße deutlich erhöht wird. Min-height ist perfekt dafür, aber die alleinige Verwendung führt bei IE 6 zu keinerlei Höhe. In einer bizarren Wendung des Glücks behandelt IE 6 die normale Höhe-Eigenschaft so, wie moderne Browser min-height behandeln, sodass Sie einen "Hack" verwenden können, um dies zu beheben. Ich nenne es einen "Hack", weil ich es nicht wirklich als Hack betrachte, da es perfekt validiert.
Stepdown
Normalerweise können Sie beim Floaten von Objekten darauf zählen, dass sie sich vertikal ausrichten, bis sie brechen. Das heißt, Sie könnten, wenn Sie nicht IE 6 verwenden würden. IE 6 fügt einen Zeilenumbruch-Effekt nach jedem gefloatenen Block-Element hinzu, der zu einem "Stepdown" führt. Die Lösung hier ist, sicherzustellen, dass die Zeilenhöhe im Elternelement auf null (0) gesetzt ist oder dass die gefloatenen Elemente Inline-Elemente sind. Mehr über das Verhindern von Stepdown hier.
Keine Hover-Zustände
Die meisten modernen Browser unterstützen Hover-Zustände für praktisch jedes Element, aber nicht IE 6. IE 6 unterstützt die Hover-Pseudo-Klasse nur für Anker (<a>) Elemente, und selbst dann erhalten Sie sie nicht, wenn Ihr Anker kein href-Attribut hat. Die Lösung hier ist, eine proprietäre Lösung zu verwenden oder einfach damit zu leben, dass Sie keine Hover-Zustände für alles haben, was Sie wollen.
Keine Alpha-Transparenz-PNG-Unterstützung
Ziemlich lustig, dass Microsoft selbst das PNG-Format entwickelt hat, aber ihr eigener Browser es nicht nativ unterstützt (bis IE 7)*. Ich habe eine ganze Sammlung von verschiedenen Lösungen dafür. Beachten Sie, dass normale, nicht alpha-transparente PNG-Dateien ohne eine Lösung in IE 6 einwandfrei funktionieren und oft besser sind als ihre GIF-Schwestern.
*Update: Ich lag völlig falsch mit der Sache mit Microsoft, keine Ahnung, wie mir das in den Kopf kam. Tom Boutell hat das PNG-Format entwickelt. Danke an alle!
Also…
All diese Bugs sind entweder behebbar oder umgehbar, aber sie werden dich erwischen, wenn du nicht testest. Meine allgemeine Philosophie ist: Entwerfen Sie mit den modernsten Techniken, aber stellen Sie dann einfach sicher, dass es in älteren Versionen nicht kaputt ist.
Ausgezeichnete Aufschlüsselung, Chris.
Danke, dass du mich über das Stepdown-Problem aufgeklärt hast, ich bin selbst auf das Problem gestoßen und kannte die line-height-Lösung nicht.
Danke
Danke Chris. Ich habe von den IE-Bugs gelesen (liebte den Header LOL) und zum ersten Mal eine gute Zusammenfassung gelesen, die diese üblen Bugs auf einfache Weise angeht. :)
LOL über den Header :)
Guter Artikel, gute Methoden, um mit diesen Bugs umzugehen.
Gute Liste, Chris... IE6 kann eine echte Qual sein, dafür zu codieren!
Ich habe jedoch eine kleine Korrektur... die Inline-Lösung funktioniert hervorragend. Tatsächlich, wenn man sich die CSS-Spezifikationen ansieht (die brillanten Seitenumblätter, die sie sind), heißt es, dass, wenn ein Element gefloatet ist, es als Block-Element behandelt werden sollte und alle Display-Werte außer 'none' ignoriert werden sollten. Alle wichtigen Browser scheinen es zu ignorieren, aber anscheinend löst es die Art von Voodoo-Magie aus, die IE6 brauchte, um das Doppel-Abstand-Problem zu beheben.
Microsoft hatte nichts mit der Entwicklung von PHP zu tun. Es war hauptsächlich die Arbeit von Thomas Boutell, dem Autor von libGD.
Ups. Tippfehler. PNG nicht PHP
Ich dachte, Tom Boutell hätte das PNG-Format entwickelt http://www.libpng.org/pub/png/pnghist.html
Ich persönlich kümmere mich nicht um IE, da ich ein Firefox-Mann bin, aber ich habe den Artikel trotzdem genossen! ...und das Bild von "dem IE-Bug" LOL
Ich wusste nicht, dass MS das PNG-Format entwickelt hat. Welche Quelle hat dir diese Info gegeben?
„standards-compliant mode… ist heutzutage selten“ – Wenn Sie keinen strikten Doctype verwenden, haben Sie ein Problem. Es gibt wirklich keinen Grund mehr, Transitional zu verwenden, es sei denn, Sie kümmern sich um eine ältere Website, die nicht neu codiert werden kann.
IE7 behebt auch keine Alpha-Transparenz – es hat nicht mehr den dummen 'pinken' Hintergrund, aber es unterstützt nur 1-Bit-Alphas in Bildern, keine 8-Bit-True-Alphas. Immer noch kaputt, soweit ich das beurteilen kann.
float:left; display:inline; lässt das Element als Block erscheinen, die HTML-Spezifikation definiert, dass ein Element, das gefloatet ist, immer als Block gesetzt wird.
Eine Qualitätsressource für IE-spezifische Probleme ist Position is Everything
http://positioniseverything.net/ie-primer.html
Bester Beitrag aller Zeiten!
Der IE Box Model "Bug" tritt nur im Quirks-Modus in IE 6 und höher auf. Wikipedia bietet eine hervorragende Erklärung.
Kurze Antwort: Verwenden Sie die korrekte Doctype-Deklaration.
Wir in meiner Firma haben uns alle nach einer langen Besprechung (5 Minuten :-) ) entschieden, diese obsoletere Technologiebrowser nicht mehr zu unterstützen. Wir haben beschlossen, dass, wenn ein Kunde darauf besteht, dass wir seine Website mit IE6 zum Laufen bringen, er dafür bezahlen muss.
Wir Webdesigner müssen die Leute dazu drängen, diesen schrecklichen Browser nicht mehr zu benutzen und die Leute zum Aktualisieren zu drängen. Mein Rat: Internationaler Boykott von IE6-Webdesignern (das wäre doch eine gute Website-Idee, oder?).
Guter Beitrag, aber um Himmels willen, lernen Sie den Unterschied zwischen „its“ und „it’s“. Sie haben sie jedes Mal falsch.
Danke für die Info über die Bugs.
Ich wünschte, alle würden auf IE7 umsteigen und IE6 endgültig loswerden. Dann müsste ich mich nur noch mit den Bugs eines IE-Browsers herumschlagen :p
Fantastische Zusammenfassung, Alter. Um auf das Übliche zu antworten: „Ich wünschte, die Leute würden ihren Browser aufrüsten“ – Ich denke, es ist eine sehr arrogante Haltung zu glauben, dass die meisten Benutzer das Herunterladen und Installieren verstehen... ganz zu schweigen davon, dass es andere Browser gibt.
Ich würde vorschlagen, die Benutzer auf Ihrer Website darüber aufzuklären, warum IE7/FF eine gute Alternative ist. Auch denke ich, dass das Betriebssystem die eigentliche Sache ist, die IE6 killen wird.
Also in etwa 5 Jahren werden wir bei IE7 sein... dann 10 Jahre und es wird IE8 sein. Wenn wir Glück haben, wird Apple mit OSX und seinen Maschinen erfolgreicher sein... und Safari wird endlich das Licht der Welt erblicken.
Den Abstimmungsergebnissen auf der rechten Seite dieser Seite fehlt ein 1%.
Auch nicht jeder darf nach Belieben aufrüsten. Kürzlich wurden wir in meinem Unternehmen firmenweit auf IE6 herabgestuft. Stell dir das mal vor. Aber wir sind im Arsch, wenn es um diese Seiten geht, die denken, wir seien zu "ignorant", um aufzurüsten.
CSS ist einfach zu schwer... dank IE6 (und 7...)
„die bloße Verwendung eines HTML 4.0 Transitional Doctype löst den Quirks-Modus und das Box-Modell-Problem aus.“
Laut PPK[1] – „Beachten Sie, dass Ihre Seite nicht nach dem gewählten Doctype validieren muss, die bloße Anwesenheit des Doctype-Tags reicht aus, um den Strict-Modus auszulösen.“
Beachten Sie, dass das Einfügen von *etwas* vor dem DOCTYPE im Quirks-Modus in IE 6 den Quirks-Modus auslöst. Vielleicht ist Ihnen das passiert?
@hiro protagonist: „IE7 behebt auch keine Alpha-Transparenz.“ – Welche Probleme haben Sie? Ich verwende 32-Bit-PNGs mit Transparenz recht häufig, und bisher war alles in Ordnung. FWIW verwende ich PNG-8 für IE 5/6, wenn ich dort Transparenz wünsche. PNG-8 bietet binäre Transparenz in IE 5/6 und Alpha-Transparenz anderswo.
[1] http://www.quirksmode.org/css/quirksmode.html
Gut gesagt!! Die oben genannten Gründe sagen uns klar und deutlich, dass wir uns größeren und besseren Dingen zuwenden sollten, wie Firefox. IE 6 und PHP lieben sich eindeutig nicht. Es gibt einige weitere Störungen in Bezug auf Tabellen. Abhishek http://www.dibugs.com
Ahh, ich stimme so zu – ein guter intelligenter Artikel, der mehr als nur „wahh IE sucks“ behandelt. :)
Gute Zusammenfassung. Ich habe nach solchen Beiträgen gesucht, da ich für alle außer IE perfekt codiert habe. Es macht mich wahnsinnig.
Eine weitere Lösung für Breiten-/Abstandsprobleme wäre die Verwendung eines IE-spezifischen Stylesheets und die Änderung der Breiten (sagen wir von 100 auf 120px in diesem Beispiel).
Ich bin (noch) kein fortgeschrittener Designer, aber ich verstehe nicht, warum IE-spezifische Hacks (mit Selektoren, html> und *) und IE-Stylesheets in diesem Beitrag ignoriert wurden.
Liegt es daran, dass es in diesem Beitrag nur ums Coden ohne Hacks für IE geht? Oh, Moment, dann wären PNG-Hacks gar nicht erst da gewesen.
Ich bin mir also immer noch nicht sicher, warum die oben genannten Methoden nicht verwendet werden.
GESTOLPERT!
Ich hasse IE, mehr Zeit wird verschwendet, um sich Lösungen dafür auszudenken und hinzuzufügen.
FÜR diesen Beitrag abgestimmt bei
http://www.newsdots.com/tutorials/ie-css-bugs-thatrsquoll-get-you-every-time-css-tricks/
Es ist großartig, zugelassene CSS in dem min-height "Hack" zu verwenden. Anstatt sich auf JavaScripts oder die IE-eigene Eigenschaft
expressionfür Berechnungen zu verlassen, würden Sie einfach sagen: "Nein, IE6/5.5-Benutzer, ich werde meine Arbeit wegen Ihres alten Browsers nicht schwieriger machen als sie bereits ist.".Oh, und was ist mit der Archiv-/Sitemap-Seite? (/archives/) Es sieht so aus, als ob die Titel die Zeilen durchbrechen und die Werbeleiste nach unten zwingen.
Du hast dein Box-Modell falsch
-----------------------------------
div#box {
width: 100px;
border: 2px solid black;
padding: 10px;
}
IE 6 berechnet die Breite der Box auf 100px.
Moderne Browser berechnen die Breite der Box auf 124px.
-----------------------------------
IE 6 (im Quirks-Modus) wird das Padding und den Border in die Breite einbeziehen (124px).
Moderne Browser berechnen die Breite der Box nur als INHALTSbreite (100px)
@Magenta Placenta: Das ist nicht ganz richtig. IE 6 im Quirks-Modus bezieht tatsächlich Padding und Border in die Breite ein, wendet das Padding aber innerhalb der Box an und die Gesamtbreite beträgt 100px – DÜNNER als bei modernen Browsern. Ich weiß, das Foto auf der Wikipedia-Seite ist da irreführend.
div#box {
width: 100px;
border: 2px solid black;
padding: 10px;
}
was ich manchmal mache ist
div#box {
width: 124px;
border: 2px solid black;
padding: 10px;
max-width:100px;
}
es hilft wirklich :) IE rendert es gut :) wenn es funktioniert – ist es ok :)
und sehr wichtig sind auch [IF IE] Kommentare
schöner Artikel
Nur aus Neugier frage ich mich, wie lange wir uns in Zukunft noch mit IE6-Quirks wie diesen auseinandersetzen müssen. Zum Beispiel ignorieren die meisten Designer, die ich kenne, jetzt die Bugs von Netscape 4.0, aber bis etwa 2005 wurden Designer erwartet, ihre Websites für N4.0 anzupassen.
„Beachten Sie, dass normale, nicht alpha-transparente PNG-Dateien ohne eine Lösung in IE 6 einwandfrei funktionieren und oft besser sind als ihre GIF-Schwestern.“
Ich stimme dem letzten Teil des Satzes zu, aber nicht dem ersten: Normale, nicht alpha-transparente PNGs werden von IE6 auch nicht korrekt angezeigt. Sie erscheinen dunkler. Ich spreche nicht von einem Wert von 0,00001 %, sondern von etwas, das man mit bloßem Auge und einem normalen Monitor deutlich sehen kann. Es kann Ihr Layout zerstören, wenn ein JPEG-Bild neben einem PNG liegt.
TweakPNG hilft hier ;)
Sehr informativer Beitrag, danke. JanBs Punkt über lästige PNGs ist ebenfalls erwähnenswert. Das Mischen von JPGs, GIFs und PNGs kann problematisch sein. Ich kann es kaum erwarten, mich von IE6 zu verabschieden.
versuchen Sie http://browsershots.org/
Wenn ich eine Website entwerfe, versuche ich immer, sie unter Linux, Mac OS und Windows anzuzeigen. Das spart viel Zeit. Ich bevorzuge Firefox gegenüber IE. Meine Website sieht in IE8 schlechter aus, ich weiß nicht warum...
Wie finden Sie browsershots.org? Ist es akkurat?
display:inline; sorgt nur dafür, dass IE6 die Abstände nicht verdoppelt, die Elemente werden immer noch als Blöcke gerendert – es ist ein Bug, um einen Bug zu beheben.
Ich bevorzuge Firefox über IE, denn Firefox zeigt mir immer ein besseres Design und unterstützt PNG-Hintergrundbilder.
Hallo!!
Das ist definitiv sehr nützlich und ich liebe es.
Danke.
jitendra
Toller Artikel. Es gibt nichts Schlimmeres, als ein Design perfekt zu haben und sich großartig zu fühlen, und dann in IE6 nachzusehen und es sieht schändlich aus.
Ich finde, dass ein Browser ein Div öfter so rendern soll, wie es IE tut, das heißt, zusätzliche Dinge wie Padding und Margin werden ins Div hinein gesetzt und Margin wird nach außen gesetzt. So kann ich als Designer eine Pixeldimension für Breite und Höhe deklarieren, ein schönes Padding einstellen, um den Inhalt einzurücken, und dann muss ich nicht stundenlang manuell berechnen, wie groß das Div wirklich gerendert wird, als wäre es 1932. Wie kann ich nicht-IE-Browser dazu bringen, das zu tun?
@seth: Ich stimme zu, dass sich das richtiger anfühlt, aber es widerspricht jetzt lange etablierten Standards. Es bedarf nur einer geringfügigen Anpassung des Denkens und das echte Box-Modell ist genauso einfach zu handhaben.
Wenn Sie unbedingt das fehlerhafte IE 6-Modell verwenden möchten, hat Firefox tatsächlich ein proprietäres CSS-Attribut, um es sich so verhalten zu lassen. Für Opera oder Safari gibt es nichts, daher würde ich es nicht wirklich für etwas anderes als Tests empfehlen.
Toller Artikel, und diese IE-Bugs sind manchmal das Beste, was wir haben. PNG-Unterstützung ist ein interessantes Thema, das ich gerne vertiefen würde. Probieren Sie ein 8-Bit-PNG in IE6 neben demselben in FF2. Liebe die Gamma-Unterschiede... und es gibt Wege, dies zu beheben, indem man Chunks aus dem PNG löscht (ich benutze TweakPNG). Die meisten Leute bemerken es nicht einmal...
Ein ausgezeichneter Artikel, den ich schon oft genutzt habe! Toll, all diese Bugs an einem Ort aufgelistet zu haben. Ich kann es jedoch kaum erwarten, IE6 komplett aufzugeben. Schauen Sie unter http://www.atomised.coop/blog nach meinen Gedanken dazu.
Und wenn Sie können, treten Sie dem DeathMarch bei!
Toller Artikel. Ich kämpfe seit 2 Tagen mit IE6 und dem Double Margin. Habe mein Problem endlich gelöst. Danke!
Gute Liste, aber du hast den (un)berühmten Pee-a-boo-Bug vergessen.
http://www.positioniseverything.net/explorer/peekaboo.html
Ich persönlich kümmere mich nicht um IE, da ich Firefox benutze.
Hallo,
Ich bin neu in Sachen CSS. Ich muss die Margin-Eigenschaft nur für IE6 in der folgenden Anweisung implementieren
In der obigen Anweisung wird margin-left:-17px für IE und -moz-margin-start:8px für Mozilla verwendet. Ich möchte die Mozilla-Eigenschaft aus dem Stil entfernen. und die margin-left-Eigenschaft soll nur für IE6 funktionieren.
Bitte hilf mir.
Vielen Dank im Voraus…
display:inline; sorgt nur dafür, dass IE6 die Abstände nicht verdoppelt, die Elemente werden immer noch als Blöcke gerendert – es ist ein Bug, um einen Bug zu beheben.
Kurze Info
verwenden Sie * html {} /* für ie6 */
verwenden Sie *+html {} /* für ie7 */
ok, es ist schnell und schmutzig, aber es validiert.. besser unterschiedliche Stylesheets für unterschiedliche Browser hinzufügen.
Grüße
artd
Ich habe eine einfache Lösung für den Doppel-Abstand-Bug und verschiedene andere Breiten-/Anzeigeprobleme gefunden, indem ich Folgendes verwende:
display: inline-block;
Ich bin mir nicht sicher, wie das wirklich funktioniert, aber es kombiniert beide Inline- und Block-Anzeigen, was bedeutet, dass das Element immer noch Inline ist, während es die Block-Level-Stile von Padding, fester Breite usw. zulässt.
Das ist definitiv sehr nützlich und ich liebe es.
Danke. :D großartige Arbeit
Toller Artikel, danke.
Ich habe so viel Zeit damit verschwendet, mit CSS für verschiedene Browser zu basteln. Wann werden sie sich endlich darauf einigen, alles auf dieselbe Weise anzuzeigen? Ich habe Tabellen mehr bevorzugt, denn zumindest wusste man, dass das Layout in jedem Browser gleich aussehen würde!
habe gerade diesen Artikel gefunden.
„display: inline;“ funktioniert zur Beseitigung des Doppel-Abstand-Bugs, da gefloatete Elemente naturgemäß Block-Level-Elemente sind. Es spielt keine Rolle, ob „display: inline“ auf dieses Element angewendet wird. Moderne Browser ignorieren solchen Unsinn einfach, aber IE 6 versteht ihn.
Außerdem sollten alle gefloateten Elemente eine deklarierte Breite haben.
Tolle Seite mit vielen nützlichen Tipps.
Ummm.. Ich habe versucht, jedes Problem hier in einem anderen Stylesheet zu beheben, doch die Hauptspalte meiner Website wird immer noch unter den Seitenleisten angezeigt, aber in Firefox funktioniert es. Haben Sie eine Idee, was hier passieren könnte?
Soweit ich weiß, ist IE 6 längst tot...
Alpha Centauri