Testseite für CSS-Bugs des IE7

Autor: Dirk Jesse | highresolution.info
Stand: 23.09.2006
Testgrundlage: Internet Explorer 7 Release Candidate 1 (en)

Die nachfolgend erläuterten CSS-Bugs wurden im Zusammenhang mit Tests zur Browserkompatibilität des Internet Explorers 7 mit dem YAML-Framework entdeckt.

Korrekte Darstellung

Hinweis: Eigenschaft overflow:hidden funktioniert nicht im Quirk-Modus.

Der grüne Container erhält eine variable Breite width:auto und die Eigenschaft overflow:hidden zum Einschließen der Floats. Auf Grund der Eigenschaft overflow setzt der IE7 in seinem internen Layoutmodell das Merkmal hasLayout = true. Die nachfolgenden Floats mit negativen Margins werden im IE7 korrekt positioniert.

.float1 {
  float: left;
  width: 40%;
  margin-left: 30%;
  padding: 0;
  ...
}
.float2 {
  float: left;
  width: 30%;
  margin-left: -70%;
  padding: 0;
  ...
}
.static {
  width: auto;
  margin-left: 70%;
  ...
}
 

Bug: Eingebettete Float-Objekte und hasLayout

Hinweis: Der Bug tritt nur im standardkonformen Darstellungsmodus auf. Der Quirk-Modus ist nicht betroffen.
Screenshots: Firefox 1.5.0.3 | Internet Explorer 7 RC1

Der rote Container erhält eine variable Breite width:auto. Der IE7 setzt daher für in seinem internen Layoutmodell das Merkmal hasLayout = false. Gemäß der vom W3C festgelegten Funktionsweise werden die Floats in diesem Fall nicht vom umgebenden Container eingeschlossen. Die nachfolgenden Floats mit negativen Margins werden im IE7 falsch positioniert.

Bei normaler Positionierung ohne negative Margins entsteht im IE7 ein Leerraum zwischen den Floats und der statischen Box.

.float1 {
  float: left;
  width: 40%;
  margin-left: 0;
  padding: 0;
  ...
}
.float2 {
  float: left;
  width: 30%;
  margin-left: 0;
  padding: 0;
  ...
}
.static {
  width: auto;
  margin-left: 70%;
  ...
}

 

Bei Positionierung mit negativen Margins wird zusätzlich das Padding des Container-Divs ignoriert.

.float1 {
  float: left;
  width: 40%;
  margin-left: 30%;
  padding: 0;
  ...
}
.float2 {
  float: left;
  width: 30%;
  margin-left: -70%;
  padding: 0;
  ...
}
.static {
  width: auto;
  margin-left: 70%;
  ...
}
 

Bug: Kombination float und position:relative

Hinweis: Der Bug tritt nur im standardkonformen Darstellungsmodus auf. Der Quirk-Modus ist nicht betroffen.
Screenshots: Firefox 1.5.0.3 | Internet Explorer 7 RC1

Der rote Container erhält eine variable Breite width:auto und die Eigenschaft overflow:hidden zum Einschließen der Floats. Auf Grund der Eigenschaft overflow setzt der IE7 in seinem internen Layoutmodell das Merkmal hasLayout = true.

Zusätzlich erhalten die beiden Floats die Eigenschaft position:relative, um absolute Positionierungen innerhalb der Spalten zu ermöglichen. Bei normaler Positionierung ohne negative Margins erfolgt die Darstellung korrekt.

:-)
.float1 {
  float: left;
  position: relative;
  width: 40%;
  margin-left: 0;
  padding: 0;
  ...
}
:-)
.float2 {
  float: left;
  position: relative;
  width: 30%;
  margin-left: 0;
  padding: 0;
  ...
}
.static {
  width: auto;
  margin-left: 70%;
  ...
}

 

Bei gleichzeitiger Verwendung von position:relative und negativen Margins werden die Floatboxen abhängig von der Fensterbreite im IE7 falsch positioniert. Die Margins werden teilweise falsch interpretiert bzw. ignoriert. Die Boxen scheinen dadurch beim Verändern der Fenstergröße plötzlich hin und her zu springen. Verändern Sie zum Testen langsam die Fensterbreite des Browsers.

:-)
.float1 {
  float: left;
  position: relative;
  width: 40%;
  margin-left: 30%;
  padding: 0;
  ...
}
:-)
.float2 {
  float: left;
  position: relative;
  width: 30%;
  margin-left: -70%;
  padding: 0;
  ...
}

.static {
  width: auto;
  margin-left: 70%;
  ...
}

 

Bug: Kollabierender Margin statischer DIVs zwischen zwei Floats

Hinweis: Der Bug im standardkonformen Darstellungsmodus und im Quirk-Modus auf.
Screenshots: Firefox 1.5.0.3 | Internet Explorer 7 RC1

Eine statische Box wird zwischen zwei gegensätzlich floatenden Elementen platziert. Die statische Box erhält keine festgelegte Breite width:auto, daher setzt der IE7 intern hasLayout = false. Um zwischen den Float-Elementen zu erscheinen, werden der statischen Box die jeweiligen Breiten der Float-Elemente als rechte und linke Margins übergeben. Am Ende der statischen Box werden alle Floats mittels <p style="clear:both;">...</p> aufgehoben. Der Absatztext (Paragraph) erscheint daher unterhalb der längsten Floatbox.

Die Höhe der linken Floatbox muss kleiner sein als die Inhalte in der statischen Spalte VOR dem clearenden Paragraphen und die rechte Floatbox muss länger sein als der Inhalt der statischen Spalte. Im IE6 und 7 kollabiert in diesem Fall durch das Clearing der linke Margin der statischen Box und wird auf Null gesetzt.

.float1 {
  float: left;
  width: 30%;
  ...
}

Diese Box ist die kürzeste.

.float2 {
  float: right;
  width: 30%;
  margin: 0;
  ...
}

Diese Box ist länger als die linke Floatbox und auch länger als die Inhalte der statischen Box VOR dem clearenden Absatz.

Der Inhalt der statischen Box ist länger als float1 und kürzer als float2.

.static {
  width: auto;
  margin-left: 30%;
  margin-right: 30%;
  ...
}

Dieser Absatz beinhaltet die Eigenschaft clear:both; und sollte daher unterhalb des längsten Floatelementes platziert werden Die Höhe der statischen Box wird entsprechend ausgedehnt.