Les classes conditionnelles en HTML

Les classes conditionnelles en HTML Face aux bugs CSS sous Internet Explorer 6, 7 et 8, les classes conditionnelles offrent une solution plus efficace que les commentaires conditionnels. Décryptage.

Internet Explorer 6, 7 et parfois 8, nous mènent souvent la vie dure. Même quand on s'abaisse à leur niveau, il leur arrive de ne pas comprendre, ou d'y mettre de la mauvaise volonté.

La solution classique (comprendre: à l'ancienne) est d'utiliser des hacks CSS. Ces derniers sont déconseillés car peu fiables; en effet, on ne sait jamais à l'avance quels seront les navigateurs sur le marché dans deux ou cinq ans, et comment ils comprendront ou pas nos hacks CSS. Une deuxième solution, conseillée par Microsoft et Alsacréations, est d'utiliser les commentaires conditionnels.


Nous allons voir dans cette article que l'utilisation habituelle des commentaires conditionnels a quelques inconvénients, et proposer une technique qui combine plusieurs avantages : les classes conditionnelles.


 

Le problème des commentaires conditionnels



Les commentaires conditionnels se présentent comme des instructions dotées d'une condition (if) et qui peuvent se placer à n'importe quel endroit du document (X)HTML.


 
 <!--[if IE]>
	<link rel="stylesheet" href="styles-ie.css" media="screen">
<![endif]-->

Il s'agit d'un mécanisme propre à Internet Explorer Windows, né avec la version IE5, et qui permet d'inclure dans une page HTML, de manière valide, une portion de code qui ne sera lue et interprétée que par IE, ou par l'une ou l'autre de ses versions.

Pour information, Internet Explorer 10 ne reconnaît plus les commentaires conditionnels, il ne peut donc plus être ciblé de cette manière.

Dans notre quête de compatibilité maximale sur le navigateur de Microsoft, nous allons principalement nous servir de ce mécanisme pour faire un lien vers une feuille de styles corrective dédiée. Cette seconde feuille CSS, chargée à la suite du fichier de styles principal, aura pour but d'écraser et de rectifier au cas par cas les règles générales mal reconnues par IE, comme le montre l'illustration ci-dessous :


 
feuille css
Une seconde feuille CSS a pour but d'écraser et de rectifier au cas par cas les règles générales mal reconnues par IE. © Alsacreations

Cependant, dans la pratique, une feuille de style corrective pour Internet Explorer ne suffira pas. Vous serez souvent amenés à produire une feuille CSS spécifique à IE6 et 7, ainsi qu'une autre pour IE8. Ou pire : une feuille différente pour chacune des trois versions !

Au final, vous jonglerez avec au minimum trois feuilles de styles CSS :

 
feuille css1
Les commentaires conditionnels impliquent de jongler entre trois feuilles de styles CSS. © Alsacreations

Non seulement, nous avons à gérer plusieurs fichiers différents, mais nous ne pourrions toujours pas cibler les trois versions IE6 et IE7 et IE8 à la fois sans ajouter une nouvelle condition et feuille CSS supplémentaire.


En 2008, le développeur américain Paul Irish s'est penché sur le mécanisme des commentaires conditionnels et en a listé ces quelques désagréments :

 Les navigateurs anciens tels que IE6, IE7 et IE8 doivent charger plusieurs fichiers CSS au lieu d'un. Ces requêtes HTTP supplémentaires, ont un impact sur la vitesse d'affichage des pages.

 Certains correctifs CSS s'appliquent à toutes les versions des navigateurs (IE6, IE7, IE8). Il faudra les écrire une fois dans chaque fichier de correctifs.

 A chaque modification opérée sur styles.css, il faudra vérifier dans chacune des feuilles de correctifs CSS s'il n'y a pas également des changements à répercuter. La maintenance et l'évolution des styles CSS deviennent difficiles.

 L'emploi de commentaires conditionnels peut causer des problèmes pour les téléchargements parallèles.


L'argument des baisses de performances est non négligeable sur les versions IE6 et IE7, car il s'agit justement de navigateurs vieillots nécessitant des optimisations constantes et nombreuses en vue de ne pas handicaper leurs temps de calcul et d'affichage.


 

Une alternative ? Les classes conditionnelles



La solution proposée par Paul Irish a été initialement de créer un nom de classe spécifique à l'élément <body>, via un commentaire conditionnel et sans nécessiter d'appel vers une feuille de styles. Je préfère néanmoins l'appliquer directement à l'élément <html>, plus logique et plus souple à manipuler.

Voici une version optimisée de classe conditionnelle :

 
<!--[if lte IE 7]> <html class="ie7 oldie" lang="fr"> <![endif]--><!--[if IE 8]> <html class="ie8 oldie" lang="fr"> <![endif]-->
<!--[if gt IE 8]><!--> <html lang="fr"> <!--<![endif]-->

Vous pouvez voir cette classe conditionnelle en action sur le site www.goetter.fr/livres/css-avancees/


Le principe et les explications sont simples :

 sur les versions inférieures ou égales à Internet Explorer 7, le corps du document s'écrira <html class="ie7 oldie" lang="fr"> ;

 sur IE8, ce sera <html class="ie8 oldie" lang="fr"> ;

 sur tous les autres navigateurs (IE9+ et le reste du monde), il s'agira simplement de <html lang="fr">.


Il devient alors aisé d'appliquer une règle spécifique à IE6 et IE7 :

 
 #kiwi { /* Pour tout le monde */ 
 display: inline-block; 
}
.ie7 #kiwi { /* Pour IE6 et IE7 */ 
 display: inline;
 zoom: 1;
}

Et pour appliquer des styles à la fois sur IE6, IE7 et IE8 :

 
 #kiwi { /* Pour tout le monde */ 
 font-size: 1.2rem; 
}
.oldie #kiwi { /* Pour IE6, IE7 et IE8 */ 
 font-size: 20px; 
}

Bien que la syntaxe demeure un tantinet rebutante et qu'un ajout de codes HTML soit nécessaire, cette méthode commence à faire son chemin parmi les développeurs web aguerris (elle figure même dans le gabarit par défaut proposé par HTML5boilerplate) car ses avantages sont séduisants :

 Contrairement à ce que l'on pourrait croire, elle est parfaitement valide W3C / HTML et reconnue par tous les navigateurs,

 On cible en toute simplicité les versions d'Internet Explorer souhaitées avec .ie7, .ie8, .oldie par exemple,

 Pas de multiplication des requêtes, et des fichiers externes à vérifier et maintenir.

 


EDIT : une question de performances



Les commentaires et les classes conditionnelles posent des problèmes de performance pour les navigateurs, comme cela est souligné dans un billet du maître en la matière, Stoyan Stefanov. En effet, ils bloquent tout simplement le chargement des fichiers externes en attendant que toute la feuille de style chargée !

Pour remédier à ce souci, une astuce consiste à déclarer un commentaire conditionnel vide avant l'appel à la feuille de style :

 
 <!--[if IE]><![endif]-->
  Cette astuce est un remède au blocage des fichiers externes, elle est vivement recommandée en cas d'usage de commentaires conditionnels et de classes conditionnelles en règle générale. Cependant, il a été montré (toujours sur HTML5 Boilerplate) que dans le cas d'une classe conditionnelle appliquée sur l'élément html (comme l'exemple précédent) ne pose aucun souci de performances et de blocages. Inutile par conséquent d'ajouter un commentaire vide dans ce cas très précis.

Encore un avantage supplémentaire pour ces classes conditionnelles !


Article réalisé par Raphael (Alsacreations) sous licence Creative Commons