web-dev-qa-db-fra.com

Comment centrer verticalement les divs?

J'essaie de créer une petite zone de saisie du nom d'utilisateur et du mot de passe.

Je voudrais demander, comment alignez-vous verticalement un div?

Ce que j'ai c'est:

<div id="Login" class="BlackStrip floatright">
   <div id="Username" class="floatleft">Username<br>Password</div>
   <div id="Form" class="floatleft">
   <form action="" method="post">
      <input type="text" border="0"><br>
      <input type="password" border="0">
   </form>
   </div>
</div>

Comment puis-je faire en sorte que la div avec id Username et Form s'aligne verticalement sur le centre? J'ai essayé de mettre:

vertical-align: middle;

en CSS pour la div avec id Login, mais cela ne semble pas fonctionner. Toute aide serait appréciée.

105
Crays

La meilleure approche dans les navigateurs modernes consiste à utiliser flexbox:

#Login {
    display: flex;
    align-items: center;
}

Certains navigateurs auront besoin de préfixes de fournisseur. Pour les navigateurs plus anciens ne prenant pas en charge flexbox (par exemple, IE 9 et inférieur), vous devez implémenter une solution de secours à l'aide de l'une des anciennes méthodes .

Lecture recommandée

196
Andy E

Cela peut être fait avec 3 lignes de CSS et est compatible avec (y compris) IE9:

.element {
  position: relative;
  top: 50%;
  transform: translateY(-50%);
}

Exemple: http://jsfiddle.net/cas07zq8/

crédit

82
patmood

Vous pouvez aligner verticalement un div dans un autre div. Voir cet exemple sur JSFiddle ou considérez l'exemple ci-dessous.

HTML

<div class="outerDiv">
    <div class="innerDiv"> My Vertical Div </div>
</div>

CSS

.outerDiv {
    display: inline-flex;  // <-- This is responsible for vertical alignment
    height: 400px;
    background-color: red;
    color: white;
}

.innerDiv {
    margin: auto 5px;   // <-- This is responsible for vertical alignment
    background-color: green;   
}

La marge du .innerDiv doit être au format suivant: margin: auto *px; 

[Où, * est la valeur souhaitée.]

display: inline-flex est pris en charge par les derniers navigateurs (mis à jour/version actuelle) avec prise en charge de HTML5. 

Cela peut ne pas fonctionner dans Internet Explorer: P :)

Essayez toujours de définir une hauteur pour toute div alignée verticalement (c'est-à-dire innerDiv) pour contrer les problèmes de compatibilité.

75
Lalit Kumar

Je suis assez tard pour la fête, mais je l’ai moi-même inventé et c’est l’un de mes raccourcis favoris pour l’alignement vertical. C'est simple et facile de comprendre ce qui se passe.

Vous utilisez l'attribut :before css pour insérer un div au début du div parent, donnez-lui display:inline-block et vertical-align:middle, puis donnez les mêmes propriétés au div enfant. Puisque vertical-align est destiné à l’alignement le long d’une ligne, ces divs en ligne seront considérés comme une ligne.

Faites le :before div height:100%, et le div enfant suivra et alignera automatiquement au milieu d'une très "grande" ligne.

.parent:before, .child {
    display:inline-block;
    vertical-align:middle;
}
.parent:before {
    content:""; // so that it shows up
    height:100%; // so it takes up the full height
}

Voici un violon pour démontrer de quoi je parle. La div de l'enfant peut avoir n'importe quelle hauteur et vous ne devez jamais modifier ses marges/paddings.
Et voici un violon plus explicatif .

Si vous n'aimez pas :before, vous pouvez toujours mettre manuellement un div.

<div class="parent">
    <div class="before"></div>
    <div class="child">
        content
    </div>
</div>

Et puis réaffectez simplement .parent:before à .parent .before

13
Overcode

Si vous connaissez la hauteur, vous pouvez utiliser le positionnement absolu avec un margin-top négatif comme suit:

#Login {
    width:400px;
    height:400px;
    position:absolute;
    top:50%;
    left:50%;
    margin-left:-200px; /* width / -2 */
    margin-top:-200px; /* height / -2 */
}

Sinon, il n'y a pas vraiment de moyen de centrer verticalement un div avec juste du CSS

12
anonymous coward

Le commentaire de @ GáborNagy sur un autre billet était la solution la plus simple que j'ai pu trouver et a fonctionné comme un charme pour moi, car il a apporté un faux-violon que je copie ici avec un petit ajout:

CSS:

#wrapper {
    display: table;
    height: 150px;
    width: 800px;
    border: 1px solid red;
}

#cell {
    display: table-cell;
    vertical-align: middle;
}

HTML:

<div id="wrapper">
    <div id="cell">
        <div class="content">
            Content goes here
        </div>
    </div>
</div>

Si vous souhaitez également l'aligner horizontalement, vous devrez ajouter une autre div "inner-cell" à l'intérieur de la "cellule" div et lui donner le style suivant:

#inner-cell{
      width: 250px;
      display: block;
      margin: 0 auto;
}
3
BornToCode

J'ai trouvé ce site utile: http://www.vanseodesign.com/css/vertical-centering/ Cela a fonctionné pour moi:

HTML

<div id="parent">
    <div id="child">Content here</div>
</div>

CSS

#parent {
    padding: 5% 0;
}

#child {
    padding: 10% 0;
}
3
testpattern

Dans mon Firefox et Chrome fonctionnent ceci: 

CSS: 

display: flex;
justify-content: center;     // vertical align
align-items: center;         // horizontal align
2
Kamil Kot

J'avais besoin de spécifier min-height

#login
    display: flex
    align-items: center
    justify-content: center
    min-height: 16em
1
Harry Bosh

http://jsfiddle.net/dvL512e7/

À moins que le div aligné ne soit à hauteur fixe, essayez d’utiliser le CSS suivant pour le div aligné:

{
  margin: auto;
  position: absolute;
  top: 0;
  left: 0;
  bottom: 0;
  right: 0;
  display: table;
}
1
grebenyuksv

L'alignement vertical a toujours été délicat.

Ici, j'ai couvert une méthode d'alignement vertical d'un div.

http://jsfiddle.net/3puHE/

HTML:

<div style="display:flex;">

<div class="container table">
<div class="tableCell">
<div class="content"><em>Table</em> method</div>
</div>
</div>

<div class="container flex">
<div class="content new"><em>Flex</em> method<br></div>
</div>

<div class="container relative">
<div class="content"><em>Position</em> method</div>
</div>

<div class="container margin">
<div class="content"><em>Margin</em> method</div>
</div>

</div>

CSS:

em{font-style: normal;font-weight: bold;}
.container {
    width:200px;height:200px;background:#ccc;
    margin: 5px; text-align: center;
}
.content{
    width:100px; height: 100px;background:#37a;margin:auto;color: #fff;
}
.table{display: table;}
.table > div{display: table-cell;height: 100%;width: 100%;vertical-align: middle;}
.flex{display: flex;}
.relative{position: relative;}
.relative > div {position: absolute;top: 0;left: 0;right: 0;bottom: 0;}
.margin > div {position:relative; margin-top: 50%;top: -50px;}
1
Barun

J'ai trouvé un moyen qui fonctionne très bien pour moi. Le script suivant insère une image invisible (identique à bgcolor ou un gif transparent) avec une hauteur égale à la moitié de la taille de l'espace blanc à l'écran. L'effet est un alignement vertical parfait. 

Supposons que vous avez un en-tête div (hauteur = 100) et un pied de page div (hauteur = 50) et que le contenu de la div principale que vous souhaitez aligner a une hauteur de 300: 

<script type="text/javascript" charset="utf-8">
var screen = window.innerHeight;
var content = 150 + 300;
var imgheight = ( screen - content) / 2 ;
document.write("<img src='empty.jpg' height='" + imgheight + "'>"); 
</script>   

Vous placez le script juste avant le contenu que vous souhaitez aligner!

Dans mon cas, le contenu que j'aimais aligner était une image (largeur = 95%) avec un rapport de format de 100: 85 (largeur: hauteur). Signifiant que la hauteur de l'image correspond à 85% de sa largeur. Et la largeur étant 95% de la largeur de l'écran.

J'ai donc utilisé:

var content = 150 + ( 0.85 * ( 0.95 * window.innerWidth ));

Combinez ce script avec

<body onResize="window.location.href = window.location.href;">

et vous avez un alignement vertical lisse.

J'espère que cela fonctionne pour vous aussi!

0
decaff

si vous utilisez une hauteur fixe, vous pouvez utiliser padding-top selon vos besoins en matière de conception .. ou vous pouvez utiliser top: 50% si nous utilisons div, l'alignement vertical ne fonctionne pas, nous utilisons donc le rembourrage en haut ou la position en fonction des besoins.

0
Kali Charan Rajput

le moyen le plus simple de centrer votre élément div consiste à utiliser cette classe avec les propriétés suivantes.

.light {
    margin: auto;
    width: 50%;
    border: 3px solid green;
    padding: 10px;
}
0
parag patel

Centrer les éléments enfants dans un div. Cela fonctionne pour toutes les tailles d'écran

#parent {
    padding: 5% 0;
}

#child {
    padding: 10% 0;
}

<div id="parent">
    <div id="child">Content here</div>
</div>

pour plus de détails, vous pouvez visiter ce lien

0
WasiF