Comment centrer le div absolu horizontalement en utilisant CSS?

177

J'ai une div et je veux qu'elle soit centrée horizontalement - même si je lui donne margin:0 auto;qu'elle n'est pas centrée ...

.container {
    position: absolute;
    top: 15px;
    z-index: 2;
    width:40%;
    max-width: 960px;
    min-width: 600px;
    height: 60px;
    overflow: hidden;
    background: #fff; 
    margin:0 auto;
}
CoreDo
la source
@LoganMzz ce n'est pas parce que cette question a sa largeur connue.
Davbog

Réponses:

409

Vous devez définir left: 0et right: 0.

Ceci spécifie la distance de décalage des bords de marge par rapport aux côtés de la fenêtre.

Comme 'top', mais spécifie dans quelle mesure le bord de la marge droite d'une boîte est décalé par rapport au [gauche / droite] du bord [droit / gauche] du bloc contenant de la boîte.

Source: http://www.w3.org/TR/CSS2/visuren.html#position-props

Remarque: l'élément doit avoir une largeur inférieure à la fenêtre, sinon il occupera toute la largeur de la fenêtre.

Si vous pouviez utiliser des requêtes multimédias pour spécifier une marge minimale , puis passer à autodes tailles d'écran plus grandes.


.container {
  left:0;
  right:0;

  margin-left: auto;
  margin-right: auto;

  position: absolute;
  width: 40%;

  outline: 1px solid black;
  background: white;
}
<div class="container">
  Donec ullamcorper nulla non metus auctor fringilla.
  Maecenas faucibus mollis interdum.
  Sed posuere consectetur est at lobortis.
  Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor.
  Sed posuere consectetur est at lobortis.
</div>

thgaskell
la source
38
Remarque: widthc'est un must!
Ijas Ameenudeen
2
Oui. C'est correct ... en utilisant un "text-align: center;" et a "gauche: 0; droite: 0;" vous permettra de positionner en absolu un div tout en le gardant centré horizontalement.
Sterling Bourne le
3
@AlexG Je viens de charger le violon dans IE11 et ça marche. Pouvez-vous clarifier?
Brian Webster
1
@AlexG cela fonctionne dans IE11, mais cela ne fonctionnera pas si vous ne déclarez pas de largeur . J'ai eu le même problème. Vous devez utiliser une largeur comme indiqué dans l'exemple.
Panama Jack
1
également nécessaire margin: autopour que cela fonctionne dans notre cas
Crashalot
124

Cela ne fonctionne pas dans IE8 mais pourrait être une option à considérer. C'est surtout utile si vous ne souhaitez pas spécifier de largeur.

.element
{
  position: absolute;
  left: 50%;
  transform: translateX(-50%);
}
Adel
la source
Cela dépendrait probablement des exigences de son projet.
Kris Selbekk
3
À ce stade, il faudrait également une règle avec un préfixe -webkit- pour que cela fonctionne dans Safari.
Shikkediel
Malheureusement, il applique en quelque sorte la transparence de la div environnante également au texte à l'intérieur ..
dnl.re
1
C'est certainement la réponse. Pour moi, avoir une largeur définie spécifiquement est absolument impossible.
Mike
14

Bien que les réponses ci-dessus soient correctes, mais pour simplifier les choses pour les débutants, tout ce que vous avez à faire est de définir la marge, gauche et droite. le code suivant le fera à condition que la largeur soit définie et que la position soit absolue:

margin: 0 auto;
left: 0;
right: 0;

Démo:

.centeredBox {
    margin: 0 auto;
    left: 0;
    right: 0;
   
   
   /** Position should be absolute */
    position: absolute;
    /** And box must have a width, any width */
    width: 40%;
    background: #faebd7;
   
   }
<div class="centeredBox">Centered Box</div>

Meta Pakistanais
la source
1
Cela a fonctionné parfaitement pour des images absolues dans une rangée de colonnes bootstrap
ZachNag
5

Flexbox? Vous pouvez utiliser flexbox.

.box {
  display: -ms-flexbox;
  display: -webkit-flex;
  display: flex;
  
  -webkit-justify-content: center;
  justify-content: center;

}

.box div {
  border:1px solid grey;
  flex: 0 1 auto;
  align-self: auto;
  background: grey;
}
<div class="box">
  <div class="A">I'm horizontally centered.</div>
</div>

Ronnie Royston
la source
Cela a fonctionné à merveille pour mon cas unique. left: 0; right: 0;étendu à 100%, ce qui n'était pas une option car l'élément enfant avait une couleur d'arrière-plan et left: 50%; transform: translateY(-50%);ne fonctionnait pas car cela contraignait l'enfant à une largeur de 50%. C'était la seule solution qui préservait les dimensions flexibles de l'enfant (uniquement limitée à la prise en charge du navigateur). Merci!
Ben Dyer
3
.centerDiv {
    position: absolute;
    left: 0;
    right: 0;
    margin: 0 auto;
    text-align:center;
}
Z. Rahman Raju
la source
0

Voici un lien s'il vous plaît utiliser ceci pour faire le div au centre si la position est absolue.

HTML:

<div class="bar"></div>

CSS:

.bar{
  width:200px;
  border-top:4px solid red;
  position:absolute;
  margin-left:auto;
  margin-right:auto;
  left:0;
  right:0;
}

Exemple jsfiddle

Amit Kumar
la source
-1

Vous ne pouvez pas utiliser margin:auto;sur des position:absolute;éléments, supprimez-le simplement si vous n'en avez pas besoin, mais si vous le faites, vous pouvez utiliser left:30%;((100% -40%) / 2) et des requêtes multimédias pour les valeurs max et min:

.container {
    position: absolute;
    top: 15px;
    left: 30%;
    z-index: 2;
    width:40%;
    height: 60px;
    overflow: hidden;
    background: #fff;
}

@media all and (min-width:960px) {

    .container {
        left: 50%;
        margin-left:-480px;
        width: 960px;
    }

}

@media all and (max-width:600px) {

    .container {
        left: 50%;
        margin-left:-300px;
        width: 600px;
    }

}
Leonard Pauli
la source