Académique Documents
Professionnel Documents
Culture Documents
Par nightmat
www.openclassrooms.com
2/21
Sommaire
Sommaire ........................................................................................................................................... 2
Lire aussi ............................................................................................................................................ 1
Centrer en CSS .................................................................................................................................. 3
Horizontalement ................................................................................................................................................................ 3
Dans le flux .................................................................................................................................................................................................................. 3
Hors du flux ................................................................................................................................................................................................................. 6
Verticalement ..................................................................................................................................................................... 8
La magie de line-height ............................................................................................................................................................................................... 8
La magie de vertical-align ......................................................................................................................................................................................... 12
IE et inline-block .............................................................................................................................................................. 17
Le hack ...................................................................................................................................................................................................................... 17
Feuille de style spcifique ......................................................................................................................................................................................... 18
Q.C.M. ............................................................................................................................................................................. 18
Partager ..................................................................................................................................................................................................................... 20
www.openclassrooms.com
Sommaire
3/21
Centrer en CSS
Par
nightmat
Aaah, centrer des lments, une question rcurrente tant les cas sont nombreux. CSS offre quelques possibilits natives, mais
toute la difficult de l'exercice est de les exploiter comme il faut pour obtenir le rendu souhait. Je vais ainsi parcourir tous les cas
solvables en pur CSS, et tant qu' faire montrer comment les rsoudre.
Finis les <center>! Finis les align="center"! Accrochez-vous, c'est parti!
Sommaire du tutoriel :
Horizontalement
Verticalement
IE et inline-block
Q.C.M.
Horizontalement
Dans le flux
On commence doucement; le centrage horizontal dans le flux est le plus simple raliser puisqu' chaque cas correspond une
proprit CSS. Reste juste savoir laquelle correspond chaque cas. En l'occurrence cela dpendra du type d'lment centrer.
Un lment est dit dans le flux si la valeur de sa proprit position est static ou relative et qu'il n'est pas
flottant. En l'absence de rgles spcifiant le contraire, tout lment fait donc par dfaut partie du flux.
lment bloc
Pour rappel, un lment bloc est soit un lment de type bloc c'est--dire qui possde par dfaut la valeur block sa
proprit display , soit un lment auquel on a attribu display: block;.
Pour centrer un tel lment, c'est trs simple, il suffit d'utiliser la proprit margin afin de spcifier sa marge droite et gauche
auto. Pourquoi? Parce qu'un tel comportement est clairement dfini dans la spcification:
Citation : http://www.w3.org/TR/CSS2/visudet.html#blockwidth
If both 'margin-left' and 'margin-right' are 'auto', their used values are equal. This horizontally centers the element with respect
to the edges of the containing block.
Secret (cliquez pour afficher)
Si 'margin-left' et 'margin-right' valent 'auto', leurs valeurs effectives sont gales, ce qui centre l'lment dans son bloc
conteneur.
On pourra donc soit crire :
Code : CSS
#element {
margin-left: auto;
margin-right: auto;
www.openclassrooms.com
Centrer en CSS
4/21
auquel cas margin-top et margin-bottom vaudront aussi auto, ce qui revient crire :
Code : CSS
#element { margin: 0 auto; }
Car :
Citation : http://www.w3.org/TR/CSS2/visudet.html#normal-block
If 'margin-top', or 'margin-bottom' are 'auto', their used value is 0.
Secret (cliquez pour afficher)
Si 'margin-top' ou 'margin-bottom' vaut 'auto', leur valeur effective est zro.
Une dernire prcision; les lments bloc non remplacs prennent par dfaut toute la largeur de leur conteneur. Si vous voulez
visualiser le centrage d'un tel lment, il faudra donc lui fixer une largeur infrieure celle de son conteneur.
Mais c'est quoi un lment...
www.openclassrooms.com
Centrer en CSS
5/21
lment en-ligne
Si un lment n'est pas un bloc, alors il est en-ligne. Cela concerne gnralement les valeurs (par dfaut ou spcifies) inline
et inline-block de la proprit display, mais galement le texte.
Pour centrer un tel lment, il faut cette fois agir sur son conteneur, qui est le plus souvent son plus proche bloc parent. Ainsi il
suffit de lui appliquer :
Code : CSS
#parent { text-align: center; }
Ce CSS permettra un lment de centrer tous ses fils en-ligne. J'insiste sur tous car la proprit text-align est hrite.
De ce fait, tout se passera comme si cette proprit tait applique tous les fils de #parent.
Pour rtablir l'alignement normal, il suffira d'utiliser text-align: left; (si vous crivez de gauche droite bien sr) sur le
conteneur voulu.
Pour plus d'informations, je vous invite consulter la spcification du W3C.
Table
Avant de sortir du flux, faisons un petit apart pour les curieux. Les tableaux HTML ont par dfaut la valeur table leur
proprit display, alors bloc ou en-ligne ?
Si vous avez rpondu bloc c'est gagn, car :
Citation : http://www.w3.org/TR/CSS2/tables.html#table-display
table [...] specifies that an element defines a block-level table
Secret (cliquez pour afficher)
table [...] spcifie l'lment de gnrer une table dans un contexte bloc.
On utilise donc galement margin: auto; pour centrer les tableaux sauf sur IE<7 . Pour ces navigateurs, tout se passe
comme si la table tait dans un contexte en-ligne, auquel cas il faut alors la centrer en spcifiant text-align: center;
son parent.
www.openclassrooms.com
Centrer en CSS
6/21
titre indicatif un tel comportement peut tre retrouv dans les navigateurs actuels grce la valeur inline-table de la
proprit display.
Hors du flux
CSS ne permet pas nativement de centrer des lments hors du flux. Toutefois il existe quelques astuces qui dans certains cas
peuvent le permettre.
Un lment est hors du flux s'il est flottant ou fait partie du modle de positionnement absolu, c'est--dire que sa proprit
position vaut absolute ou fixed. De tels lments sont forcment des blocs, vous pourrez donc centrer leur contenu enligne comme on vient de le voir.
Flottants
float: center; n'existe pas. Certains trouvent cela logique, certains s'en plaignent, et d'autres s'en foutent, car ils savent
centrer des flottants. Seule condition requise ? Avoir deux conteneurs, ce qui est assez facile.
Gnralement la question se pose lors de la cration d'un menu, une liste de liens. On dispose alors de notre premier conteneur:
<ul>. Il suffira donc de l'englober par un <div> pour remplir nos conditions. Comment styler tout a maintenant?
Code : HTML
<div id="wrapper">
<ul id="menu">
<li><a href="#">Premier lien</a></li>
<li><a href="#">Deuxime</a></li>
<li><a href="#">Troisime</a></li>
</ul>
</div>
Nous allons utiliser le positionnement relatif, qui permet de dplacer un lment par rapport sa position dans le flux normal.
Pour ce faire, nous disposons des proprits top, right, bottom et left, qui acceptent des valeurs en pourcentage. Ainsi :
Code : CSS
#element { left: 50%; }
Voudra dire que nous dplaons notre lment vers la droite d'une distance correspondant la moiti de celle de son conteneur,
ce qui place son extrmit gauche au centre de son conteneur. partir de l, il suffit de dplacer vers la gauche les fils de cet
lment d'une distance gale la moiti de la somme de leur largeur. Et c'est possible en CSS! En effet si <ul> est dclar
flottant, sa largeur sera gale la somme de celle de ses fils. Il suffit alors de le dplacer de 50% vers la droite, et de dplacer
chaque <li> de 50% vers la gauche. Le conteneur global servira simplement viter que ces dcalages ne provoquent un
dbordement de la zone d'affichage. Si l'on traduit tout en CSS, cela nous donne
Code : CSS
#wrapper {
/* masque les dbordements et englobe le menu */
www.openclassrooms.com
Centrer en CSS
7/21
overflow: hidden;
}
#menu,#menu li {
/* on supprime les ventuels styles par dfaut */
margin: 0;
padding: 0;
list-style: none;
*/
}
#menu {
/* on dcale le menu vers la droite de la moiti de la largeur
disponible */
left: 50%;
}
#menu li {
/* on dcale chaque item vers la gauche de la moiti de la
largeur du menu */
right: 50%;
}
Vraiment pas compliqu, vous voyez?! Le tout est d'y penser bien sr.
Bon il est temps de terminer la partie horizontale; une petite dernire et on commencera le plus intressant!
Positionnement absolu
L'astuce permettant de centrer un tel lment est base sur le mme principe que celle des flottants. La seule diffrence vient du
fait que notre lment ne pourra pas tre englob dans un conteneur, ce qui ajoute seulement une contrainte, mais de taille: vous
devez spcifier une largeur cet lment.
En effet, dans l'exemple prcdent nous pouvions dduire la largeur de nos flottants grce au conteneur, ce qui n'est plus
possible ici (puisqu'un lment faisant partie du modle de positionnement absolu n'impacte pas le flux). Alors faute de pouvoir
la dduire, on va la spcifier. Le principe reste ensuite exactement le mme, mis part qu'on ne peut agir que sur l'lment. On va
donc le dcaler de 50% vers la droite puis utiliser une marge ngative pour le dcaler de la moiti de sa largeur vers la gauche.
Si on dcide de lui attribuer 400px de large, alors on crira :
Code : CSS
#element {
position: absolute;
www.openclassrooms.com
Centrer en CSS
8/21
left: 50%;
width: 400px;
margin-left: -200px;
Le centrage des lments hors du flux est ici plus prsent titre indicatif ; si vous avez le choix, il est plus sage
d'utiliser les mthodes "classiques" pour des lments dans le flux.
Verticalement
La magie de line-height
line-height, c'est une proprit que vous avez srement utilise, et sans doute sans la comprendre
On va donc se rattraper, car cela nous sera utile pour la suite. Le premier rflexe avoir quand on cherche des infos sur le
HTML/CSS, c'est d'aller voir la spcification. Le site du W3C est assez mal rfrenc alors n'hsitez pas ajouter W3C devant les
termes de votre recherche.
En cherchant w3c line-height, le premier lien nous amne sur une page intitule Visual formatting model details, dans laquelle
on trouve la section Line height calculations: the 'line-height' and 'vertical-align' properties ; jetons-y un coup d'oeil.
...
C'est compliqu n'est-ce pas ?
Bon je vais tre sympa (pour une fois) ; la partie qui nous intresse est la suivante :
Citation : http://www.w3.org/TR/CSS2/visudet.html#leading
CSS assumes that every font has font metrics that specify a characteristic height above the baseline and a depth below it. In
this section we use A to mean that height (for a given font at a given size) and D the depth. We also define AD = A + D, the
distance from the top to the bottom. [...] Note that these are metrics of the font as a whole and need not correspond to the
ascender and descender of any individual glyph.
User agent must align the glyphs in a non-replaced inline box to each other by their relevant baselines. Then, for each glyph,
www.openclassrooms.com
Centrer en CSS
9/21
determine the A and D. Note that glyphs in a single element may come from different fonts and thus need not all have the
same A and D. If the inline box contains no glyphs at all, it is considered to contain a strut (an invisible glyph of zero width)
with the A and D of the element's first available font.
Still for each glyph, determine the leading L to add, where L = 'line-height' - AD. Half the leading is added above A and the
other half below D, giving the glyph and its leading a total height above the baseline of A' = A + L/2 and a total depth of D' =
D + L/2.
En franais, cela veut dire que pour chaque lment dans un contexte en-ligne, le navigateur va dterminer sa hauteur par dfaut
en fonction des caractristiques de la police utilise. Cette hauteur sera la somme des hauteurs sur (A) et sous (D) la baseline :
Du coup le texte se retrouve centr verticalement par rapport au line-height de son parent, vous voyez o je veux en
venir..?!
On aura juste spcifier au paragraphe une hauteur de ligne gale sa hauteur, disons 5em :
Code : CSS
p {
}
line-height:5em;
www.openclassrooms.com
Centrer en CSS
10/21
Si pour une raison ou une autre un saut de ligne est rendu, la ligne suivante se positionnera en fonction du lineheight, attendez vous donc un cart consquent..!
D'o la problmatique suivante :
inline-block !
La valeur inline-block de la proprit display remplit ces conditions (c'en est presque miraculeux), on va donc
s'empresser d'englober notre texte avec.
Code : HTML
<p>
<span>
trololol
<br />
again
www.openclassrooms.com
Centrer en CSS
</p>
11/21
</span>
Code : CSS
p { line-height:5em; }
span {
display:inline-block;
line-height:1.3em;
}
Mais dans l'exemple il n'y avait pas de texte en dehors de l'lment, alors sur quoi le navigateur s'est-il bas pour
l'aligner ?
Bonne question ; la rponse tient en un seul mot : "strut". Si vous avez lu le pav en anglais un peu plus haut, vous savez que
c'est un caractre invisible de largeur nulle.
Eh bien lorsqu'on spcifie un line-height sur un bloc conteneur, tout se passe comme si chaque bote en-ligne commenait
par un strut, donc un caractre avec pour proprit le line-height de son conteneur ainsi que sa police.
Citation : Citation : http://www.w3.org/TR/CSS2/visudet.html#leading
[...] exactly as if each line box starts with a zero-width inline box with the element's font and line height properties. We call
www.openclassrooms.com
Centrer en CSS
12/21
Et voil notre <span> - et donc nos lignes de texte - centr verticalement dans son conteneur !
Maintenant, tudions cette proprit miraculeuse un peu plus en dtail.
La magie de vertical-align
Ne mentez pas, je suis sr que vous l'utilisez sans savoir comment elle fonctionne
Bon allez rflexe ? Google, "W3C vertical-align", on retombe sur http://www.w3.org/TR/CSS2/visudet.html et on y trouve
Citation : http://www.w3.org/TR/CSS2/visudet.html#leading
www.openclassrooms.com
Centrer en CSS
13/21
vertical-align
[...]
This property affects the vertical positioning inside a line box of the boxes generated by an inline-level element.
Houl, qu'est ce que a donne en franais..? "Cette proprit affecte l'alignement vertical des botes gnres par des lments
dans un contexte en-ligne l'intrieur d'une ligne". Mouais pas trs convivial tout a.
En gros ce qu'il faut retenir, c'est que chaque lment a deux caractristiques :
son contexte : c'est la manire dont il est plac dans le flux
son formatage : qui dtermine comment son contenu se comportera
Quand on parle d'lment bloc, c'est un lment qui a un contexte et un formatage bloc. De mme un lment en-ligne est un
lment qui a un contexte et un formatage en-ligne.
display:inline-block; lui, permet de dfinir pour un lment un contexte en-ligne et un formatage bloc, de ce fait ce
dernier peut prendre en compte vertical-align.
Mais c'est galement le cas pour les lments remplacs dans un contexte en-ligne (images, champs de formulaires...) et les
cellules de tableau (valeur table-cell de display), ce qui fait dire un certain M@teo que cette "proprit [est]
normalement rserve aux tableaux"
Dans le cas d'une image, IE7 a besoin d'un "coup de pouce" pour voir le contexte en-ligne, il faudra simplement que sa
balise ne soit pas colle celles de son conteneur.
ce stade, j'espre que vous commencez entrevoir l'immense potentiel de cette proprit. On a dj constat qu'on pouvait
centrer verticalement un bloc (puisqu'au final les lignes de texte n'taient qu'un exemple ; on aurait pu mettre n'importe quoi,
l'important c'est qu'aucune hauteur n'a t fixe) dans un conteneur, mais galement, centrer ce bloc par rapport une ligne de
texte.
Et ce bloc, on sait qu'il est pris en compte comme un caractre, on en dduit...
Eh oui <iframe> est un lment remplac puisqu'on ne peut pas agir sur son contenu..! Notez qu'elle fait 300px de
large
www.openclassrooms.com
Centrer en CSS
14/21
Le conteneur devient ici optionnel, il prendra simplement la hauteur ncessaire pour englober tous les lments.
Hephephep d'un conteneur de hauteur fixe tu es pass plus de conteneur du tout, t'aurais pas loup une partie ?
Du coup les astuces vues plus haut ne fonctionnent plus, mais heureusement il existe une solution gnrique qui fonctionne ds
que le conteneur une hauteur spcifie, c'est dire ds que vous avez donn une valeur sa proprit height ( la diffrence
des premiers exemples o la hauteur de l'lment dpendait de son line-height).
Effectivement, spcifier une hauteur un lment permet ses enfants blocs (de formatage bloc
relative cette dernire, ce l'aide des pourcentages.
height:100%; voudra donc dire "la hauteur spcifie de mon conteneur". Si cette dernire n'est pas renseigne alors tout se
passera comme si vous aviez auto la place de 100% ; les consquences dpendront alors du formatage de l'lment.
Les navigateurs bass sur webkit (chrome entre autres) sont capables de remonter la liste des parents afin de rsoudre
le pourcentage attribu la hauteur d'un lment. Ce n'est pas un comportement standard et par consquent il ne
faudra pas compter dessus.
Nous savons que nous pouvons centrer verticalement des lments les uns par rapport aux autres, et que si une hauteur est
spcifie un lment alors ses enfants peuvent prendre cette dernire, donc...
On peut centrer un lment dans un conteneur de hauteur spcifie.
Eeeuuh je vois pas le rapport moi
www.openclassrooms.com
Centrer en CSS
15/21
Notez l'analogie avec le strut. En effet nous crons un lment qui permettra d'aligner verticalement les autres lments dans un
contexte en-ligne. Cet lment aura de plus gnralement une largeur nulle si sa seule utilit est le centrage.
Le code ralisant cela est trs simple et traduit tout ce qui a t dit prcdemment ; la seule subtilit rside dans le fait qu'aucun
espace/tabulation/saut de ligne ne doit sparer les lments puisque ces derniers apparatront comme un espace dans un
contexte en-ligne (ben oui, a ne vous tonne pas qu'il y ait un espace dans votre texte quand vous sautez une ligne dans votre
code ?
).
Code : HTML
<!DOCTYPE html>
<html>
<head>
<title>lment centr verticalement</title>
</head>
<body>
<div class="strut"></div><!---><div id="content">
</div>
</body>
</html>
Code : CSS
html,body {
/* suppression des ventuels styles par dfaut */
margin:0;
padding:0;
www.openclassrooms.com
Centrer en CSS
16/21
.strut, #content {
/* on permet ces lments de s'aligner verticalement */
display:inline-block;
vertical-align:middle;
}
.strut {
/* hauteur de la fentre, par rapport laquelle les lments
vont tre aligns */
height:100%;
}
#content {
/* des dimensions au hasard */
width:50%;
height:50%;
/* on le rend visible */
background:red;
Notez que zoom:1; n'est thoriquement pas ncessaire ici car spcifier des dimensions aux lments leur confre
galement le layout : http://www.satzansatz.de/cssd/onhavinglayout.html.
Et hop !
Ce qui est gnial avec cette technique, c'est que les lments peuvent avoir une hauteur fluide (c'est--dire non spcifie) et
seront toujours centrs coup sr, sans aucun calcul de votre part.
www.openclassrooms.com
Centrer en CSS
17/21
IE et inline-block
Ahahaha eeeh oui vous ne pensiez pas vous en tirer comme a j'espre ?
En effet IE6 et IE7 ont quelques problmes avec inline-block ; rien d'insurmontable heureusement, cette proprit n'est
juste pas prise en charge.
Puisque cet lment aura un contexte en-ligne et le layout. Toutes les conditions sont ainsi runies et notre lment se
comportera bien sur tous les navigateurs.
Et si l'lment est de type bloc ? Logiquement dans ce cas il faudra lui spcifier d'tre en-ligne. Seulement si nous faisons cela
alors le comportement ne sera plus celui attendu sur les navigateurs "normaux" puisque la proprit display sera surcharge.
La problmatique suivante est donc simplement de spcifier l'lment en-ligne pour IE<8, ce qui peut se faire de deux faons :
utiliser un hack CSS
utiliser une feuille de style spciale pour IE<8
Le hack
Un hack CSS est une technique qui consiste crire du code non standard dans le but d'exploiter les faiblesses des parseurs
CSS de certains navigateurs afin de cibler ces derniers.
Et a tombe bien pour IE6 et IE7 il y en a un plutt simple :
Code : CSS
#element {
display:inline-block;
/* hack IE<8 */
*display:inline;
Ajouter un astrisque * devant une rgle CSS permet effectivement de ne faire prendre en compte cette rgle que par les
versions d'IE qui nous intressent. Notez juste que cette rgle devra se trouver aprs inline-block pour pouvoir la
surcharger.
Mais si on la surcharge... alors l'lment n'a plus le layout. C'est donc le moment d'utiliser une autre proprit qui confre le
layout : zoom.
Il existe d'autres proprits qui confrent le layout, mais leur utilisation dpendra des cas d'utilisation, alors que zoom
est gnrique.
www.openclassrooms.com
Centrer en CSS
18/21
Attention au fait que cette proprit est "IE only", elle n'est pas standard et tout comme le hack prcdent elle fera chouer la
validation de votre CSS.
Du coup le code devient
Code : CSS
#element {
display:inline-block;
/* hack IE<8 */
*display:inline;
/*
* cette proprit n'est pas standard,
* on peut donc l'utiliser sans hack
* puisqu'elle ne sera pas interprte
* par les autres navigateurs
*/
zoom:1;
}
media="all" type="text/css"
/>
media="all" type="text/css"
/>
Du coup le hack n'est plus ncessaire. Le CSS "spcial IE" ne sera pas forcment valide, mais votre CSS principal pourra alors
l'tre !
Q.C.M.
Le premier QCM de ce cours vous est offert en libre accs.
Pour accder aux suivants
Connectez-vous Inscrivez-vous
J'ai un doute sur l'utilisation d'une proprit CSS ! Premier rflexe...
Poster ma question sur un forum.
Consulter le site w3schools.
Consulter la documentation officielle du W3C.
Tout laisser tomber et lancer Skyrim.
Code : HTML
<h1>titre</h1>
www.openclassrooms.com
Centrer en CSS
19/21
Code : CS S
h1 { margin:auto; }
Code : CS S
h1 { text-align:center; }
Code : CS S
h1 {
display:inline-block;
vertical-align:middle;
}
Code : CS S
h1 { /* j'en sais fichtrement rien */ }
J'ai spcifi uniquement margin:auto; mon <div> mais il n'apparat pas centr, pourquoi ? Et comment faire ?
Cette balise est rebelle, elle a dcid qu'on ne pourrait pas la centrer.
Solution : la soumettre coups de fouet.
<div> n'a pas un contexte bloc.
Solution : utiliser text-align:center;
<div> n'est pas un lment remplac. De contexte bloc, il prend donc toute la largeur disponible.
Solution : lui affecter une largeur.
Le contenu du <div> a un contexte bloc, il force donc ce dernier prendre toute la largeur disponible.
Solution : supprimer le contenu ou changer son contexte.
Quel rgle ajouter une image pour l'aligner verticalement par rapport la ligne de texte qui l'entoure ?
vertical-align:middle;
line-height:1em;
display:inline-block;
position:relative;
float:left;
J'ai utilis line-height sur un paragraphe pour centrer son texte verticalement mais il contient des sauts de ligne, du coup
les carts sont normes, que faire ?
Englober le texte dans un lment en-ligne auquel on spcifiera une hauteur de ligne correcte.
Englober le texte dans un lment de contexte en-ligne et de formatage bloc auquel on spcifiera vertical-align:middle;.
Englober le texte dans un lment de contexte en-ligne et de formatage bloc auquel on spcifiera vertical-align:middle;
ainsi qu'une hauteur de ligne correcte.
Englober le texte dans un lment de contexte en-ligne et de formatage bloc auquel on spcifiera text-align:center;.
Englober le texte dans un lment bloc auquel on spcifiera d'tre bien gentil.
Correction !
www.openclassrooms.com
Centrer en CSS
20/21
Statistiques de rponses au Q CM
Partager
www.openclassrooms.com