Niveau : Général

Dernière étape : Le cas d'Internet Explorer 6

Tutoriel par (Développeur web, Verviers (Belgique))
Créé le , mis à jour le (7405 lectures)
Tags : css, compatibilité, internet explorer

Sommaire


Dernière étape : Le cas d'Internet Explorer

Si vous retournez à l'étape précédente et que vous visualisez la page dans IE6, vous allez observer une série de problèmes, notamment de positionnement, dus à la compréhension approximative des CSS par ce navigateur. Nous allons jouer à la chasse aux différences, et les effacer une à une, en utilisant les commentaires conditionnels.

Les commentaires conditionnels

Le mécanisme des commentaires conditionnels permet d'insérer proprement (c-à-d sans devoir utiliser de "hack") dans la page du code html qui ne sera lu que par IE. Nous allons nous en servir pour ajouter une feuille de style dédiée à IE, jusqu'à la version 6 (incluse) :

<!--[if lte IE 6]>
  <link rel="stylesheet" type="text/css" href="css/ie.css" media="screen" />
<![endif]-->

C'est dans cette feuille de style que nous allons apporter les modifications nécessaires pour obtenir un affichage correct dans IE. Puisque la feuille n'est lue que par IE, ces modifications n'affecteront pas les autres navigateurs.

Pour en savoir plus, lisez notre astuce sur les commentaires conditionnels.

La plupart des soucis que l'on rencontrait avec IE6 et les versions plus anciennes ont été corrigés progressivement dans les versions plus récentes.

Les commentaires conditionnels seront donc destinés uniquement à IE 6 et  versions antérieurs.

La hauteur de la page

Sous IE 6, la page n'occupe pas toute la hauteur, car IE ne reconnaît pas la propriété min-height. Par chance (dans notre cas), IE ne comprend pas bien height, et l'interprète comme s'il s'agissait de min-height :

body {
  height: 100%;
}

La marge gauche de #content

La marge gauche affichée par IE6 pour #content est deux fois plus grande que celle voulue. C'est un bogue fréquent et connu, qui se corrige en appliquant :

#content {
  display: inline;
}

Le positionnement du pied de page

Le pied de page est de nouveau venu se placer en bas du premier écran (rappelez-vous ce qui s'est produit lors du positionnement des colonnes).

Pour forcer IE à englober les flottants dans le calcul de la hauteur de #center, il faut doter celui-ci du layout. Par exemple, en appliquant :

#center {
  overflow: visible;
  height: 1%;
}

Layout ? C'est quoi ça ?
En version très simple : c'est un mécanisme particulier du moteur de rendu d'IE, qui traite différement les éléments dotés de certaines propriétés.
hasLayout property (en) et Le concept de hasLayout dans IE/Win

Les marges supérieures des colonnes

Sous IE, le premier titre de chaque colonne est collé au header. Il suffit d'ajouter une marge dans les commentaires conditionnels :

#content, #sidebar {
  margin-top: 15px;
}

Les PNG transparents

Dans l'arrière-plan de body, on a utilisé un PNG transparent, qu'IE6 ne sait pas gérer. Il remplace les pixels transparents par des pixels gris. Nous allons utiliser une recette de chez Microsoft pour lui faire avaler la pillule : le filtre AlphaImageLoader (en).

body {
  background: none;
  filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src="css/img/global.png", sizingMethod="scale");
}

Cependant, ce n'est pas une solution miracle. Le fonctionnement de cette propriété est assez obscur et entraîne des effets indésirables. En effet, si on laisse les choses en l'état, les liens du menu ne sont plus cliquables ! De même, le défilement des zones de code ne fonctionne plus. Il faut ajouter :

body {
  position: static;
}
a, pre {
  position: relative;
}

pour récupérer un comportement normal des liens et des barres de défilement. On peut s'attendre à observer le même comportement avec tous les éléments "interactifs" de la page. Prudence, donc.

A propos de l'utilisation de filter : pour les images de fond, et pour les images en dur <img /> (en).

Le pied de page

Il reste à corriger la position du pied de page avec :

#footer {
  position: relative;
}

Félicitations, c'est terminé !

Démonstration