Faire un centre div de la fenêtre-horizontalement et verticalement

J'ai un conteneur <div id="wrapper"> dans lequel tout le contenu de mon site sera présent. J'ai essayé de faire le centre div verticalement et horizontalement en utilisant la propriété css comme margin:0 auto; on #wrapper.

#wrapper
{
 width:500px;
 height:500px;
 margin:0 auto;
 background:#f7f7f7;
}

En utilisant le css ci-dessus, je peux faire la div en (centre supérieur) de l'écran mais comment le centrer(verticalement). lorsque je fais un zoom arrière dans firefox, mon div va effectuer un zoom arrière dans le centre supérieur, mais ce que je veux, il devrait être toujours présent au centre de l'écran à la fois verticalement et horizontalement.

Peut tout on me suggère comment puis-je obtenir la mise en page comme ça.

Merci d'avance.

24
demandé sur stecb 2012-03-08 21:52:53

6 réponses

#wrapper
{
 width:500px;
 height:500px;
 margin:0 auto;
 background:#f7f7f7;
 position:absolute;
 left:50%;
 top:50%;
 margin-left:-250px;
 margin-top:-250px;
}

Démo: http://jsfiddle.net/fJtNQ/

Pourquoi ça marche?

Eh bien, fondamentalement, vous avez un élément positionné absolu à l'intérieur du dom. Cela signifie que vous pouvez le positionner où vous voulez et si vous n'avez pas d'élément positionné par rapport en tant que parent, left et top seront la distance par rapport à l'origine gauche/supérieure du document.

L'affectation de left:50% et top:50% permet de positionner cet élément toujours au centre de l'écran, mais dans centre, vous trouverez le coin supérieur gauche de l'élément.

Si vous avez une largeur/hauteur fixe, vous pouvez facilement "traduire" le point au centre pour être en fait le centre de la div wrapper en donnant négatif margin-left et margin-top (donc avec l'aide de quelques mathématiques de base extrêmement faciles leurs valeurs seront -(width/2) et -(height/2))

Modifier

Vous pouvez également facilement centrer en utilisant flexbox, plus (un gros) vous n'avez pas besoin de spécifier w / h, c'est-à-dire:

body { /* can also be whatever container */
  display: -webkit-flex;
  display: flex;
  -webkit-align-items: center;
  align-items: center;
  -webkit-justify-content: center;
  justify-content: center;
}

#wrapper {
  /* whatever style u want */
}

Démo: https://jsfiddle.net/00utf52o/

39
répondu stecb 2015-12-29 10:11:56

Voici une solution pour ceux qui ont besoin de centrer une div enfant par rapport à la fenêtre d'affichage et non "relative à la div parent". D'autres solutions mentionnées ici ne fonctionnent pas dans ce cas car elles ont tendance à rendre le centre div enfant par rapport au div parent.

<div id="container">
  <div id="wrapper">Always center, No matter the parent div's position</div>
</div>

#wrapper {
 width:300px;
 height:300px;
 margin:0 auto;
 background:green;
 position:fixed;
 left:50%;
 top:50%;
 margin-left:-150px;
 margin-top:-150px;
}

#container {
  display: block;
  position: absolute;
  width: 400px;
  height: 400px;
  border: 1px solid red;
  bottom: 0;
  left: 0;
}

Démo ici http://jsbin.com/yeboleli/2/edit?css,sortie

13
répondu rkrara 2014-08-04 06:54:56

La réponse de @ stecb fonctionne bien si vous travaillez avec une largeur/hauteur fixe.

Pour positionner un div ou une image verticalement au centre de toutes les fenêtres et la rendre réactive, utilisez ceci:

#elem-to-center {
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
}

Je viens de remplacer margin-left et margin-top avec transformer.

Si vous voulez une marge entourant l'élément, utilisez ceci:

#outer-elem {
    width: 100%;
    height: 100%;
    padding: 30px;
    background: #fafafa;
    position: relative;
}
#elem-to-center {
    width: calc(100% - 60px);
    max-height: calc(100% - 60px);

    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
}

JSFiddle | Source

J'ai trouvé cela utile même dans les vues réactives.

12
répondu musafar006 2015-12-04 10:00:29

J'utilise jQuery

$(window).resize(function(){

    $('.className').css({
        position:'absolute',
        left: ($(window).width() - $('.className').outerWidth())/2,
        top: ($(window).height() - $('.className').outerHeight())/2
    });

});

// To initially run the function:
$(window).resize();
5
répondu Hupperware 2012-03-08 17:56:07

Envisagez d'utiliser display: table couplé avec display: table-cell; vertical-align: middle sur un élément séparé. Parce que CSS n'a pas de signification sémantique, c'est une solution acceptable.

J'ai travaillé un exemple pour vous: http://dabblet.com/gist/2002681

Le seul inconvénient est que cela nécessite un peu plus de balisage que d'autres solutions, mais il se contracte et se développe avec le contenu.

0
répondu chicagoing 2012-03-08 19:29:07

La façon la plus simple et la plus propre de le faire serait de définir la hauteur, la marge (et la largeur, si vous le souhaitez) en utilisant des tailles de fenêtre.
Disons que vous voulez que le height de votre conteneur occupe 60% (60vh) de l'écran, vous pouvez diviser le reste (40vh, puisque la hauteur totale de la fenêtre = 100vh) également entre la marge supérieure et la marge inférieure de sorte que l'élément s'aligne automatiquement au centre.
Définir les margin-left et margin-right sur auto, permet de s'assurer que le conteneur est centré horizontalement.

.container {
         width: 60vw; /*optional*/
         height: 60vh;
         margin: 20vh auto;
         background: #333;
 }
<div class="container">
</div>
0
répondu Rocks 2018-02-24 08:55:57