Comment positionner les éléments en CSS ?
Le 24-02-2005 par Raphael dans Bases et indispensables.
Les tableaux utilisés pour la mise en forme, ont toujours été déconseillés. Par contre, l'utilisation correcte de chaque balise (balises div, p, h1, ul, li, etc.) ainsi que leur positionnement en CSS devient petit à petit indispensable au regard des avantages résultants.
Les éditeurs HTML visuels n'utilisent qu'une infime partie des possibilités des balises (faussement nommées "calques" en général), ce qui les rend souvent peu compatibles et peu pratiques.
Voici comment positionner les éléments en CSS de façon optimale, bien que résumé schématiquement.
Résumé et pense-bête. Voici les principaux points à retenir de cet article :
- Tous les éléments (balises) HTML peuvent être positionnés, décorés, dimensionnés, ... grâce aux styles CSS. Cela signifie que les CSS ne s'appliquent pas qu'aux éléments <div> contrairement à certaines idées reçues : une image (<img>), une liste (<ul>), un paragraphe (<p>), etc. peuvent être stylés en CSS sans avoir besoin d'être contenus dans un élément <div>. Evitez d'ailleurs de surcharger vos documents d'éléments <div> inutiles.
- Employez toujours les éléments selon leur fonction et non selon leur aspect (puisque cet aspect pourra facilement être modifié via CSS) : un paragraphe sera défini par la balise <p>, un titre par la balise <h1>, <h2>..., etc. Notez que l'élément <div> est neutre est sert de "bouche-trou" pour englober d'autres éléments ou servir lorsqu'aucun autre élément n'est approprié. N'utilisez pas <div> pour englober des éléments seuls !
- Il existe deux types généraux d'éléments HTML : les balises de type "en-ligne" et les balises de type "bloc". Cette différence est fondamentale et a de nombreuses implications sur les styles qui peuvent être appliqués
- L'imbrication des éléments les uns dans les autres, et les notions de parenté (parent, ancêtre, frère, ...) permettent de styler facilement les éléments en utilisant cette hierarchie dans les sélecteurs CSS. Cela évite d'employer des noms de classes ou d'id multiples et inutiles, qui complexifient la lecture et la compréhension des styles.
- Il existe plusieurs schémas de positionnement en CSS : un schéma de positionnement dans le Flux (positionnement par défaut), et trois schémas de positionnement qui sortent l'élément du Flux (positionnement absolu, positionnement fixé et positionnement flottant). Un dernier "positionnement" (relatif) est en fait une variante du positionnement courant qui provoque un décalage. La notion de Flux est fondamentale.
- Chaque schéma de positionnement a ses règles et spécificités. Mieux vaut bien comprendre ces règles pour éviter des interactions ou des comportements non sollicités... et déclarer que les CSS ne fonctionnent pas ! :)
Les balises de bloc et les balises en-ligne
Ce chapitre sur la structure des balises est primordial, vous devez auparavant avoir consulté le tutoriel sur les bloc/en-ligne.
Ancêtre, Parents, Enfants, Frères
Comprendre l'imbrication des éléments (boîtes) les uns dans les autres est essentiel.
Chaque document HTML est toujours composé de conteneurs. Ceux-ci peuvent être ancêtres, parents, enfants ou frères. Ces différents éléments composent une hierarchie d'imbrications.
- Un élément Ancêtre est un élément qui contient un élément ou une hierarchie d'éléments
- Un bloc Parent est un élément contenant directement un autre bloc. Par exemple, un DIV contenant un paragraphe P. Attention : si ce paragraphe contient lui-même des éléments (ex: strong), DIV ne sera pas Parent de l'élément strong mais uniquement son Ancêtre. Le Parent est donc l'Ancêtre immédiat.
- Un bloc contenu directement dans un autre bloc est dit Enfant de cet élément. Par exemple, ici les éléments LI sont enfants de leur conteneur UL.
- Les éléments ayant le même élément Parent sont appelés Frères.
Aller plus loin :
Grâce au livre de Raphaël Goetter, apprivoisez les styles CSS et le langage (x)HTML, tout en plongeant dans la création de sites conformes aux standards web et accessibles à tous.
Le Flux
La mise en place des différents éléments de la page se fait par défaut selon le Flux courant.
Les éléments (balises) sont placés les uns après les autres dans le code HTML de la page.
L'ordre dans lequel apparaissent les balises dans le code HTML sera l'ordre dans lequel ils seront affichés et apparaîtront dans le document, c'est le Flux. Cela signifie que, par défaut, chaque élément est dépendant des éléments frères qui l'entourent.
Par défaut, les balises Bloc et les balises En-ligne ont un comportement différent dans le flux normal (voir tutoriel sur la structure des balises).
NOTE : les blocs positionnés en "absolu" ou "fixé" sortent du flux naturel et échappent quelque peu à cette règle.
Ils ne sont alors plus dépendant des éléments frères.
Pour se placer, un tel bloc se réfère non pas à son Parent direct, mais au premier Ancêtre positionné qu'il rencontre.
Le positionnement des éléments
Le positionnement dans le Flux normal
C'est le placement par défaut, à l'aide des marges internes (padding) du conteneur, soit des marges externes (margin) des éléments. Le flux régit l'agencement des différents éléments Frères.
Sans définition explicite du positionnement, un bloc se place en haut à gauche de son conteneur (ce dernier pouvant être un autre bloc, une cellule de tableau, le body,...) et prend automatiquement toute la largeur de ce conteneur. Ses frères se placeront en-dessous.
A partir de là, il est simple de positionner un bloc au sein de son parent grâce à l'utilisation des propriétés de marges.
Par exemple, pour placer un bloc jaune de 100x100px à 15px à partir de la gauche et 200px à partie du haut du conteneur :
.conteneur {
padding-top: 200px;
padding-left: 15px;
}
.bloc {
width: 100px;
height: 100px;
background-color: yellow;
}

Note : vous noterez l'emploi d'un padding-top et non d'un margin-top en raison du comportement appelé "fusion de marges" (selon cette règle, la marge haute de "bloc" s'applique en fait à son parent "conteneur").
Note : il n'est nullement obligatoire d'utiliser le pixel pour placer son bloc; n'importe quelle unité est valable (%, em, auto,...)
Positionner en flottant
La propriété FLOAT permet de positionner un bloc à gauche ou à droite dans un parent (et non-plus l'un en-dessous de l'autre). Le reste du conteneur parent occupera alors l'espace laissé libre.
Comme le float sort du flux courant, il n'est pas compté dans le calcul de la hauteur du conteneur, si celle-ci n'est pas spécifiée. Il peut donc "dépasser" en hauteur.
L'utilisation courante consiste à aligner une image à gauche ou à droite d'un texte de contenu :
Partie HTML :
<div class="conteneur">
<img class="gauche" alt="..." src="..." />
texte bla bla bla
....
</div>
Et la CSS correspondante :
.gauche {
float: left;
}

NOTE : lorsqu'il y'a des éléments dont certains sont flottants, il est souvent préférable de placer ces éléments dans un parent commun.
Il est possible de cumuler les propriétés Float pour obtenir plusieurs blocs côte à côte.
Récapitulatif. Attention à bien comprendre le fonctionnement du positionnement flottant :
- L'élément est d'abord placé normallement dans le flux. Donc si un autre élement bloc est placé avant lui, l'élément flottant se positionnera en dessous; et si un élément bloc le suit, ce dernier sera placé dessous. Bref, le comportement classique du positionnement en flux
- Ensuite l'élément qui a reçu la propriété float est "poussé" à gauche ou à droite de son conteneur.
- Les éléments qui le suivent au sein du conteneur se placent alors autour de lui.
Utiliser les positions absolues, fixes et relatives
Cette propriété est largement utilisée par défaut sur les logiciels WYSIWYG comme Dreamweaver. C'est en partie à cause de cette utilisation abusive que les "calques" ont acquis une mauvaise réputation.
En effet, le positionnement absolu, fixe ou relatif a des désavantages du fait de sa rigidité : il ne permet pas (ou difficilement) l'adaptation du site aux différentes résolutions la plupart du temps.
Attention cependant : cette rigidité n'est que fictive et due aux valeurs fixes données en général par les logiciels comme Dreamweaver. On peut très bien positionner en absolu en pourcentage ou en em. On peut également très bien centrer un site avec des positions absolues. Il faut simplement comprendre comment il fonctionne et ne pas se contenter des positionnements "à la dreamweaver".
Sachez également que c'est le seul moyen de superposer deux blocs (avec la propriété z-index)
Lorsqu'il
est en position absolue ou fixe, le bloc est dit "positionné". Il est
retiré du "flux" du code html : son positionnement sera le même quelle
que soit l'emplacement de la balise dans le code du conteneur parent,
quel que soit sa fraternité.
Le bloc est placé par rapport à son parent s'il est lui-même
positionné, ou alors par rapport au dernier Ancètre positionné (si
aucun Ancètre n'est positionné, il se réfère à la page entière, balise html).
En absolue, le bloc est généralement placé à l'aide des propriétés
"top" et "left" par rapport au coin supérieur gauche du parent.
Si les valeurs top et left sont inexistantes, le bloc apparait là où il
est déclaré ce qui peut servir pour placer correctement dans la page
des éléments superposés.
A noter que le positionnement relatif est un peu le trublion du
groupe : c'est une forme de positionnement qui laisse l'élément
dans le flux normal (donc dépendant et influençant les éléments
frères), tout en le décalant à l'aide des propriétés "top" et "left"...
mais en ayant l'avantage des éléments dits "positionnés" à savoir qu'il
peut servir de parent pour des éléments hors-flux (position absolue par
exemple).
Retenons que le positionnement relatif est principalement employé pour appliquer un décalage d'un élément par rapport à sa position "normale".
Récapitulatif.
- Les positionnements Absolu et Fixé sortent l'élément du flux. C'est à dire qu'il n'a plus d'interaction avec les autres éléments (frères, ancètres) du document en flux courant.
- Un élément auquel on applique la propriété CSS "position" (Absolu, Fixé ou Relatif) est dit "positionné".
- Un élement hors-flux (Absolu ou Fixé) se positionne par rapport à son dernier Ancêtre positionné. Si aucun ancêtre de l'élément n'est positionné, alors celui-ci se positionne par rapport au document entier (body). On a tendance à croire qu'un élément en position absolue est toujours positionné par rapport aux côtés du documents, ce qui est faux.
- Hors bugs de navigateurs, le positionnement Absolu, Fixé ou Relatif est le seul qui permette de superposer deux éléments l'un au-dessus de l'autre
- Evitez l'emploi du positionnement hors-flux autant que possible, surtout pour les éléments de contenu. Cela complexifie les interactions et rend les contenus moins fluides (pensez que l'utilisateur pourra par exemple agrandir la taille de la police).
Quelques exemples :
Deux blocs l'un en-dessous de l'autre avec un espace de séparation :
Partie HTML :
<div class="bloc1">bla bla bla</div>
<div class="bloc2">bli bli bli</div>
Et la CSS correspondante :
.bloc1 {
background-color: blue;
height: 50px;
}
.bloc2 {
background-color: green;
height: 50px;
margin-top: 20px;
}

Trois blocs côte-à-côte avec un espace de séparation :
Partie HTML :
<div class="bloc1">bla bla bla</div>
<div class="bloc2">bli bli bli</div>
<div class="bloc3">blu blu blu</div>
Et la CSS correspondante :
.bloc1 {
background-color: blue;
height: 50px;
width: 100px;
float: left;
}
.bloc2 {
background-color: green;
height: 50px;
width: 100px;
float: left;
margin-left: 20px;
}
.bloc3 {
background-color: red;
height: 50px;
width: 100px;
float: left;
margin-left: 20px;
}

Un bloc contenu dans un autre :
Partie HTML :
<div class="conteneur">
<div class="bloc">bli bli bli</div>
</div>
Et la CSS correspondante :
.conteneur {
background-color: blue;
height: 100px;
width: 100px;
padding-top: 40px;
}
.bloc {
background-color: yellow;
height: 50px;
width: 50px;
margin-left: 20px;
}

Note : vous noterez l'emploi d'un padding-top et non d'un margin-top en raison du comportement appelé "fusion de marges" (selon cette règle, la marge haute de "bloc" s'applique en fait à son parent "conteneur").
Une image alignée à droite d'un texte :
Partie HTML : <div class="conteneur">
<img class="image" src="..." alt="" />
<p>bla bla bla bla bla bla bla bla bla bla
bla bla bla bla bla bla bla bla bla bla ...</p>
</div> Et la CSS correspondante : .conteneur {
width: 40%;
background-color: yellow;
}
.image {
float: right;
}

Sachez utiliser chaque balise à bon escient !
- Il est souvent inutile de faire des imbrications multiples de <div>, ceux-ci ne servant qu'à délimiter des zones de page
- Evitez d'utiliser les balises <table> pour la mise en page de votre site : ils ne sont pas fait pour ça mais pour des données tabulaires et statistiques
- Utilisez les balises <h1>...<h6> pour vos titres et non des balises <p> améliorées
- Utilisez les listes <ul> <li> pour vos menus, car leur utilisation est tout à fait appropriée pour ça (voir les articles de la catégorie "menus en CSS")
Article soumis à licence Creative Commons "by" : Vous devez citer le nom de l'auteur original et mentionner la source (url) de l'article.
Un problème, une question ?
Vous avez des soucis avec ce tutoriel ? Venez en discuter dans le salon Spécifique aux tutoriels et articles du Forum Alsacréations.






