Je sais donc que nous pouvons centrer un div horizontalement si nous utilisons margin:0 auto;
. margin:auto auto;
devrait-il fonctionner comme je pense que cela devrait fonctionner? Le centrer verticalement aussi?
Pourquoi vertical-align:middle;
ne fonctionne-t-il pas non plus?
.black {
position:absolute;
top:0;
bottom:0;
left:0;
right:0;
background:rgba(0,0,0,.5);
}
.message {
background:yellow;
width:200px;
margin:auto auto;
padding:10px;
}
<div class="black">
<div class="message">
This is a popup message.
</div>
</div>
Vous ne pouvez pas utiliser:
vertical-align:middle
car c'est non applicable aux éléments de niveau bloc
margin-top:auto
et margin-bottom:auto
car leurs valeurs utilisées se calculent comme zéro
margin-top:-50%
parce que les valeurs de marge basées sur un pourcentage sont calculées par rapport au largeur du bloc conteneur
En fait, la nature des flux de documents et des algorithmes de calcul de hauteur d'élément rendent impossible l'utilisation de marges pour centrer un élément verticalement à l'intérieur de son parent. Chaque fois que la valeur d'une marge verticale est modifiée, un re-calcul de la hauteur de l'élément parent (re-flow) est déclenché, ce qui déclenche à son tour un recentrage de l'élément d'origine ... ce qui en fait une boucle infinie.
Vous pouvez utiliser:
Quelques solutions de contournement comme celle-ci qui fonctionnent pour votre scénario; les trois éléments doivent être imbriqués comme suit:
.container {
display: table;
height: 100%;
position: absolute;
overflow: hidden;
width: 100%;
}
.helper {
#position: absolute;
#top: 50%;
display: table-cell;
vertical-align: middle;
}
.content {
#position: relative;
#top: -50%;
margin: 0 auto;
width: 200px;
border: 1px solid orange;
}
<div class="container">
<div class="helper">
<div class="content">
<p>stuff</p>
</div>
</div>
</div
JSFiddle fonctionne bien selon Browsershot.
Depuis que cette question a été posée en 2012 et que nous avons parcouru un long chemin avec le support des navigateurs pour les flexbox, je me suis dit que cette réponse était obligatoire.
Si l'affichage de votre conteneur parent est flex
, alors yes, margin: auto auto
(également appelé margin: auto
) fonctionnera pour le centrer horizontalement et verticalement, qu'il s'agisse d'un élément inline
ou block
.
#parent {
width: 50vw;
height: 50vh;
background-color: gray;
display: flex;
}
#child {
margin: auto auto;
}
<div id="parent">
<div id="child">hello world</div>
</div>
Notez qu'il n'est pas nécessaire de spécifier absolument la largeur/hauteur, comme dans ce exemple jfiddle qui utilise le dimensionnement par rapport à la fenêtre d'affichage.
Bien que la prise en charge des flexbox par les navigateurs atteigne un niveau record au moment de la publication, de nombreux navigateurs ne les prennent toujours pas en charge ou exigent des préfixes de fournisseur. Reportez-vous à http://caniuse.com/flexbox pour obtenir des informations actualisées sur l’assistance du navigateur.
Étant donné que cette réponse a reçu un peu d'attention, j'aimerais également souligner qu'il n'est pas nécessaire de spécifier margin
du tout si vous utilisez display: flex
et souhaitez centrer tous les éléments du conteneur:
#parent {
width: 50vw;
height: 50vh;
background-color: gray;
display: flex;
align-items: center; /* horizontal */
justify-content: center; /* vertical */
}
<div id="parent">
<div>hello world</div>
</div>
Voici la meilleure solution que j'ai trouvée: http://jsfiddle.net/yWnZ2/446/ / fonctionne avec Chrome, Firefox, Safari, IE8-11 et Edge.
Si vous avez un height
(height: 1em
, height: 50%
, etc.) déclaré ou s'il s'agit d'un élément où le navigateur connaît la hauteur (par exemple, img
, svg
ou canvas
), alors tout ce dont vous avez besoin pour le centrage vertical est le suivant:
.message {
position: absolute;
top: 0; bottom: 0; left: 0; right: 0;
margin: auto;
}
En général, vous souhaiterez spécifier un width
ou max-width
afin que le contenu ne s'étire pas sur toute la longueur de l'écran/du conteneur.
Si vous utilisez ceci pour un modal que vous voulez toujours centré dans la fenêtre superposée à un autre contenu, utilisez position: fixed;
pour les deux éléments au lieu de position: absolute
. http://jsfiddle.net/yWnZ2/445/
Voici un texte plus complet: http://codepen.io/shshaw/pen/gEiDt
Aucune des solutions de cette page ne fonctionne (pour moi).
Ma solution
Html
<body>
<div class="centered">
</div>
</body>
CSS
.centered {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
Je sais que la question date de 2012, mais j'ai trouvé le moyen le plus simple qui soit et je voulais le partager.
HTML:
<div id="parent">
<div id="child">Content here</div>
</div>
et CSS:
#parent{
height: 100%;
display: table;
}
#child {
display: table-cell;
vertical-align: middle;
}
Si vous connaissez la hauteur de la div que vous souhaitez centrer, vous pouvez la positionner absolument dans son parent, puis définir la valeur top
à 50%
. Cela mettra le haut de l’enfant à 50% de son parent, c’est-à-dire trop bas. Redressez-le en réglant son margin-top
à la moitié de sa hauteur. Alors maintenant, vous avez le milieu médian de la div enfant assis au milieu vertical du parent - centré verticalement!
Exemple:
.black {
position:absolute;
top:0;
bottom:0;
left:0;
right:0;
background:rgba(0,0,0,.5);
}
.message {
background:yellow;
width:200px;
margin:auto auto;
padding:10px;
position: absolute;
top: 50%;
margin-top: -25px;
height: 50px;
}
<div class="black">
<div class="message">
This is a popup message.
</div>
</div>
Ces deux solutions ne nécessitent que deux éléments imbriqués.
First - Positionnement relatif et absolu si le contenu est statique (centre manuel).
.black {
position:relative;
min-height:500px;
background:rgba(0,0,0,.5);
}
.message {
position:absolute;
margin: 0 auto;
width: 180px;
top: 45%; bottom:45%; left: 0%; right: 0%;
}
https://jsfiddle.net/GlupiJas/5mv3j171/
ou pour la conception fluide - pour le centre de contenu exact, utilisez l'exemple ci-dessous à la place:
.message {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
https://jsfiddle.net/GlupiJas/w3jnjuv0/
Vous devez définir "min-height" au cas où le contenu dépasserait 50% de la hauteur de la fenêtre. Vous pouvez également manipuler cette hauteur avec une requête multimédia pour les appareils mobiles et les tablettes. Mais seulement si vous jouez avec un design réactif.
Je suppose que vous pourriez aller plus loin et utiliser un simple script JavaScript/JQuery pour manipuler la hauteur minimale ou la hauteur fixe si une raison quelconque l'exigeait.
Second - si le contenu est fluide, vous pouvez également utiliser les propriétés CSS de tableau et cellule-tableau avec alignement vertical et alignement du texte centré:
/*in a wrapper*/
display:table;
et
/*in the element inside the wrapper*/
display:table-cell;
vertical-align: middle;
text-align: center;
Fonctionne et évolue parfaitement, souvent utilisée comme solution de conception Web réactive avec des dispositions de grille et une requête multimédia qui manipule la largeur de l’objet.
.black {
display:table;
height:500px;
width:100%;
background:rgba(0,0,0,.5);
}
.message {
display:table-cell;
vertical-align: middle;
text-align: center;
}
https://jsfiddle.net/GlupiJas/4daf2v36/
Je préfère la solution de table pour un centrage exact du contenu, mais dans certains cas, le positionnement absolu relatif sera plus efficace, en particulier si nous ne voulons pas conserver la proportion exacte d'alignement du contenu.
.black {
display:flex;
flex-direction: column;
height: 200px;
background:grey
}
.message {
background:yellow;
width:200px;
padding:10px;
margin: auto auto;
}
<div class="black">
<div class="message">
This is a popup message.
</div>
</div>
Il n’existe pas de moyen facile de centrer verticalement div qui conviendrait dans toutes les situations.
Cependant, il existe de nombreuses façons de le faire en fonction de la situation.
En voici quelques uns:
Vous pouvez également google pour "centrage vertical css"
hauteur variable, marge haut et bas auto
.black {background:rgba(0,0,0,.5);
width: 300px;
height: 100px;
display: -webkit-flex; /* Safari */
display: flex;}
.message{
background:tomato;
margin:auto;
padding:5%;
width:auto;
}
<div class="black">
<div class="message">
This is a popup message.
</div>
hauteur variable, marge haut et bas auto
Utilisation de Flexbox:
HTML:
<div class="container">
<img src="http://lorempixel.com/400/200" />
</div>
CSS:
.container {
height: 500px;
display: flex;
justify-content: center; /* horizontal center */
align-items: center; /* vertical center */
}