286 votes

Pourquoi vertical-align : middle ne fonctionne-t-il pas sur mon span ou div ?

J'essaie de centrer verticalement un span ou div dans un autre élément div élément. Cependant, lorsque je mets vertical-align: middle mais rien ne se passe. J'ai essayé de changer le display des deux éléments, et rien ne semble fonctionner.

C'est ce que je fais actuellement dans ma page web :

.main {
  height: 72px;
  vertical-align: middle;
  border: 1px solid black;
  padding: 2px;
}

.inner {
  vertical-align: middle;
  border: 1px solid red;    
}

.second {
  border: 1px solid blue; 
}

<div class="main">
  <div class="inner">
    This box should be centered in the larger box
    <div class="second">Another box in here</div>
  </div>
</div>

Voici un jsfiddle de l'implémentation montrant que cela ne fonctionne pas : http://jsfiddle.net/gZXWC/

218voto

Charles Addis Points 744

Cela semble être la meilleure solution - un certain temps s'est écoulé depuis mon premier message et c'est ce qu'il faut faire maintenant : http://jsfiddle.net/m3ykdyds/200

/* CSS file */

.main {
    display: table;
}

.inner {
    border: 1px solid #000000;
    display: table-cell;
    vertical-align: middle;
}

/* HTML File */
<div class="main">
    <div class="inner"> This </div>
</div>

4 votes

Alors comment faire ce que le PO veut faire ?

0 votes

Des idées sur les paragraphes à ligne variable ? c'est-à-dire s'il n'y a aucun moyen de savoir s'il y aura une ou deux lignes. Devrais-je alors utiliser jQuery ?

0 votes

Si la hauteur doit être dynamique, quelle est la solution ?

140voto

Mahendra Points 2298

Essayez ceci, ça marche très bien pour moi :

/* Internet Explorer 10 */
display:-ms-flexbox;
-ms-flex-pack:center;
-ms-flex-align:center;

/* Firefox */
display:-moz-box;
-moz-box-pack:center;
-moz-box-align:center;

/* Safari, Opera, and Chrome */
display:-webkit-box;
-webkit-box-pack:center;
-webkit-box-align:center;

/* W3C */
display:box;
box-pack:center;
box-align:center;

4 votes

Excellente réponse, cela m'a donné une solution entièrement fonctionnelle qui n'a pas causé d'autres problèmes (une application utilisant jquerymobile + phonegap et toutes les autres solutions ont conduit à des problèmes de taille de css et div). Je tiens à préciser que ces paramètres doivent être ajoutés à un bloc CSS spécifique aux éléments à centrer/middler, par exemple : #element span {height:100%;display:-webkit-box;-webkit-box-pack:center;-we‌​bkit-box-align:cente‌​r;} - notez la hauteur est importante pour s'assurer que le span hérite de la pleine hauteur de son conteneur (probablement un div) sinon vous n'aurez toujours pas de centrage vertical !

0 votes

BTW, vous pouvez écrire du code flexbox standard sans préfixes de navigateur et ensuite obtenir des préfixes de navigateur avec l'autoréfixeur. github.com/postcss/autoprefixer ou via la démo en ligne simevidas.jsbin.com/gufoko/quiet

2 votes

Valeur de la propriété non valide box sur display

35voto

Vector Points 11194

La définition de la hauteur de ligne à la même hauteur que la div qui la contient fonctionnera également.

DEMO http://jsfiddle.net/kevinPHPkevin/gZXWC/7/

.inner {
    line-height:72px;
    border: 1px solid #000000;
}

1 votes

J'ai posté un lien qui explique également cette méthode. Ce n'est pas la méthode que je préfère, si le reste de la mise en page n'est pas de taille fixe. J'ai rencontré des problèmes sur des fenêtres de taille différente avec cette méthode.

2 votes

Oui, la technique de la hauteur de ligne fonctionne bien, mais UNIQUEMENT SI vous avez un contenu d'une seule ligne. Les lignes supplémentaires seront perdues / déborderont du conteneur et vous devrez recommencer !

0 votes

A) line-height modifiera également la hauteur de l'élément intérieur. b) L'élément intérieur n'est toujours pas centré verticalement de manière précise. c) Cela ne fonctionne pas sur les éléments qui ne contiennent pas de texte, par ex : <img> ou des éléments à hauteur fixe.

27voto

kornieff Points 714

Si vous ne pouvez pas compter sur la flexbox... Placez .child en .parent du centre. Fonctionne lorsque la taille des pixels est inconnue (en d'autres termes, toujours) et aucun problème avec IE9+ également.

.parent { position: relative; }

.child {
    position: absolute;
    top : 50%;
    left: 50%;
    -ms-transform: translate(-50%, -50%);
    transform    : translate(-50%, -50%);    
}

<div class="parent" style="background:lightyellow; padding:6em"> 
  <div class="child" style="background:gold; padding:1em">&mdash;</div> 
</div>

0 votes

C'est en fait la solution la mieux conçue, d'autant plus que la plupart des projets que j'ai vus jusqu'à présent nécessitent la compatibilité avec IE9.

5voto

Dory Zidon Points 3069

Voici un excellent article sur l'alignement vétérinaire J'aime la méthode du flotteur.

http://www.vanseodesign.com/css/vertical-centering/

Le HTML :

<div id="main">
    <div id="floater"></div>
    <div id="inner">Content here</div>
</div>

Et le style correspondant :

#main {
   height: 250px;
}

#floater {
   float: left;
   height: 50%;
   width: 100%;
   margin-bottom: -50px;
}

#inner {
   clear: both;
   height: 100px;
}

3 votes

Je pense que si vous définissez la hauteur du bloc #inner, cela invalide le concept de centrage vertical correct. L'OPS a demandé à ce que ce soit automatique, donc j'imagine que cela signifie que la hauteur du bloc intérieur n'est pas connue au moment de la conception.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X