Centrer verticalement n'importe quel élément en quelques lignes CSS
Une solution rapide et qui fonctionne sur tous les navigateurs à partir de IE9 est le centrage vertical avec la valeur CSS3 translateY de la propriété transform.
Pour mettre cela en place, trois simples propriétés :
On place l'élément en relatif pour le repositionner par rapport à son élément parent avec position: relative;.
On déplace l'élément de la moitié de la hauteur de l'élément parent avec top: 50%;, la référence de déplacement étant actuellement son bord haut.
On re-centre l'élément non plus à partir de son bord haut mais de son centre vertical avec transform: translateY(-50%);
Et voilà !
Exemple de code minimal
Voici ce que cela donne avec les préfixes propriétaires :
.vertical-align {
position: relative;
top: 50%;
-webkit-transform: translateY(-50%);
-moz-transform: translateY(-50%);
-ms-transform: translateY(-50%);
-o-transform: translateY(-50%);
transform: translateY(-50%);
}
Note : si votre élément est de type inline, il faudra ajouter la propriété display: inline-block; pour que la transformation soit valide dans tous les cas de figures sur tous les navigateurs supportant translateY :
.inline-block {
display: inline-block
}
Note : si le centrage affiche l'élément sur un demi-pixel, celui-ci peut paraître flou. Pour empêcher cela, il suffit de munir un élément parent de transform-style: preserve-3d; :
.preserve-3d {
-webkit-transform-style: preserve-3d;
-moz-transform-style: preserve-3d;
transform-style: preserve-3d;
}
Exemple concret d'utilisation
Texte en Hover sur image
Passez votre souris sur l'image :
Note : Vous pouvez retailler la fenêtre pour voir le résultat en Responsive Web Design
HTML
<div class="example">
<img src="http://fc08.deviantart.net/fs70/i/2012/309/9/1/the_moment_by_dzsurnik-d5k2le2.jpg" alt="The Moment by Dzsurnik">
<a href="http://fc08.deviantart.net/fs70/i/2012/309/9/1/the_moment_by_dzsurnik-d5k2le2.jpg" target="_blank">
<span>Voir l'image en grand format</span>
</a>
</div>
CSS
.example {
/* Permettre à `a` d'être bien placer en absolue */
position: relative;
/* Éviter les rendus flous */
-webkit-transform-style: preserve-3d;
-moz-transform-style: preserve-3d;
transform-style: preserve-3d;
}
.example img {
/* Rendre l'image Responsive */
display: block;
max-width: 100%;
/* Centrer l'image */
margin-left: auto;
margin-right: auto;
}
.example a {
/* Cacher le lien si la zone n'est pas survolée */
display: none;
/* Couvrir l'intégralité de `.example` */
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
/* Être transparent pour voir l'image */
background-color: rgba(255, 255, 255, 0.8);
/* Centrer horizontalement le texte */
text-align: center;
/* Styler le texte */
font-weight: bold;
font-size: 1.6em;
line-height: 1.3;
}
.example a:hover {
/* Désactiver visuellement le comportement `:hover` sur le lien */
color: #48739E;
text-decoration: none;
}
.example:hover a {
/* Afficher `a` au survole de `.example` */
display: block;
}
.example span {
/* Centrage vertical automatique pour le texte */
position: relative;
display: inline-block;
top: 50%;
-webkit-transform: translateY(-50%);
-moz-transform: translateY(-50%);
-ms-transform: translateY(-50%);
-o-transform: translateY(-50%);
transform: translateY(-50%);
}
Centrer une Popup
Cliquez sur ce lien pour ouvrir une popup
HTML
<a class="example-link" href="javascript:;">Cliquez sur ce lien pour ouvrir une popup</a>
<div class="example-2">
<figure>
<img src="http://fc07.deviantart.net/fs71/i/2013/265/1/9/devon_jade__dubstep_themed_edit__2_by_matthewjendrasiak-d6ngt26.jpg" alt="Devon Jade Dubstep Themed Edit 2 by Matthew Jendrasiak">
<figcaption>Cliquez n'importe où pour fermer</figcaption>
</figure>
</div>
CSS
.example-2 {
/* Par défaut notre popup est fermée */
display: none;
/* Zone de popup prenant toute la place */
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
.example-2.opened {
/* Avec la classe opened, la popup est visible */
display: block;
}
.example-2:before {
/* Rendre visible le background */
content: "";
position: absolute;
z-index: 1;
background-color: rgba(0, 0, 0, 0.8);
width: 100%;
height: 100%;
}
.example-2 figure {
/* Mise en forme du contenu */
background-color: #FFF;
margin: 0;
/* Le contenu prend de base toute la largeur */
width: 100%;
/* Popup par dessus le background */
z-index: 2;
/* Centrage vertical automatique pour le contenu */
position: absolute;
top: 50%;
-webkit-transform: translateY(-50%);
-moz-transform: translateY(-50%);
-ms-transform: translateY(-50%);
-o-transform: translateY(-50%);
transform: translateY(-50%);
}
@media (min-width: 768px) {
.example-2 figure {
/* Taille fixe pour la popup à partir de 768px... */
width: 764px;
/* ...et centrage vertical et horizontal automatique pour le contenu */
top: 50%;
left: 50%;
-webkit-transform: translateX(-50%) translateY(-50%);
-moz-transform: translateX(-50%) translateY(-50%);
-ms-transform: translateX(-50%) translateY(-50%);
-o-transform: translateX(-50%) translateY(-50%);
transform: translateX(-50%) translateY(-50%);
}
}
.example-2 figcaption {
/* Mise en forme figcaption */
text-align: center;
padding: 16px;
}
.example-2 img {
/* Image responsive */
max-width: 100%;
}
JS
// Ouverture et fermeture de popup.
$(".example-link, .example-2").click(function () {
$(".example-2").toggleClass("opened");
});
Note : $ est une instance de la librairie jQuery.