80 votes

css alignement vertical d'une ou plusieurs lignes

J'ai un titre qui peut avoir une ou plusieurs lignes.

Comment puis-je aligner le texte verticalement ? S'il s'agissait toujours d'une ligne, je pourrais simplement définir la hauteur de ligne sur la hauteur du conteneur.

Je peux le faire en utilisant JavaScript, mais je n'aime pas vraiment cela, je cherche une méthode purement CSS.

De plus, si le conteneur pouvait s'étendre avec les lignes, ce serait parfait, de sorte que je puisse toujours avoir le même rembourrage en haut et en bas.

enter image description here

0 votes

Dans le cas où la hauteur du conteneur peut changer... alors que dire de ceci ? jsbin.com/idiqih/edit#preview

114voto

sandeep Points 43178

Pour cela, vous pouvez utiliser display:table-cell propriété :

.inline {
  display: inline-block;
  margin: 1em;
}
.wrap {
  display: table;
  height:  100px;
  width:   160px;
  padding: 10px;
  border:  thin solid darkgray;
}
.wrap p {
  display:        table-cell;
  vertical-align: middle;
}

<div class="inline">
  <div class="wrap">
    <p>Example of single line.</p>
  </div>
</div>

<div class="inline">
  <div class="wrap">
    <p>To look best, text should really be centered inside.</p>
  </div>
</div>

Mais il fonctionne avec IE8 et plus. Lisez cet article pour plus d'informations : Trucs et astuces CSS : Centrer verticalement du texte multiligne .

0 votes

Je voulais exactement la même chose, mais j'avais aussi besoin que le div consomme toute la hauteur disponible. Ceci devrait m'aider : stackoverflow.com/a/16837667/260665

0 votes

Si vous ne voulez pas que le .wrap d'avoir chiffres magiques pour le height y width vous pouvez régler chacun d'entre eux sur 100% . Ensuite, appliquez le width y height au parent de la .wrap éléments.

10voto

Mr Lister Points 14181

Si vous n'aimez pas le display:table astuce (je sais que je n'en ai pas) voici une solution sans elle :

.cen {
  min-height:5em; width:12em; background:red; margin:1em 0;
}
.cen p {
  display:inline-block; vertical-align:middle;
  margin:0 0 0 1em; width:10em;
}
.cen::after {
   display:inline-block; vertical-align:middle; line-height:5em;
   width:0; content:"\00A0"; overflow:hidden;
}

avec HTML

<div class="cen">
 <p>Text in div 1</p>
</div>

Cela donne à la division une hauteur de 5em, sauf si le contenu est plus élevé, auquel cas elle s'agrandit.
Exemple concret aquí .

Edit : Oh, sur quels navigateurs c'est censé fonctionner ? IE8 ne coopère pas.

(Modification ultérieure : mise à jour du CSS pour gérer les problèmes dans Chrome)

0 votes

Une technique cool. Le problème que j'ai rencontré est que le texte dans la boîte s'est enroulé tout seul (au lieu de s'enrouler avec la balise <br> dans l'exemple), je me suis retrouvé avec beaucoup d'espace blanc supplémentaire au bas de chaque élément dans Chrome. Il semble que le pseudo-élément se prolonge sur une nouvelle ligne. Savez-vous comment atténuer ce problème ?

0 votes

@DominicP Vous avez raison. Apparemment, le ::after pense qu'il a une largeur (en raison de son contenu), il ne s'insère donc pas après le bloc p . Malheureusement, il a besoin du contenu, sinon il s'effondrerait complètement et cela ne fonctionnerait pas. Mais je ne suis pas sûr de la raison pour laquelle cela ne se produit qu'avec des lignes enveloppantes et non avec des lignes simples. p s.

0 votes

Quoi qu'il en soit, j'ai mis à jour la réponse avec la solution. L'astuce consiste à faire en sorte que le p moins large que le div, de sorte qu'il y a de la place à droite de celui-ci pour le div de largeur zéro. ::after bloc. J'espère que cela vous aidera !

9voto

Rolf Points 922

J'aime beaucoup cette solution :

<div>
    <span style="display: inline-block; vertical-align: middle; height: --The height of your box here--"></span>
    <span style="display: inline-block; vertical-align: middle;">Put your multi-line content here</span>
</div>

N'hésitez pas à utiliser des feuilles de style, et 100% pour la hauteur...

Il faudra peut-être aussi commenter les espaces entre les balises span, puisqu'il s'agit de blocs inline.

Le mérite revient à Hadès . Je l'ai obtenu de Ici

<div style="outline:thin solid red;">
  <span style="display: inline-block; vertical-align: middle; height: 60px;"></span>
  <span style="display: inline-block; vertical-align: middle;">Put your multi-line content here.</span>
</div>

<div style="outline:thin solid red;">
  <span style="display: inline-block; vertical-align: middle; height: 60px;"></span>
  <span style="display: inline-block; vertical-align: middle;">Put your multi-line content here. Put your multi-line content here. Put your multi-line content here. Put your multi-line content here. Put your multi-line content here.</span>
</div>

Nota: Cela ne semble pas fonctionner avec un contenu à lignes multiples.

2 votes

Cette solution est géniale :) merci ! Je déteste avoir à me fier aux tableaux !

0 votes

Je n'arrive pas à croire que ça ait marché ! C'est de loin la seule solution qui a fonctionné !

1 votes

C'est la solution la plus propre à mon goût. Je me demande si les spécifications CSS fourniront un moyen non bricolé de le faire de mon vivant.

3voto

Aram Mkrtchyan Points 1105

Quelque chose comme ça

HTML

<div>
    <p>
       Lorem Ipsum is simply
    </p>
</div>

CSS

div {
   display: table;
}
p {
   display:table-cell;
   vertical-align: middle;
}

1voto

Ryan Brodie Points 1381

En ce qui concerne le style, un tableau serait la meilleure façon de présenter votre contenu (mettez les balises de style dans le CSS) :

<table style="border:1;collapse;width:300px;padding:5px;background-color:red;">
<tr>
    <td style="width:250px;vertical-align:middle;">Lorem ipsum dolor sit amet ipswum dolor</td>
    <td style="width:50px;vertical-align:top;color:white;">1 Line</td>
</tr>

Le comptage des lignes nécessitera un JS script, regardez ici :

http://www.webdeveloper.com/forum/archive/index.php/t-44333.html

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