Donc, je sais que nous pouvons centrer une div horizontalement si nous utilisons margin:0 auto;
. Devrait margin:auto auto;
fonctionner comme je pense que cela devrait fonctionner? Le centrer verticalement également?
Pourquoi ne vertical-align:middle;
fonctionne 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>
Réponses:
Mise à jour août 2020
Bien que ce qui suit vaut toujours la peine d'être lu pour les informations utiles, nous avons Flexbox depuis un certain temps maintenant, alors utilisez-le simplement, conformément à cette réponse .
Vous ne pouvez pas utiliser:
vertical-align:middle
car il ne s'applique pas aux éléments de niveau blocmargin-top:auto
etmargin-bottom:auto
parce que leurs valeurs utilisées seraient égales à zéromargin-top:-50%
car les valeurs de marge basées sur un pourcentage sont calculées par rapport à la largeur du bloc conteneurEn fait, la nature du flux de documents et les algorithmes de calcul de la hauteur des éléments rendent impossible l'utilisation des 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, cela déclenchera un recalcul de la hauteur de l'élément parent (re-flux), qui à son tour déclencherait un recentrage de l'élément d'origine ... en faisant 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 ceci:
JSFiddle fonctionne correctement selon Browsershot.
la source
#
est un hack pour avoir la règle préfixée avec elle uniquement interprétée par IE7 et moins. Vous pouvez préférer inclure ces règles plutôt que dans une feuille de style spécifique à IE en utilisant des commentaires conditionnels , etc.position: absolute; top: 50%; transform: translateY(-50%);
c'est aussi faisable et assez populaire ... (contrairement àtop:50%;margin: - $halfHeight
ce que vous n'avez pas besoin de connaître la taille à l'avance ...)Depuis que cette question a été posée en 2012 et que nous avons parcouru un long chemin avec le support du navigateur pour les flexbox, j'ai eu l'impression que cette réponse était obligatoire.
Si l'affichage de votre conteneur parent est
flex
, alors oui ,margin: auto auto
(également appelémargin: auto
) fonctionnera pour le centrer à la fois horizontalement et verticalement, qu'il s'agisse d'un élémentinline
oublock
.Notez que la largeur / hauteur n'a pas à être spécifiée de manière absolue, comme dans cet exemple jfiddle qui utilise le dimensionnement par rapport à la fenêtre.
Bien que la prise en charge des boîtiers flexibles par les navigateurs soit à un niveau record au moment de la publication, de nombreux navigateurs ne la prennent toujours pas en charge ou nécessitent des préfixes de fournisseur. Consultez http://caniuse.com/flexbox pour obtenir des informations mises à jour sur la prise en charge du navigateur.
Mettre à jour
Étant donné que cette réponse a reçu un peu d'attention, je tiens également à souligner que vous n'avez pas du tout besoin de spécifier
margin
si vous utilisezdisplay: flex
et souhaitez centrer tous les éléments du conteneur:la source
Voici la meilleure solution que j'ai trouvée: http://jsfiddle.net/yWnZ2/446/ Fonctionne dans Chrome, Firefox, Safari, IE8-11 et Edge.
Si vous avez une déclaration
height
(height: 1em
,height: 50%
, etc.) ou il est un élément sur lequel le navigateur connaît la hauteur (img
,svg
oucanvas
par exemple), tout ce que vous avez besoin pour le centrage vertical est la suivante:Vous voudrez généralement spécifier un
width
oumax-width
deux, le contenu ne s'étend pas sur toute la longueur de l'écran / du conteneur.Si vous l'utilisez pour un modal que vous souhaitez toujours centré dans la fenêtre chevauchant un autre contenu, utilisez
position: fixed;
pour les deux éléments au lieu deposition: absolute
. http://jsfiddle.net/yWnZ2/445/Voici un résumé plus complet: http://codepen.io/shshaw/pen/gEiDt
la source
position: relative
au parent, et l'élément sera centré dans le parent. J'ai rédigé un article beaucoup plus large sur Smashing Magazine sur la technique si vous souhaitez en savoir plus: coding.smashingmagazine.com/2013/08/09/…parent
- je l'ai compris. Merci beaucoup!display: table
pour un contenu à hauteur variable. Sinon, cette méthode devrait fonctionner comme prévu. Lisez l' ensemble pour plus de détails. Vous devriez également pouvoir tester la vue complète dans IE8 / 9 pour voir s'il y a des problèmes.Edit: c'est 2020, j'utiliserais plutôt une boîte flexible.
Réponse originale:
HTML
CSS
la source
Je sais que la question date de 2012, mais j'ai trouvé le moyen le plus simple et je voulais partager.
HTML:
et CSS:
la source
Si vous connaissez la hauteur du div que vous souhaitez centrer , vous pouvez le positionner de manière absolue dans son parent, puis définir la
top
valeur sur50%
. Cela mettra le haut du div enfant à 50% de son parent, c'est-à-dire trop bas. Tirez-le vers le haut en le réglantmargin-top
à la moitié de sa hauteur. Alors maintenant, vous avez le milieu vertical du div enfant assis au milieu vertical du parent - centré verticalement!Exemple:
http://jsfiddle.net/yWnZ2/2/
la source
margin-top
ne peut être exprimée en% par rapport à la hauteur de l' élément, de sorte que vous vous retrouverez avec une dimension fixe dépendantemargin-top
.Ces deux solutions ne nécessitent que deux éléments imbriqués.
Première - Positionnement relatif et absolu si le contenu est statique (centre manuel).
https://jsfiddle.net/GlupiJas/5mv3j171/
ou pour une conception fluide - pour le centre de contenu exact, utilisez plutôt l'exemple ci-dessous:
https://jsfiddle.net/GlupiJas/w3jnjuv0/
Vous devez définir «hauteur min» 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 tablettes. Mais seulement si vous jouez avec un design réactif.
Je suppose que vous pouvez aller plus loin et utiliser un simple script JavaScript / JQuery pour manipuler la hauteur minimale ou la hauteur fixe s'il y a un besoin pour une raison quelconque.
Deuxièmement - si le contenu est fluide, vous pouvez également utiliser les propriétés css de table et de cellule de tableau avec un alignement vertical et un alignement du texte centré:
et
Fonctionne et s'adapte parfaitement, souvent utilisée comme solution de conception Web réactive avec des mises en page de grille et des requêtes multimédias qui manipulent la largeur de l'objet.
https://jsfiddle.net/GlupiJas/4daf2v36/
Je préfère une solution de table pour le centrage exact du contenu, mais dans certains cas, le positionnement absolu relatif fera mieux, surtout si nous ne voulons pas conserver la proportion exacte d'alignement du contenu.
la source
la source
Il n'y a pas un moyen facile de centrer la div verticalement qui ferait l'affaire 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 rechercher sur Google le "centrage vertical css"
la source
hauteur variable, marge haut et bas auto
hauteur variable, marge haut et bas auto
la source
Utilisation de Flexbox:
HTML:
CSS:
Voir résultat
la source
la source