Comment aligner l'élément absolument positionné au centre?

103

J'essaie d'empiler deux toiles ensemble et d'en faire une toile à double couche.

J'ai vu un exemple ici:

<div style="position: relative;">
 <canvas id="layer1" width="100" height="100" 
   style="position: absolute; left: 0; top: 0; z-index: 0;"></canvas>
 <canvas id="layer2" width="100" height="100" 
   style="position: absolute; left: 0; top: 0; z-index: 1;"></canvas>
</div>

Mais je voudrais aligner les deux toiles au centre de l'écran. Si je règle la valeur de leftcomme constante, pendant que je change l'orientation de l'écran (comme je le fais sur iPad), la toile ne restera pas au milieu de l'écran comme elle agit dans

<div align="center">

Quelqu'un peut-il aider s'il vous plaît?

PaulLing
la source

Réponses:

222

Si vous définissez à la fois gauche et droite sur zéro et les marges gauche et droite sur auto, vous pouvez centrer un élément positionné de manière absolue.

position:absolute;
left:0;
right:0;
margin-left:auto;
margin-right:auto;
Andrew
la source
N'avez-vous pas également besoin de donner une largeur à l'élément?
Gabriel Florit
1
Je ne pense pas que ce soit nécessaire dans ce cas.
Andrew
Je viens d'essayer et cela fonctionne, cela devrait être marqué comme réponse correcte
R Reveley
Vous pouvez utiliser modifier les valeurs gauche ou droite pour déplacer l'objet hors du centre, fixe. L'utilisation left: 80px;déplacera l'objet 40px (!) Vers la droite du centre.
SPRBRN
4
Remarque: ne fonctionne que si l'élément stylisé a une largeur donnée. (soit px ou%)
Johnny Wong
94

Si vous souhaitez centrer un élément sans connaître sa largeur et sa hauteur, procédez comme suit:

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

Exemple:

*{
  margin:0;
  padding:0;
}
section{
  background:red;
  height: 100vh;
  width: 100vw;
}
div{  
  width: 80vw;
  height: 80vh;
  background: white;
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
}
<section>
  <div>
    <h1>Popup</h1>
  </div>
</section>

Vinicius Santana
la source
16

Avez-vous essayé d'utiliser?:

left:50%;
top:50%;
margin-left:-[half the width] /* As pointed out on the comments by Chetan Sastry */

Je ne sais pas si cela fonctionnera, mais cela vaut la peine d'essayer ...

Modification mineure : Ajout de la partie marge gauche, comme indiqué sur les commentaires de Chetan ...

Deleteman
la source
Ya j'ai essayé cela, mais la toile "démarre" à partir du milieu mais pas "placée" au milieu de l'écran. Est-il possible de définir à gauche: 50% et de déplacer à nouveau le canevas vers la gauche?
PaulLing
2
@PaulLingmargin-left: <negative half the width>
Chetan S
Ce que Chetan a dit ... me battre: P Je vais éditer ma réponse pour les générations futures ...
Deleteman
La largeur de l'écran est différente lorsque l'iPad est placé dans une orientation différente
PaulLing
Il voulait dire la moitié de la largeur de votre élément de canevas ..., ce qui le rendrait margin-left: -50px;
Deleteman
13
position: absolute;
top: 0;
left: 0;
bottom: 0;
right: 0;
margin: auto;
Mihai Ciobanu
la source
9

essayez cette méthode, fonctionne bien pour moi

position: absolute;
left: 50%;
transform: translateX(-50%); 
subindas pm
la source
7

Tout ce que tu dois faire est,

assurez-vous que votre DIV parent a la position: relative

et l'élément que vous voulez centrer, définissez-lui une hauteur et une largeur. utilisez le CSS suivant

.layer {
    width: 600px; height: 500px;
    display: block;
    position:absolute;
    top:0;
    left: 0;
    right:0;
    bottom: 0;
    margin:auto;
  }
http://jsbin.com/aXEZUgEJ/1/
ACIER
la source
2
Seule solution qui fonctionne pour moi. Parent est configuré pour flex, flex-grow & overflow. L'enfant était positionné hors du cadre pour les images plus grandes que le parent. Il ne semblait pas être conscient de la largeur du parent. C'est réglé maintenant. Grand merci!
Kai
0

Déplacez le div parent vers le milieu avec

left: 50%;
top: 50%;
margin-left: -50px;

Déplacez le deuxième calque sur l'autre avec

position: relative;
left: -100px;
Spencer
la source