Je veux centrer un div qui est ajouté à l'intérieur d'un autre div.
<div id="outerDiv">
<div id="innerDiv">
</div>
</div>
C'est le CSS que j'utilise actuellement.
#outerDiv{
width: 500px;
height: 500px;
position:relative;
}
#innerDiv{
width: 284px;
height: 290px;
position:absolute;
top: 50%;
left:50%;
margin-top: -147px;
margin-left: -144px;
}
Comme vous pouvez le constater, l’approche que j’utilise maintenant dépend des valeurs de largeur et de hauteur de innerDiv
. Si la largeur/la hauteur change, je devrai modifier les valeurs de margin-top
et de margin-left
. innerDiv
toujours indépendamment de sa taille?
J'ai compris que l'utilisation de margin:auto
peut aligner horizontalement le innerDiv au milieu. Mais qu'en est-il de l'alignement vertical du milieu?
L'alignement vertical au milieu fonctionne, mais vous devrez utiliser table-cell
sur votre élément parent et inline-block
sur l'enfant.
Cette solution ne fonctionnera pas dans IE6 & 7.
Le vôtre est le moyen le plus sûr d’y aller.
Mais puisque vous avez marqué votre question avec CSS3 et HTML5, je pensais que cela ne vous dérangeait pas d'utiliser une solution moderne.
La solution classique (tableau)
C'était ma réponse originale. Cela fonctionne toujours bien et est la solution avec le support le plus large. La disposition de la table va affecter vos performances de rendu donc je vous suggère d'utiliser l'une des solutions les plus modernes.
Testé dans:
HTML
<div class="cn"><div class="inner">your content</div></div>
CSS
.cn {
display: table-cell;
width: 500px;
height: 500px;
vertical-align: middle;
text-align: center;
}
.inner {
display: inline-block;
width: 200px; height: 200px;
}
Solution moderne (transformation)
Puisque les transformations sont assez bien supportées maintenant il existe un moyen plus simple de le faire.
CSS
.cn {
position: relative;
width: 500px;
height: 500px;
}
.inner {
position: absolute;
top: 50%; left: 50%;
transform: translate(-50%,-50%);
width: 200px;
height: 200px;
}
_ { Démo } _
♥ ma solution moderne préférée (flexbox)
J'ai commencé à utiliser de plus en plus flexbox aussi bien supporté maintenant C'est de loin le moyen le plus simple.
CSS
.cn {
display: flex;
justify-content: center;
align-items: center;
}
_ { Démo } _
Autres exemples et possibilités: Comparez toutes les méthodes sur une seule page
Une autre manière de réaliser ce centrage horizontal et vertical consiste à:
.Absolute-Center {
margin: auto;
position: absolute;
top: 0; left: 0; bottom: 0; right: 0;
}
( Référence )
La division extérieure doit définir sa position
sur relative
ou fixed
, et la division intérieure doit définir sa position
sur absolute
, top
et left
sur 50%
et appliquer une transform: translate(-50%, -50%)
.
div.cn {
position: relative;
width: 200px;
height: 200px;
background: gray;
text-align: center;
}
div.inner {
position: absolute;
top: 50%;
left: 50%;
width: 100px;
height: 100px;
-webkit-transform: translate(-50%, -50%);
transform: translate(-50%, -50%);
background: red;
}
<div class="cn">
<div class="inner">
test
</div>
</div>
Testé dans:
Vertical Align Anything avec seulement 3 lignes de CSS
HTML
<div class="parent-of-element">
<div class="element">
<p>Hello</p>
</div>
</div>
Le plus simple
.element {
position: relative;
top: 50%;
transform: translateY(-50%);
}
CSS
.parent-of-element {
position: relative;
height: 500px;
/* or height: 73.61% */
/* or height: 35vh */
/* or height: ANY HEIGHT */
}
.element {
position: absolute;
top: 50%;
-webkit-transform: translateY(-50%);
-ms-transform: translateY(-50%);
transform: translateY(-50%);
}
Selon shouldiprefix ce sont les seuls préfixes dont vous avez besoin
Vous pouvez également utiliser% comme valeur pour la propriété 'height' de .parent-of-element, tant que le parent de l'élément a une hauteur ou un contenu qui développe sa taille verticale.
Au lieu de m'attacher à un nœud avec des CSS difficiles à écrire et à maintenir (qui nécessite également une validation minutieuse entre navigateurs!), Je trouve qu'il est de loin préférable d'abandonner les CSS et d'utiliser à la place un code HTML 1.0 merveilleusement simple:
<table id="outerDiv" cellpadding="0" cellspacing="0" border="0">
<tr>
<td valign="middle" id="innerDiv">
</td>
</tr>
</table>
Ceci accomplit tout ce que l'affiche originale voulait, et est robuste et maintenable.
Personnellement, je préfère utiliser un pseudo-élément masqué pour couvrir toute la hauteur du conteneur externe et l'aligner verticalement avec l'autre contenu . Chris Coyier a rédigé un article de Nice sur la technique. http://css-tricks.com/centering-in-the-unknown/ L'énorme avantage de cette technologie est son évolutivité. Vous n'avez pas besoin de connaître la hauteur du contenu ni de vous inquiéter de sa croissance/diminution. Cette solution évolue :).
Voici un violon avec tout le CSS dont vous avez besoin et un exemple de travail. http://jsfiddle.net/m5sLze0d/
.center:before {
content: ""; /* Adding Extra Space Above Element */
display: inline-block;
height: 100%;
margin-right: -0.3em;
vertical-align: middle;
}
.center_element {
display:inline-block;
float:none;
vertical-align:middle;
white-space:normal;
text-align:left;
}
#outerDiv{
width: 500px;
height: 500px;
position:relative;
background:grey;
display:flex;
justify-content:center;
align-items:center;
}
#innerDiv{
background:cyan;
width: 284px;
height: 290px;
}
<div id="outerDiv">
<div id="innerDiv">Inner Div
</div>
</div>
vous pouvez le faire en ajoutant simplement le style css mentionné ci-dessus. Bonne chance. pour requête écrire un commentaire
Lorsque votre height
n'est pas défini (auto); vous pouvez donner à la div interne un certain rembourrage (haut et bas) pour le centrer verticalement
<div>
<div style="padding-top:20px;padding-bottom:20px">
<!--content-->
</div>
</div>
Il suffit de définir le conteneur sur display:table
, puis les éléments internes sur display:table-cell
. Définissez une height
sur le conteneur, puis définissez vertical-align:middle
sur les éléments internes. Cela a une compatibilité étendue depuis IE9.
Notez simplement que l'alignement vertical dépendra de la hauteur du conteneur parent.
.cn
{
display:table;
height:80px;
background-color:#555;
}
.inner
{
display:table-cell;
vertical-align:middle;
color:#FFF;
padding-left:10px;
padding-right:10px;
}
<div class="cn">
<div class="inner">Item 1</div>
<div class="inner">Item 2</div>
</div>
entrez la description de l'image ici100% cela fonctionne
.div1{
height: 300px;
background: red;
width: 100%;
display: -ms-flexbox;
display: -webkit-flex;
display: flex;
-ms-flex-align: center;
-webkit-align-items: center;
-webkit-box-align: center;
align-items: center;
}
.div2{
background: green;
height: 100px;
width: 100%;
}
<div class="div1">
<div class="div2">
sdfd
</div>
</div>
Lien de violon < http://jsfiddle.net/dGHFV/2515/ >
Essaye ça
#outerDiv{
width: 500px;
height: 500px;
position:relative;
border:1px solid red;
}
#innerDiv{
width: 284px;
height: 290px;
position:absolute;
top: 0px;
left:0px;
right:0px;
bottom:0px;
margin:auto;
border:1px solid green;
}
Cela fonctionne pour moi. La largeur et la hauteur de la largeur extérieure peuvent être définies.
Voici le code:
.outer {
position: relative;
text-align: center;
width: 100%;
height: 150px; // Any height is allowed, also in %.
background: gray;
}
.outer > div:first-child {
position: absolute;
top: 50%;
left: 50%;
width: 100%;
-webkit-transform: translate(-50%, -50%);
-ms-transform: translate(-50%, -50%);
transform: translate(-50%, -50%);
background: red;
}
<div class="outer">
<div class="inner">
Put here your text or div content!
</div>
</div>
J'utilise la solution suivante depuis plus d'un an. Elle fonctionne également avec IE 7 et 8.
<style>
.outer {
font-size: 0;
width: 400px;
height: 400px;
background: orange;
text-align: center;
display: inline-block;
}
.outer .emptyDiv {
height: 100%;
background: orange;
visibility: collapse;
}
.outer .inner {
padding: 10px;
background: red;
font: bold 12px Arial;
}
.verticalCenter {
display: inline-block;
*display: inline;
zoom: 1;
vertical-align: middle;
}
</style>
<div class="outer">
<div class="emptyDiv verticalCenter"></div>
<div class="inner verticalCenter">
<p>Line 1</p>
<p>Line 2</p>
</div>
</div>
Si vous n'avez toujours pas compris après avoir lu les merveilleuses réponses données ci-dessus.
Voici deux exemples simples de la façon dont vous pouvez y parvenir.
.wrapper {
display: table-cell;
vertical-align: middle;
text-align: center;
width: 400px;
height: 300px;
border: 1px solid #555;
}
.container {
display: inline-block;
text-align: left;
padding: 20px;
border: 1px solid #cd0000;
}
<div class="wrapper">
<div class="container">
Center align a div using "<strong>display: table-cell</strong>"
</div>
</div>
.wrapper {
display: flex;
justify-content: center;
width: 400px;
height: 300px;
border: 1px solid #555;
}
.container {
align-self: center;
padding: 20px;
border: 1px solid #cd0000;
}
<div class="wrapper">
<div class="container">
Centering a div using "<strong>display: flex</strong>"
</div>
</div>
Remarque: Vérifiez la compatibilité de display: table-cell et flex avec le navigateur avant d'utiliser les implémentations susmentionnées.
essayez d'aligner l'élément interne comme ceci:
top: 0;
bottom: 0;
margin: auto;
display: table;
et bien sur:
position: absolute;
Vous pouvez centrer la div verticalement et horizontalement en CSS en utilisant flex;
#outerDiv{
width: 500px;
height: 500px;
position:relative;
border:1px solid #000;
margin:0 auto;
display: flex;
-webkit-flex-direction: row;
flex-direction: row;
-webkit-align-items: center;
align-items: center;
-webkit-justify-content: center;
justify-content: center;
}
#innerDiv{
width: 284px;
height: 290px;
border:1px solid #eee;
}
Et le second est comme suit;
#outerDiv{
width: 500px;
height: 500px;
position:relative;
border:1px solid #000;
}
#innerDiv{
max-width: 300px;
height: 200px;
background-color: blue;
position:absolute;
left:0;
right:0;
top:0;
bottom:0;
margin:auto;
border:1px solid #000;
border-radius:4px;
}
Et le HTML résultant:
<div id="outerDiv">
<div id="innerDiv"></div>
</div>
Vous pouvez le faire avec un simple bloc javascript (jQuery).
CSS:
#outerDiv{
height:100%;
}
Javascript :
<script type="text/javascript">
$(document).ready(function () {
$("#innerDiv").css('top', ($(window).height() - $("#content").height()) / 2);
});
</script>
Cela fonctionnera de retour à IE6!
<!DOCTYPE html>
est également requis sur IE6! [force le mode strict par défaut d'IE6].
(bien sûr, la coloration de la boîte est uniquement à des fins de démonstration)
#outer{
width: 205px;
height: 205px;
margin: auto;
text-align: center;
}
#inner{
text-align: left;
vertical-align: middle;
width: 120px;
height: 120px;
display: inline-block;
}
#center{
height: 100%; width:0px;
vertical-align: middle;
display: inline-block;
}
div {background: rgba(0,128,255,.6)}
<div id=outer>
<div id=center></div><div id=inner> The inner DIV
</div>
</div>
pour innerdiv qui ne spécifie pas sa valeur de hauteur, il n'y a pas de solution pure en CSS pour la centrer verticalement. Une solution javascript pourrait être de offsetHeight, puis calculer le style.marginTop.
text align-center sur l’élément parent, display inline-block sur l’élément enfant. Cela centrera presque tout. Je crois que son appel est un "bloc flottant".
<div class="outer">
<div class="inner"> some content </div>
</div><!-- end outer -->
<style>
div.outer{
width: 100%;
text-align: center;
}
div.inner{
display: inline-block;
text-align: left
}
</style>
C'est aussi une bonne alternative aux flotteurs, bonne chance!
Je voudrais montrer une autre méthode multi-navigateur qui peut résoudre cette question à l'aide de CSS3 calc()
.
Nous pouvons utiliser la fonction calc()
pour contrôler la propriété margin-top
de la div enfant lorsqu'elle est positionnée de manière absolue par rapport à la div parent.
L’avantage principal de calc()
est que la hauteur de l’élément parent peut être modifiée à tout moment et que la div de l’enfant sera toujours alignée au centre.
Le calcul de margin-top
est effectué de manière dynamique (par css et non par un script et c’est un très gros avantage).
Cochez cette LIVE DEMO
<!DOCTYPE html>
<html>
<head>
<style>
#parent{
background-color:blue;
width: 500px;
height: 500px;
position:relative;
}
#child{
background-color:red;
width: 284px;
height: 250px;
position:absolute;
/* the middle of the parent(50%) minus half of the child (125px) will allways center vertically the child inside the parent */
margin-top: -moz-calc(50% - 125px);
/* WebKit */
margin-top: -webkit-calc(50% - 125px);
/* Opera */
margin-top: -o-calc(50% - 125px);
/* Standard */
margin-top: calc(50% - 125px);
}
</style>
</head>
<body>
<div id="parent">
<div id="child">
</div>
</div>
</body>
</html>
Sortie:
#outerDiv{
width: 500px;
height: 500px;
position:relative;
background-color: lightgrey;
}
#innerDiv{
width: 284px;
height: 290px;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
-ms-transform: translate(-50%, -50%); /* IE 9 */
-webkit-transform: translate(-50%, -50%); /* Chrome, Safari, Opera */
background-color: grey;
}
<div id="outerDiv">
<div id="innerDiv"></div>
</div>
Pour centrer l'alignement verticalement et horizontalement:
#parentDiv{
display:table;
text-align:center;
}
#child {
display:table-cell;
vertical-align:middle;
}