En fait, le principal problème d'IE vient de son
calcul des dimensions. Le calcul des dimensions s'appelle le
Box Model (ou
Model Box, ou encore
Modèle de boîte). Actuellement, il existe 2 Box Model : le modèle dit
Standard, recommandé par le W3C et le
modèle de Microsoft.
Ces 2 modèles diffèrent dans le calcul des dimensions des éléments. Pour rappel voici une représentation d'un élément :
Explication des 2 Box Model
Si nous nous basons sur le modèle W3C, la largeur totale d'un élément est égale à :
margin-left + border-left + padding-left + width + padding-right + border-right + margin-right
En ce qui concerne le modèle de Microsoft, la largeur totale est égale au contenu du bloc (width). Ce qui veut dire que
les margin et les padding sont inclus à l'intérieur même de l'espace réservé au contenu.
Par exemple, un DIV se voit attribuer les propriétés suivantes :
Code : CSS1
2
3
4 | margin: 10px;
border: 1px;
padding: 5px;
width: 200px;
|
D'après le Model Box du W3C, la largeur totale du bloc sera :
10+1+5+200+5+1+10 = 232 pixels.
Et d'après le modèle de Microsoft, la largeur totale sera :
1+200+1 = 202. Les largeurs des margin et padding ne sont donc pas prises en compte. Un décalage de 30 pixels sera donc visible.
Les versions d'Internet Explorer
Internet Explorer 5.x (5.1 et 5.5) ne connaît que le modèle de boîte de Microsoft. IE 6, quand à lui intègre les 2 modèles. En présence d'un Doctype valide, il appliquera le modèle du W3C. S'il n'y a pas de Doctype, le modèle Microsoft sera utilisé, pour permettre la compatibilité avec les sites ayant été construit à l'époque d'Internet Explorer 5.x. C'est le Doctype Switching (voir partie suivante).
Si un élément (un commentaire HTML ou un prologue XML) est présent avant le Doctype, Internet Explorer utilisera le Model Box de Microsoft. Ce problème est corrigé dans la version 7.
La version 7 d'IE passe toujours en Model Box Microsoft si aucun doctype n'est présent, toujours pour maximiser la rétrocompatibilité.
Voici un exemple en code. Celui-ci est tiré de
l'article d'Openweb.
Code : CSS 1
2
3
4
5
6
7
8
9
10
11
12
13 | .jaune {
background-color: #ffff00;
width: 300px;
padding: 0;
border: 0;
}
.vert {
background-color: #00ff00;
width: 250px;
padding: 0 20px;
border-left: 5px solid #00ff00;
border-right: 5px solid #00ff00;
}
|
Code : HTML1
2 | <div class="jaune">Box 1</div>
<div class="vert">Box 2</div>
|
Avec un navigateur non-IE, les 2 DIV sont de taille identique (300px). Avec Internet Explorer, s'il passe en mode modèle boîte Microsoft, le DIV vert sera plus petit que le jaune.
Test du code :
Mais, même en respectant tout cela, et en passant en modèle Standard, il y a encore quelques différences. Pourquoi ?
Le modèle box standard est bien appliqué, mais Internet Explorer a tendance à interpréter bizarrement les marges, les paddings et autres, et c'est pour cela qu'il subsiste parfois quelques petits décalages pas bien graves.
Pour régler ce problème, nous utiliserons les instructions conditionnelles ou la règle des !important.