Comment centrer un élément horizontalement et verticalement

408

J'essaie de centrer le contenu de mes onglets verticalement, mais lorsque j'ajoute le style CSS display:inline-flex, l'alignement horizontal du texte disparaît.

Comment puis-je faire les deux alignements de texte x et y pour chacun de mes onglets?

* { box-sizing: border-box; }
#leftFrame {
  background-color: green;
  position: absolute;
  left: 0;
  right: 60%;
  top: 0;
  bottom: 0;
}
#leftFrame #tabs {
  background-color: red;
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  height: 25%;
}
#leftFrame #tabs div {
  border: 2px solid black;
  position: static;
  float: left;
  width: 50%;
  height: 100%;
  text-align: center;
  display: inline-flex;
  align-items: center;
}
<div id=leftFrame>
  <div id=tabs>
    <div>first</div>
    <div>second</div>
  </div>
</div>

shuji
la source
Dernières méthodes CSS utilisant le type d'affichage flex et CSS 2D transform sans largeur et hauteur centre div horizontalement et verticalement en utilisant uniquement les méthodes CSS freakyjolly.com/…
Code Spy

Réponses:

667
  • Approche 1 - transform translateX/ translateY:

    Exemple ici / Exemple plein écran

    Dans les navigateurs pris en charge (la plupart d'entre eux), vous pouvez utiliser top: 50%/ left: 50%en combinaison avec translateX(-50%) translateY(-50%)pour centrer dynamiquement verticalement / horizontalement l'élément.

.container {
    position: absolute;
    top: 50%;
    left: 50%;
    -moz-transform: translateX(-50%) translateY(-50%);
    -webkit-transform: translateX(-50%) translateY(-50%);
    transform: translateX(-50%) translateY(-50%);
}
<div class="container">
    <span>I'm vertically/horizontally centered!</span>
</div>


  • Approche 2 - Méthode Flexbox:

    Exemple ici / Exemple plein écran

    Dans les navigateurs pris en charge , définissez l' displayélément cible sur flexet utilisez-le align-items: centerpour le centrage vertical et justify-content: centerpour le centrage horizontal. N'oubliez pas d'ajouter des préfixes de fournisseur pour une prise en charge supplémentaire du navigateur ( voir l'exemple ).

html, body, .container {
    height: 100%;
}

.container {
    display: -webkit-flexbox;
    display: -ms-flexbox;
    display: -webkit-flex;
    display: flex;
    -webkit-flex-align: center;
    -ms-flex-align: center;
    -webkit-align-items: center;
    align-items: center;
    justify-content: center;
}
<div class="container"> 
  <span>I'm vertically/horizontally centered!</span>
</div>


  • Approche 3 - table-cell/vertical-align: middle :

    Exemple ici / Exemple plein écran

    Dans certains cas, vous devrez vous assurer que la hauteur de l'élément html/ bodyest définie sur100% .

    Pour un alignement vertical, définissez l'élément parent widthde / heightpour 100%et ajouter display: table. Ensuite, pour l'élément enfant, changez le displayen table-cellet ajoutezvertical-align: middle .

    Pour le centrage horizontal, vous pouvez soit ajouter text-align: centerpour centrer le texte et tout autre inlineélément enfant. Vous pouvez également utiliser margin: 0 auto, en supposant que l'élément est de blockniveau.

html, body {
    height: 100%;
}
.parent {
    width: 100%;
    height: 100%;
    display: table;
    text-align: center;
}
.parent > .child {
    display: table-cell;
    vertical-align: middle;
}
<section class="parent">
    <div class="child">I'm vertically/horizontally centered!</div>
</section>


  • Approche 4 - Absolument positionnée 50%par le haut avec déplacement:

    Exemple ici / Exemple plein écran

    Cette approche suppose que le texte a une hauteur connue - dans ce cas, 18px. Positionnez simplement l'élément 50%par le haut, par rapport à l'élément parent. Utilisez une margin-topvaleur négative qui correspond à la moitié de la hauteur connue de l'élément, dans ce cas - -9px.

html, body, .container {
    height: 100%;
}

.container {
    position: relative;
    text-align: center;
}

.container > p {
    position: absolute;
    top: 50%;
    left: 0;
    right: 0;
    margin-top: -9px;
}
<div class="container">
    <p>I'm vertically/horizontally centered!</p>
</div>


  • Approche 5 - La line-heightméthode (la moins flexible - non suggérée):

    Exemple ici

    Dans certains cas, l'élément parent aura une hauteur fixe. Pour un centrage vertical, il vous suffit de définir unline-height sur l'élément enfant valeur égale à la hauteur fixe de l'élément parent.

    Bien que cette solution fonctionne dans certains cas, il convient de noter qu'elle ne fonctionnera pas lorsqu'il y a plusieurs lignes de texte - comme celle-ci .

.parent {
    height: 200px;
    width: 400px;
    background: lightgray;
    text-align: center;
}

.parent > .child {
    line-height: 200px;
}
<div class="parent">
    <span class="child">I'm vertically/horizontally centered!</span>
</div>

Josh Crozier
la source
3
Oui ça marche. J'avais déjà utilisé l'inline-flex sur css3, j'ai donc complètement oublié comment prendre correctement cette approche. Je l'apprécie vraiment, merci beaucoup.
shuji
J'ai ouvert tout l'exemple "Plein écran" ci-dessus, j'ai remarqué que l'alignement vertical est toujours un peu trop près du bas de l'écran (avec une résolution 1920x1080, l'étiquette est 20 pixels trop basse à l'écran). J'ai implémenté l'approche n ° 2 dans ma page Web et j'ai eu le même problème même si le div n'est pas en plein écran. Le problème est encore pire dans ma page Web. (100px trop bas) ...
AXMIM
Vous voudrez peut-être ajouter l'approche 6, en utilisant flexbox (fonctionne dans IE9 +, [90% + couverture du marché du navigateur] (caniuse.com/#feat=flexbox)): display: flexdans le parent et align-self: centerchez les enfants.
Dan Dascalescu
J'ai changé un peu l'approche 2: jsfiddle.net/yeaqrh48/278 . Par conséquent, en réduisant la hauteur de la fenêtre, le texte dépasse la portée et devient impossible à voir. Comment résoudre ce problème?
ollazarev
1
@ josh-crozier Je viens de trouver un site Web avec un lien vers votre message dans leur css xd
zoran404
31

Si CSS3 est une option (ou si vous avez une solution de rechange), vous pouvez utiliser transform:

.center {
    right: 50%;
    bottom: 50%;
    transform: translate(50%,50%);
    position: absolute;
}

Contrairement à la première approche ci-dessus, vous ne voulez pas utiliser à gauche: 50% avec la traduction négative car il y a un bogue de débordement dans IE9 +. Utilisez une valeur droite positive et vous ne verrez pas de barres de défilement horizontales.

Mr Bullets
la source
Je crois que la transformation devrait être à la transform: translateX(50%) translateY(50%);place. La transformation ci-dessus n'est pas syntaxiquement correcte selon les documents de transformation de Mozilla .
Eirik H
1
@EirikH Je ne sais pas ce que vous regardiez, mais cette syntaxe est très bien (et le dit dans les documents). La plupart des transformvaleurs qui peuvent prendre une valeur X et Y ont une fonction de base pour prendre les deux et des fonctions spécialisées pour n'en prendre qu'une.
Scott Marcus
9

La meilleure façon de centrer une boîte verticalement et horizontalement, est d'utiliser deux conteneurs:

Le conteneur extérieur:

  • avoir dû display: table;

Le récipient intérieur:

  • avoir dû display: table-cell;
  • avoir dû vertical-align: middle;
  • avoir dû text-align: center;

La zone de contenu:

  • avoir dû display: inline-block;
  • devrait ajuster l'alignement horizontal du texte, sauf si vous voulez que le texte soit centré

Démo:

body {
    margin : 0;
}

.outer-container {
    display: table;
    width: 80%;
    height: 120px;
    background: #ccc;
}

.inner-container {
    display: table-cell;
    vertical-align: middle;
    text-align: center;
}

.centered-content {
    display: inline-block;
    text-align: left;
    background: #fff;
    padding : 20px;
    border : 1px solid #000;
}
<div class="outer-container">
   <div class="inner-container">
     <div class="centered-content">
        Center this!
     </div>
   </div>
</div>

Voir aussi ce violon !

Centrage au milieu de la page:

Pour centrer votre contenu au milieu de votre page, ajoutez ce qui suit à votre conteneur externe:

  • position : absolute;
  • width: 100%;
  • height: 100%;

Voici une démo pour ça:

body {
    margin : 0;
}

.outer-container {
    position : absolute;
    display: table;
    width: 100%;
    height: 100%;
    background: #ccc;
}

.inner-container {
    display: table-cell;
    vertical-align: middle;
    text-align: center;
}

.centered-content {
    display: inline-block;
    text-align: left;
    background: #fff;
    padding : 20px;
    border : 1px solid #000;
}
<div class="outer-container">
   <div class="inner-container">
     <div class="centered-content">
        Center this!
     </div>
   </div>
</div>

Voir aussi ce violon !

John Slegers
la source
7

Voici comment utiliser 2 propriétés flex simples pour centrer n divs sur les 2 axes:

  • Réglez la hauteur de votre conteneur: Ici, le corps est réglé à au moins 100vh.
  • align-items: center centrera verticalement les blocs
  • justify-content: space-around distribuera l'espace horizontal libre autour des divs

body {
  min-height: 100vh;
  display: flex;
  align-items: center;
  justify-content: space-around;
}
<div>foo</div>
<div>bar</div>

Creaforge
la source
5

Exécutez cet extrait de code et voyez un div aligné verticalement et horizontalement.

html,
body,
.container {
  height: 100%;
  width: 100%;
}
.container {
  display: flex;
  align-items: center;
  justify-content: center;
}
.mydiv {
  width: 80px;
}
<div class="container">
  <div class="mydiv">h & v aligned</div>
</div>

JFathi
la source
3

La solution la plus simple et la plus propre pour moi utilise la propriété CSS3 "transform":

.container {
  position: relative;
}

.container a {
  position: absolute;
  top: 50%;
  transform: translate(0,-50%);
}
<div class="container">
  <a href="#">Hello world!</a>
</div>

tocqueville
la source
3

    .align {
        display: flex;
        width: 400px;
        height: 400px;
        border: solid 1px black;
        align-items: center;
        justify-content: space-around;
    }
    .align div:first-child {
        width: 20px;
        height: 20px;
        background-color: red;
        position: absolute; 
    }
    .align div {
        width: 20px;
        height: 20px;
        background-color: blue;
    }
    <div class='align'>
        <div></div>
        <div></div>
        <div></div>
        <div></div>
        <div></div>
        <div></div>
    </div>

Le premier enfant sera aligné verticalement et horizontalement au centre

Krishna
la source
2

pour centrer la Div dans une page check the fiddle link

#vh {
    border-radius: 15px;
    box-shadow: 0 0 8px rgba(0, 0, 0, 0.4);
    padding: 25px;
    width: 200px;
    height: 200px;
    background: white;
    text-align: center;
    margin: auto;
    position: absolute;
    top: 0;
    left: 0;
    bottom: 0;
    right: 0;
}
<div id="vh">Div to be aligned vertically</div>

Mettre à jour Une autre option consiste à utiliser la boîte flexible check the fiddle link

.vh {
    background-color: #ddd;
    height: 200px;
    align-items: center;
    display: flex;
}
.vh > div {
    width: 100%;
    text-align: center;
    vertical-align: middle;
}
<div class="vh">
    <div>Div to be aligned vertically</div>
</div>

Nerdroid
la source
2

Ci-dessous, l'approche Flex-box pour obtenir le résultat souhaité

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>Flex-box approach</title>
<style>
  .tabs{
    display: -webkit-flex;
    display: flex;
    width: 500px;
    height: 250px;
    background-color: grey;
    margin: 0 auto;
    
  }
  .f{
    width: 200px;
    height: 200px;
    margin: 20px;
    background-color: yellow;
    margin: 0 auto;
    display: inline; /*for vertically aligning */
    top: 9%;         /*for vertically aligning */
    position: relative; /*for vertically aligning */
  }
</style>
</head>
<body>

    <div class="tabs">
        <div class="f">first</div>
        <div class="f">second</div>        
    </div>

</body>
</html>

Manish62
la source
2

Une autre approche consiste à utiliser la table:

<div style="border:2px solid #8AC007; height:200px; width:200px;">
  <table style="width:100%; height:100%">
    <tr style="height:100%">
      <td style="height:100%; text-align:center">hello, multiple lines here, this is super long, and that is awesome, dude</td>
    </tr>
  </table>
</div>

J'arrive
la source
2

Afin de centrer verticalement et horizontalement un élément, nous pouvons également utiliser les propriétés mentionnées ci-dessous.

Cette propriété CSS aligne les éléments verticalement et accepte les valeurs suivantes:

flex-start : les éléments s'alignent sur le haut du conteneur.

flex-end : les éléments s'alignent sur le fond du conteneur.

center : les éléments s'alignent au centre vertical du conteneur.

ligne de base : les éléments s'affichent sur la ligne de base du conteneur.

étirer : les articles sont étirés pour s'adapter au conteneur.

Cette propriété CSS justification-contenu , qui aligne les éléments horizontalement et accepte les valeurs suivantes:

flex-start : les éléments s'alignent sur le côté gauche du conteneur.

flex-end : les éléments s'alignent sur le côté droit du conteneur.

center : les éléments s'alignent au centre du conteneur.

espace entre : les éléments s'affichent avec un espacement égal entre eux.

espace autour : les éléments s'affichent avec un espacement égal autour d'eux.

Divyanshu Rawat
la source
2

Approche CSS grille

#wrapper {
    position: absolute;
    top: 0;
    bottom: 0;
    right: 0;
    left: 0;
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    grid-template-rows: repeat(3, 1fr);
}
.main {
    background-color: #444;
}
<div id="wrapper">
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box main"></div>
</div>

corashina
la source
2

Besoin de suivre la solution nouvelle et facile suivante:

  .centered-class {
      align-items: center;
      display: flex;
      justify-content: center;
      width: 100vw;
      height: 100vh;
    }
<div class="centered-class">
  I'm in center vertically and horizontally.
</div>

Sahil Ralkar
la source
1
  • Approche 6

/*Change units to "%", "px" or whatever*/

#wrapper{
  width: 50%;
  height: 70vh;
  background: rgba(0,0,0,.5);
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  margin: auto;
}
#left{
  width: 50%;
  height: 50vh;
  position: absolute;
  top: 0;
  bottom: 0;
  left: 0;
  margin: auto;
  background: red;
}
#right{
  width: 50%;
  height: 50vh;
  position: absolute;
  top: 0;
  bottom: 0;
  right: 0;
  margin: auto;
  background: green;
}
.txt{
  text-align: center;
  line-height: 50vh;
}
<div id="wrapper">
   <div id="left" class="txt">Left</div>
   <div id="right" class="txt">Right</div>
</div>

    .container{ 
               width: 50%;  //Your container width here
               height: 50%; //Your container height here
               position: absolute; 
               top: 0; 
               right: 0;  
               bottom: 0; 
               left: 0; 
               margin: auto;
    }
derp
la source
1

Faites simplement haut, bas, gauche et droite à 0.

<html>
<head>
<style>
<div> 
{
position: absolute;
margin: auto;
background-color: lightblue;
width: 100px;
height :100px;
padding: 25px;
top :0;
right :0;
bottom:0;
left:0;
}


</style>
</head>
<body>

<div> I am in the middle</div>

</body>
</html>
yoginder bagga
la source
1

Vous pouvez y parvenir en utilisant CSS (votre élément display:inline-grid+ grid-auto-flow: row;) Grid et Flex Box (élément parent display:flex;),

Voir l'extrait ci-dessous

#leftFrame {
  display: flex;
  height: 100vh;
  width: 100%;
}

#tabs {
  display: inline-grid;
  grid-auto-flow: row;
  grid-gap: 24px;
  justify-items: center;
  margin: auto;
}

html,body {
  margin:0;
  padding:0;
}
<div>
<div id=leftFrame>
  <div id=tabs>
    <div>first</div>
    <div>second</div>        
  </div>
</div>
</div>

Springer F
la source
1

Lien source

Méthode 1) Type d'affichage flex

.child-element{
     display: flex;
     justify-content: center;
     align-items: center;
}

Méthode 2) Transformation 2D

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

Voir d'autres méthodes ici

Code Spy
la source
1

La façon la plus simple de centrer un div verticalement et horizontalement est la suivante:

<div style="display: table; width: 200px; height: 200px; border: 1px solid black;">
    <div style="display: table-cell; vertical-align: middle; text-align: center;">
        Text Here
    </div>
</div>

Un autre exemple :

.parent {
    display: table; 
    width: 100%; 
    height: 100%;
}

.child {
    display: table-cell; 
    vertical-align: middle;
    text-align: center;
}


<div class="parent">
    <div class="child">
        <h4><u>SERVICE IN BANGLADESH FLEET RESERVE <br> AND <br> RE-ENGAGEMENT ORDER FOR DEFENCE SERVICE</u></h4>
    </div>
</div>
Bablu Ahmed
la source
1

Il s'agit d'un problème connexe que les gens peuvent consulter sur cette page lors de la recherche: lorsque je veux centrer un div pour un gif animé "en attente" de 100px, j'utilise:

  .centreDiv {
        position: absolute;
        top: calc(50vh - 50px);
        top: -moz-calc(50vh - 50px);
        top: -webkit-calc(50vh - 50px);
        left: calc(50vw - 50px);
        left: -moz-calc(50vw - 50px);
        left: -webkit-calc(50vw - 50px);
        z-index: 1000; /*whatever is required*/
    }
davaus
la source
1

Si vous le préférez sans :
flexbox / grille / table
ou sans :
vertical-align: middle

Tu peux faire:

HTML

<div class="box">
  <h2 class="box_label">square</h2>
</div>

CSS

.box {
  box-sizing: border-box;
  width: 100px;
  height: 100px;
  text-align: center;
  border: 1px solid black;
}

.box_label {
  box-sizing: border-box;
  display: inline-block;
  transform: translateY(50%);
  text-align: center;
  border: 1px solid black;
}
Eden Sharvit
la source
0

Cela devrait fonctionner

.center-div {
    display: flex;
    flex-direction: column;
    justify-content: center;
    align-items: center;
    text-align: center;
    min-height: 100vh;
}
<div class="center-div">Center Div</div>

Shalmali Jain
la source
0

Facile ! Utilisez l'affichage flex sur le conteneur et la marge automatique sur le texte !!!!

#hood{

 width : 300px;
 height: 100px;
 border: solid 1px #333333;
 display: flex; 
}

#hood span{

  margin: auto
}



<html>
<head></head>
    <body>
        <div id="hood">
            <span> I Am Centered</span>
        </div>
    </body>
</html>

Démo: https://jsfiddle.net/ay95f08g/

Testé: Safari, Chrome, Firefox et Opera sur MacOs Mojave. (toute dernière mise à jour le 25 février 2019)

Diego Favero
la source
0

Ils sont nombreux à faire de même. vous pouvez utiliser la méthode suivante pour faire le div au milieu de la page.

.center-box {
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%,-50%);
}
<div class="center-box">
  <h1>Text in center of page</h1>
</div>

à votre santé !

Shoyeb Memon
la source
0

Le plus simple flexbox approche la :

Le moyen le plus simple de centrer un seul élément verticalement et horizontalement est d'en faire un élément flexible et de définir sa marge sur auto:

Si vous appliquez des marges automatiques à un élément flexible, cet élément étendra automatiquement sa marge spécifiée pour occuper l'espace supplémentaire dans le conteneur flexible ...

.flex-container {
  height: 150px;
  display: flex;
}

.flex-item {
  margin: auto;
}
<div class="flex-container">
  <div class="flex-item">
    This should be centered!
  </div>
</div>

Cette extension des marges dans chaque direction poussera l'élément exactement au milieu de son conteneur.

ajobi
la source