Méthodologie pour résoudre les problèmes d'affichage en CSS

Suite au billet qui présentait un récapitulatif des moyens pour faire un site compatible sur tous les navigateurs actuels, voici à présent une petite méthodologie pour résoudre rapidement une grande partie des bugs d'affichage pouvant survenir avec les mises en page en CSS. Cette méthodologie se veut concise et se résume en trois étapes : isoler (le ou) les éléments problématiques, identifier l'erreur, et enfin, résoudre le bug.

Isoler l'élément problématique

Un bug d'affichage est dû en général à des incompatibilités de navigateurs ou des marges (margin, padding) par défaut différentes selon les navigateurs.
La première étape à suivre est d'isoler l'élément ou les éléments qui ne se comportent pas comme vous l'aviez prévu.
Pour cela, nous allons utiliser deux techniques différentes grâce aux styles CSS : l'ajout de bordures colorées, de couleur d'arrière plan et le masquage des éléments un par un.

Ajout de bordures colorées

Actuellement, la très grande majorité des sites web est structurée à l'aide des balises <div>, <table>, <hn>, <p> et <ul>.
Les CSS offrent un moyen très simple d'isoler ces différentes balises de bloc : en leur appliquant une bordure colorée, vous bénéficierez immédiatement d'un visuel global de la structure de votre mise en page, sans toucher au contenu ni au code HTML.

En commençant votre feuille de style avec une partie ou toutes les déclarations suivantes vous aurez un aperçu de l'espace exact occupé par chacune des balises. Les tables et cellules seront entourées de noir et gris, les <div> en orange, les éléments de titre ou de paragraphes auront une bordure jaune, etc.
Ceci permettra très rapidement de mettre le doigt sur des décalages ou des erreurs d'affichage concernant l'un ou l'autre de ces éléments.

table {border: 1px solid black}
td {border: 1px dotted gray}
div {border: 1px solid orange}
img, form {border: 1px dashed blue}
h1, h2, h3, h4, h5, h6, p {border: 1px solid yellow}
ul {border: 1px solid green}
li {border: 1px solid lightgreen}
etc.

Signalons que cette technique, comme beaucoup d'autres, peut se réaliser instantanément grâce à l'extension Webdevelopper sur Firefox.

Ajout de couleur de fond

Cette étape permet de localiser les éventuels problèmes de fusion de marges. C'est un phénomène qui s'applique lorsque deux éléments de type bloc sont placés selon le flux normal, l'un sous l'autre. Dans ce cas, les marges hautes et basses fusionnent : la largeur de la marge finale devient la valeur la plus grande entre celles des marges adjacentes... ce qui peut poser certains problèmes de décalages verticaux.

Afin de déterminer ce genre de problèmes, il est conseillé de coloriser l'ensemble des éléments en leur appliquant une couleur d'arrière plan.

Notez que cette technique va se révéler fastidieuse car il sera nécéssaire de colorer chacun des éléments (div#top, ul#menu, etc.) et non des ensembles (<div>, <ul>) comme dans la méthode des bordures colorées :

ul#menu {background-color: green}
ul#menu li {background-color: lightgreen}
div#header {background-color: yellow}
etc.
Masquer les éléments un par un

Parfois, il ne suffit pas de distinguer l'élément pour comprendre le problème posé. Il se peut que l'élément provoque des décalages ou autres influences.
Dans le même ordre d'idée que la technique précédente, il peut être intéressant de masquer chaque élément un par un pour déterminer avec certitude lequel est en cause.

Pour cela, appliquons un display none successivement sur chaque élément (nommé en général par un id ou une classe).
Cette procédure sera certainement longue car nécessite un tâtonnement au cas par cas, mais peut se révéler efficace.

balise {display: none;}
etc.
Suppression de toutes les marges

Toutes les balises bloc (sauf <div>) possèdent des marges internes (padding) et externes (margin) par défaut.
Le problème est que cette valeur par défaut est différente d'un navigateur à l'autre et provoquera un rendu différent sur chaque navigateur.
Il s'agit certainement de l'explication la plus courante lorsque des décalages apparaissent entre les différentes plateformes.

Le meilleur moyen d'identifier un problème de marges sur certains éléments est de... supprimer toutes les marges de tous les éléments.

Le principe est d'utiliser le sélecteur universel (*), qui s'appliquera à toutes les balises, et d'y mettre les marges à zéro :

* {margin: 0; padding: 0;}

Commencez votre feuille de style par cette déclaration. Si les décalages involontaires disparaissent, vous aurez détecté un problème de marges par défaut. A vous ensuite d'isoler l'élément qui provoque ce décalage.

Notez qu'une discussion sur l'usage de ce sélecteur universel a été ouverte sur le forum Alsa.


Identifier l'erreur

A présent que les balises concernées sont isolées, la deuxième étape est de cerner quel est le problème posé par ces balises.

Soumission aux Validateurs

Souvent, des erreurs proviennent de la "grammaire" et de la conception même du document. Soumettre sa page aux différents Validateurs est une phase nécessaire pour détecter ces problèmes.

Passez sur le validateur (X)HTML et le validateur CSS pour cerner ces erreurs et y remédier.


Résoudre le problème

Le plus dur est fait : l'erreur est identifiée et les éléments concernés sont isolés.
A ce stade, les solutions sont souvent nombreuses. La plupart sont décrites sur cet article traitant des problèmes de compatibilité entre navigateurs.

Revenons sur les problèmes et solutions les plus fréquentes :

Modèle de boîte

Chaque élément possède des dimensions, des bordures, des marges internes (padding) et externes (margin). C'est le Modèle de boîte. Cependant, Internet Explorer se fonde sur un modèle personnel différent des autres, ce qui pose des problèmes de dimensions.
Les liens suivants vous donneront des explications et solutions à ce problème.

Positionnements et valeurs problématiques

Certains schémas de positionnement sont paradoxaux et ne peuvent s'appliquer en même temps.
Pas de solution mirace, il faut pour y remédier comprendre parfaitement les différentes formes de positionnement en CSS :

Des soucis d'un autre ordre peuvent provenir lorsque des valeurs en em ou en poucentage sont employées.
Pour le premier cas, sachez que ces unités relatives sont héritées et se réfèrent à la taille du parent.
Dans le second cas, un problème courant est celui de l'obtention d'une hauteur égale à 100% de la page.

Parentés interdites

Pour finir cette méthodologie rapide, notons que certains problèmes peuvent survenir d'une mauvaise imbrication de balises.
Vous savez que les balises se distinguent globalement en deux groupes : les éléments bloc et les élements en-ligne. Chacun des groupes a ses spécificités et les en-ligne ne peuvent pas contenir de balises de type bloc.

Mais il faut savoir qu'il existe des exceptions à cette règle de base. Connaître ces exceptions permettra de comprendre certaines erreurs des validateurs et certains défauts de mise en page.

Trackbacks

Aucun trackback pour le moment.

Les trackbacks pour ce billet sont fermés.

Evaluez ce billet

Commentaires

Le mercredi 8 décembre 2004 à 13:01, par solo :: site :: #

Merci beaucoup pour ce beau petit billet très instructif :D

Le mercredi 8 décembre 2004 à 13:29, par RNB :: #

Un article pour compléter le sujet: Common Coding Problems with HTML and CSS (www.positioniseverything....

Le mercredi 8 décembre 2004 à 13:35, par Raphael :: #

@RNB > Je ne connaissais pas cette page de PIE : c'est vraiment un monument à conserver sous le coude ! Merci.

Le mercredi 8 décembre 2004 à 13:43, par Shemu :: site :: #

Moi je suis adepte du "border coloring" ! :D

Le mercredi 8 décembre 2004 à 15:15, par Talou :: site :: #

Magnifique article ! ****

Le mercredi 8 décembre 2004 à 15:47, par Xavier :: site :: #

J'ajoute quelques commentaires concernant la fusion des marges (collapsing margin) :

1/ les règles de fusions des marges sont souvent source de surprises car lorsqu'on débute on en oublie facilement les impacts, voire on en ignore l'existence.

2/ Si IE ne respecte pas le modèle de boite standard, il ne respecte pas non plus les règles de fusion de marges ce qui rajoute à la confusion.

3/ l'ajout de bordures à fin de test peut notablement modifier l'application des règles de fusion des marges, c'est pourquoi il est parfois préférable lorsque c'est possible de donner une couleur au fond des éléments plutôt que de leur ajouter une bordure.

Le mercredi 8 décembre 2004 à 16:09, par ElMoustiko :: site :: #

Wé pour les bordures, je suis d'accord avec Xavier, l'ajout de 1px de chaque coté (ou non suivant les navigateurs) peut influer parfois, si la mise en page est dans le genre "callé au pixel près".

Sinon, pas mal le récapitulatif, je ferais bien un truc dans le style, pas pour copier, mais en complément, pour donner la méthode que j'utilise personnelement lorsque je fais une page web. Peut être que ça pourra être un petit plus pour les problèmes récurrents sur le forum par exemple...

Le mercredi 8 décembre 2004 à 16:15, par Xavier :: site :: #

De mon coté je ne parlais pas du pixel ajouté ou non, mais de la fusion ou non des marges : les marges de part et d'autre d'une bordure ne fusionnent plus, ca peut chambouler complètement une mise en page dans des proportions qui dépassent le pixel.

Le mercredi 8 décembre 2004 à 16:27, par Raphael :: #

@Xavier > Le problème de la fusion des marges est effectivement à prendre en compte.
Cependant, rappelons qu'il ne concerne que les marges hautes et basses (à ma connaissance) et non les marges latérales.
Or les plus gros problèmes de décalages proviennent des espacements latéraux (les éléments ne "rentrent" plus dans leur conteneur et passent à la ligne). Les espacements verticaux ne font qu'allonger et pousser les éléments.

D'ailleurs il me semble que les bordures peuvent très bien laisser apparaître ces problèmes de fusion, non?

Dans le cas de l'utilisation de backgrounds, il faudrait appliquer une couleur pour *chaque* élément différent et non, comme ici, sur des ensembles d'éléments. Cela peut-être intéressant mais fastidieux.

Je vais faire un rectificatif pour l'évoquer.

Le mercredi 8 décembre 2004 à 17:18, par Xavier :: site :: #

@Raphaël>

Oui c'est vrai seules les marges hautes et basses sont suceptibles de fusionner.

"les bordures peuvent très bien laisser apparaître ces problèmes de fusion, non?" ==> oui et non. Le pb soulevé est que l'ajout d'une bordure peut inhiber la fusion (si la bordure sépare 2 marges) ce qui a pour conséquence d'ajouter une marge sous un navigateur respectueux des standards. Une telle perturbation va donc compliquer l'analyse si ce n'est la réduire à néant.

D'accord pour ce qui concerne l'utilisation de backgrounds. Pour ma part, je ne l'utilise pas sur l'ensemble des éléments, mais progressivement des éléments les plus grands aux plus petits sur la branche de l'arbre qui pose un problème.

Le mercredi 8 décembre 2004 à 18:18, par pablo :: #

> des marges internes (margin) et externes (padding)
c'est pas le contraire ?

Le mercredi 8 décembre 2004 à 18:56, par Raphael :: #

@pablo > exact, je corrige

Le samedi 11 décembre 2004 à 21:33, par hum :: site :: #

Merci pour votre aide.
J'ai pour autant une question. Je n'arrive pas à limiter la taille de mon div dans la hauteur, je suis oblige de verifier mon contenu, sinon il passe en dessous de mon pied de page... pas beau...
merci de bien vouloir prendre ma demande en consideration.

Le samedi 11 décembre 2004 à 21:50, par Raphael :: #

@Hum > Comme je l'ai signalé récemment, les commentaires de blog ne sont pas fait pour exposer ses problèmes techniques personnels mais... pour donner ses opinions sur le billet.
Pour tes questions et cas pratiques, il serait plus convenable (et bien mieux pour toi) de te renseigner sur différents forums de discussions dédiés aux webmasters. En voici quelques-uns :
- www.webmaster-hub.com : Webmaster Hub
- dreamweaver.media-box.net : le forum MediaBox
- www.forum-webmaster.com/
- www.salemioche.net/forum/

Bonne chance

Le samedi 22 janvier 2005 à 13:17, par blastmanu :: site :: #

bonjour tout le monde
est ce que quelqu'un peut m'aider svp mon site a un rendu vraiment nikel sur FireFox et vraiment pourri sur IE sur mon site j'ai mis un liens avec mon CSS je suis vraiment deseperé quelqu'un peut il m'aider svp (je debute en XHTML/CSS et PHP/mySQL)
mervi d'avance

Le samedi 22 janvier 2005 à 13:32, par Raphael :: site :: #

@blastmanu > voudrais-tu lire le commentaire juste au-dessus du tien, s'il te plaît ? :/

Le dimanche 23 janvier 2005 à 00:19, par Stephan :: #

Un lien à voir absolument :
www.informit.com/articles...

En gros, on utilise le sélecteur universel pour voir comment les éléments se présentent, mais il y a plus...

* {border: 1px solid orange;}

Le lundi 4 avril 2005 à 09:27, par hikaru :: #

salut
Juste signaler qu'il y a une faute de frappe, je pense:
deuxième lignes dans le premier paragraphe:
methologie ---> methodologie...
voilà
bizz

Le vendredi 29 avril 2005 à 17:38, par Andre-d :: #

Merci pour tout ce travail mis à la dispositionn de tout le monde.
Pour le débutant (que je suis) la note est *****.
Voilà bon courage pour la maintenance de cette réalisation.

Le jeudi 30 juin 2005 à 15:26, par otterman :: site :: #

Le principe est d'utiliser le sélecteur universel (*), qui s'appliquera à toutes les balises, et d'y mettre les marges à zéro :

* {margin: 0; padding: 0;}

est-ce que c'est valider par le W3C si on a ce code dans notre page .css ??
c'est un moyen de redéfinir toutes les balises et d'avoir une maitrise sur chaque objet qui n'est pas négligeable!

Le vendredi 15 juillet 2005 à 16:47, par camacho :: site :: #

Vraiment une belle methodologie de detection d'erreur.
Merci infiniment...

Ajouter un commentaire

Les commentaires pour ce billet sont fermés.

  • CSS2
  • Memento XHTML
  • Le zen des CSS
  • CSS
  • Web accessible