Comment centrer un élément enfant dans CSS, même s'il est plus grand que le parent?

Je voudrais créer une classe CSS afin qu'un div puisse être placé au centre de son parent. Le code que j'utilise est:

.centered {
    position: absolute;
    margin: auto;

    bottom: 0px;
    left: 0px;
    top: 0px;
    right: 0px;
}

Cela fonctionne si le père est plus grand que l'élément enfant, ou a la même taille: https://jsfiddle.net/cy8dn1km/

Mais si l'enfant est plus grand, alors son centre n'est pas positionné au centre de son parent. Au lieu de cela, leurs frontières de gauche seront au même endroit, et l'élément enfant sera étendu uniquement à droit:

Https://jsfiddle.net/797L7nce/

Quelque chose ne va pas avec le centrage horizontal.

Comment est-il possible de le réparer en utilisant uniquement CSS (sans utiliser de transformations CSS 2D / 3D ), sans ajouter de nouveaux éléments de conteneur?

22
demandé sur Billy Mailman 2016-07-12 14:37:33

7 réponses

Voici une solution sans utiliser de transformations CSS 2D / 3D. Vous pouvez utiliser display: flex avec flex-direction: column (c'est - important) sur l'élément parent et display: table sur l'élément enfant.

body,
html {
  width: 100%;
  height: 100%;
  margin: 0;
}
body {
  display: flex;
  align-items: center;
  justify-content: center;
  background: green;
}
.centered.d1 {
  display: flex;
  align-items: center;
  justify-content: center;
  flex-direction: column;
}
.d1 {
  background: yellow;
  width: 50px;
  height: 50px;
}
.d2 {
  background: red;
  opacity: 0.7;
  width: 250px;
  height: 250px;
  display: table;
}
<div class="centered d1">
  <div class="centered d2"></div>
</div>
12
répondu Nenad Vracar 2016-07-12 12:02:49

Ajouter left: 50%; transform: translate(-50%, 0);et supprimer right: 0px;

.centered {
    position: absolute;
    margin: auto;
    display: block;
    bottom: 0px;
    top: 0px;
    left: 50%;
    transform: translate(-50%, 0);
}

Démo

15
répondu Ismail Farooq 2016-07-12 11:44:27

Ok j'ai essayé sans CSS 2D :

Changez absolute en fixed et ajoutez margin: auto;

JSfiddle ici

body, html {
    width: 100%;
    height: 100%;
}

body {
    position: relative;
    background: green;
}

.centered {
    position: fixed;
    margin: auto;
    display: block;
    bottom: 0px;
    left: 0px;
    top: 0px;
    right: 0px;
}

.d1 {
    background: yellow;
    width: 50px;
    height: 50px;
}

.d2 {
    background: red;
    opacity: 0.7;
    width: 250px;
    height: 250px;
}
<div class="centered d1">
    <div class="centered d2">

    </div>
</div>
4
répondu Relisora 2016-07-12 12:14:23

Si vous connaissez les dimensions des éléments, vous pouvez utiliser la position gauche/supérieure à 50% avec des marges négatives de la moitié de la taille de l'élément.

J'ai mis à jour votre violon ici: https://jsfiddle.net/797L7nce/2/

.centered {
    position: absolute;
    display: block;
    left:50%;
    top:50%;

}

.d1 {
    background: yellow;
    width: 50px;
    height: 50px;
    margin-left:-25px;
    margin-top:-25px;
}

.d2 {
    background: red;
    opacity: 0.7;
    width: 250px;
    height: 250px;
    margin-left:-125px;
    margin-top:-125px;
}
3
répondu Variant 2016-07-12 11:43:53

Tu y es presque. Il suffit de définir les positions absolues sur le même nombre négatif (grand), pour faire assez de place pour la marge auto:

.centered {
    position: absolute;
    margin: auto;

    bottom: -9999px;
    left: -9999px;
    top: -9999px;
    right: -9999px;
}

Https://jsfiddle.net/797L7nce/9/

3
répondu Sphinxxx 2016-07-12 15:07:56

Ajouter le CSS ci-dessous à {[1] } résoudra le problème.

.d2 {
    background: red;
    opacity: 0.7;
    width: 250px;
    height: 250px;
    position:absolute;
    left:50%;
    margin-left:-125px;
}

Vous pouvez vérifier la démo ici

2
répondu Kan412 2016-07-12 11:44:38

Dans Bootstrap 4:

À centrez l'enfant horizontalement, utiliser la classe bootstrap-4:

justify-content-center

À centrez l'enfant verticalement, utiliser la classe bootstrap-4:

 align-items-center

Mais n'oubliez pas n'oubliez pas d'utiliser d-flex classe avec ces c'est une classe utilitaire bootstrap-4, comme ceci

<div class="d-flex justify-content-center align-items-center" style="height:100px;">
    <span class="bg-primary">MIDDLE</span>    
</div>

Remarque: assurez-vous d'ajouter bootstrap-4 utilitaires si ce code ne fonctionne pas

Je sais que ce n'est pas le réponse directe à cette question mais cela peut aider quelqu'un

0
répondu 2018-02-02 11:45:25