Comment centrer un élément" position: absolute"

j'ai un problème avec un élément dont l'attribut position est défini à absolute . Personne ne sait pourquoi les images ne sont pas centré?

css lang-css prettyprint-override">body {
  text-align: center;
}

#slideshowWrapper {
  margin-top: 50px;
  text-align: center;
}

ul#slideshow {
  list-style: none;
  position: relative;
  margin: auto;
}

ul#slideshow li {
  position: absolute;
}

ul#slideshow li img {
  border: 1px solid #ccc;
  padding: 4px;
  height: 450px;
}
html lang-html prettyprint-override"><body>
  <div id="slideshowWrapper">
    <ul id="slideshow">
      <li><img src="img/dummy1.JPG" alt="Dummy 1" /></li>
      <li><img src="img/piano_unlicened.JPG" alt="Dummy 2" /></li>
    </ul>
  </div>
</body>
509
demandé sur Chris Happy 2011-12-14 20:47:14

23 réponses

position: absolute;
margin-left: auto;
margin-right: auto;
left: 0;
right: 0;
925
répondu baaroz 2013-08-28 12:18:07

sans connaître le width / height de l'élément positionné 1 , il est encore possible de l'aligner comme suit:

EXEMPLE ICI

.child {
    position: absolute;
    top: 50%;  /* position the top  edge of the element at the middle of the parent */
    left: 50%; /* position the left edge of the element at the middle of the parent */

    transform: translate(-50%, -50%); /* This is a shorthand of
                                         translateX(-50%) and translateY(-50%) */
}

Il est intéressant de noter que CSS Transform est pris en charge dans IE9 et au-dessus de . (préfixes de Vendeur omis par souci de brièveté)


explication

ajouter top / left de 50% déplace le bord supérieur/gauche de l'élément au milieu du parent, et translate() fonction avec le (négatif) valeur de -50% déplace l'élément par la moitié de sa taille. D'où l'élément sera placé à l' milieu.

cela est dû au fait qu'une valeur en pourcentage sur top / left les propriétés sont relatives à la hauteur/largeur de l'élément parent (qui crée un bloc contenant).

alors qu'une valeur en pourcentage sur translate() transform fonction est relative à la largeur / hauteur de l'élément lui-même (en fait, il se réfère à la taille de zone de délimitation ) .

pour l'alignement unidirectionnel, allez avec translateX(-50%) ou translateY(-50%) à la place.


1. Un élément avec un position autre que static . I. e. relative , absolute , fixed valeurs.

425
répondu Hashem Qolami 2014-09-10 22:48:13

Centrage quelque chose absolute ly positionné, c'est plutôt compliqué dans le CSS.

ul#slideshow li {
    position: absolute;
    left:50%;
    margin-left:-20px;

}

changez margin-left en (négatif) la moitié de la largeur de l'élément que vous essayez de centrer.

164
répondu bookcasey 2017-12-13 20:55:47

Div verticalement et horizontalement aligné centre

top: 0;
bottom: 0;
margin: auto;
position: absolute;
left: 0;
right: 0;

Note : les éléments doivent avoir une largeur et une hauteur à régler

72
répondu Sebin Simon 2015-12-09 04:24:30

un simple truc CSS, Il suffit d'ajouter:

width: 100%;
text-align: center;

cela fonctionne à la fois sur les images et le texte.

45
répondu cutez7boyz 2012-10-29 16:28:50

si vous voulez centrer un élément absolu

#div {
    position:absolute;
    top:0;
    bottom:0;
    left:0;
    right:0;
    width:300px; /* Assign a value */
    height:500px; /* Assign a value */
    margin:auto;
}

si vous voulez qu'un conteneur soit centré de gauche à droite, mais pas de haut en bas

#div {
    position:absolute;
    left:0;
    right:0;
    width:300px; /* Assign a value */
    height:500px; /* Assign a value */
    margin:auto;
}

si vous voulez qu'un conteneur soit centré de haut en bas, sans se soucier d'être de gauche à droite

#div {
    position:absolute;
    top:0;
    bottom:0;
    width:300px; /* Assign a value */
    height:500px; /* Assign a value */
    margin:auto;
}

mise à jour en date du 15 décembre 2015

J'ai appris cette nouvelle astuce il y a quelques mois. Supposer que vous avez un élément parent relatif.

Voici votre élément absolu.

.absolute-element { 
    position:absolute; 
    top:50%; 
    left:50%; 
    transform:translate(-50%, -50%); 
    width:50%; /* You can specify ANY width values here */ 
}

avec ceci, je pense que c'est une meilleure réponse que mon ancienne solution. Puisque vous n'avez pas à spécifier la largeur et la hauteur. Celle-ci, elle adapte le contenu de l'élément lui-même.

40
répondu Wesley Brian Lachenal 2017-12-13 20:33:18

pour centrer une position:attribut absolu vous devez mettre à gauche:50% et marge-gauche: -50% de la largeur du div.

<!-- for horizontal -->
<style>
div.center{
 width:200px;
 left:50%;
 margin-left:-100px;
 position:absolute;
}
</style>


<body>
 <div class='center'>
  should be centered horizontaly
 </div>
</body>

pour vertical center absolute vous devez faire la même chose bud pas avec gauche juste avec le haut. ( NOTE: le html et le corps doit avoir min-hauteur de 100%; )

<!-- for vertical -->
<style>
 body,html{
  min-height:100%;
 }
 div.center{
  height:200px;
  top:50%;
  margin-top:-100px;
  position:absolute;
 }
</style>

<body>
 <div class='center'>
  should be centered verticaly
 </div>
</body>

et peut être combiné pour les deux

   <!-- for both -->
 <style>
 body,html{
  min-height:100%;
 }
 div.center{
  width:200px;
  height:50px
  left:50%;
  top:50%;
  margin-left:-100px;
  margin-top:-25px;
  position:absolute;
 }
</style>


<body>
 <div class='center'>
  should be centered
 </div>
</body>
24
répondu Rednas 2011-12-14 17:02:02

cela a fonctionné pour moi:

position: absolute;
left: 50%;
transform: translateX(-50%);
22
répondu Deplake 2017-09-06 14:53:03
    <div class="centered_content"> content </div>
    <style type="text/css">
    .centered_content {
       text-align: center;
       position: absolute;
       left: 0;
       right: 0;
    }
    </style>

voir démo sur: http://jsfiddle.net/MohammadDayeh/HrZLC/

text-align: center ; fonctionne avec un élément position: absolute lors de l'ajout de left: 0; right: 0;

16
répondu Mohammad Dayeh 2016-08-17 14:45:13

le plus simple, le meilleur:

img {
            top: 0;
            bottom: 0;
            left: 0;
            right: 0;
            margin: auto auto;
            position: absolute;
}

ensuite, vous devez insérer votre étiquette img dans une étiquette que la position du sport: propriété relative, comme suit:

<div style="width:256px; height: 256px; position:relative;">
      <img src="photo.jpg"/>
</div>
14
répondu Stéphane de Luca 2017-05-21 12:54:07

Si vous ne connaissez pas la largeur de l'élément, vous pouvez utiliser ce code:

<body>
<div style="position: absolute; left: 50%;">
    <div style="position: relative; left: -50%; border: dotted red 1px;">
        I am some centered shrink-to-fit content! <br />
        tum te tum
    </div>
</div>

Démo au violon: http://jsfiddle.net/wrh7a21r /

Source: https://stackoverflow.com/a/1777282/1136132

7
répondu joseantgv 2017-05-23 10:31:39

enter image description here

Je ne suis pas sûr de ce que vous voulez accomplir, mais dans ce cas, ajouter width: 100%; à votre ul#slideshow li fera l'affaire.

explication

les étiquettes img sont des éléments inline-block. Cela signifie qu'ils coulent en ligne comme du texte, mais ont aussi une largeur et une hauteur comme des éléments de bloc. Dans votre css Il y a deux règles text-align: center; appliquées au <body> et au #slideshowWrapper (qui est redondant btw) Cela fait que tous les éléments enfants en ligne et en ligne-bloc sont centrés dans leurs éléments de bloc les plus proches, dans votre code ce sont des étiquettes li . Tous les éléments de Bloc ont width: 100% s'ils sont le flux statique ( position: static; ), qui est par défaut. Le problème est que quand vous dites li tags pour être position: absolute; , vous les sortez du flux statique normal, et cela les amène à rétrécir leur taille pour juste s'adapter à leur intérieur contenu, en d'autres termes, ils sorte de "perdre" leur width: 100% propriété.

5
répondu Konstantin Kalbazov 2016-01-25 19:41:19

à l'Aide de left: calc(50% - Wpx/2); où W est la largeur de l'élément fonctionne pour moi.

5
répondu Julix 2017-01-09 06:59:02

pour centrer un élément" position: absolu".

ajouter ces

left: 0%;
right: 0%;
text-align: center;

ou ces

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

élément : position absolue

.element {
  position: absolute;
}

élément centré

.element {
  position: absolute;
  left: 0%;
  right: 0%;
  text-align: center; // or this ->  margin: 0 auto;
}
4
répondu Vadamadafaka 2018-04-09 10:05:08

un objet absolu à l'intérieur d'un objet relatif est relatif à son parent, le problème ici est que vous avez besoin d'une largeur statique pour le conteneur #slideshowWrapper , et le reste de la solution est comme les autres utilisateurs dit

body {
    text-align: center;
}

#slideshowWrapper {
    margin-top: 50px;
    text-align:center;
    width: 500px;
}

ul#slideshow {
    list-style: none;
    position: relative;
    margin: auto;
}

ul#slideshow li {
    position: relative;
    left: 50%;
}

ul#slideshow li img {
    border: 1px solid #ccc;
    padding: 4px;
    height: 450px;
}

http://jsfiddle.net/ejRTU/10 /

3
répondu eveevans 2011-12-14 17:41:50

Voici la solution facile et la meilleure pour l'élément central avec" position: absolute "

 body,html{
  min-height:100%;
 }
 
 div.center{
 width:200px;
 left:50%;
 margin-left:-100px;/*this is 50% value for width of the element*/
 position:absolute;
 background:#ddd;
 border:1px solid #999;
 height:100px;
 text-align:center
 }
 
 
<style>

</style>

<body>
 <div class='center'>
  should be centered verticaly
 </div>
</body>
3
répondu SantoshK 2017-03-29 09:32:20

vos images ne sont pas centrées parce que les éléments de votre liste ne sont pas centrés; seul leur texte est centré. Vous pouvez obtenir le positionnement que vous voulez en centrant la liste entière ou en centrant les images dans la liste.

une version révisée de votre code se trouve au bas. Dans ma révision, Je centre à la fois la liste et les images qu'elle contient.

la vérité c'est toi ne peut pas centrer un élément dont la position est fixée à l'absolu.

Mais ce comportement peut être imité!

Note: Ces instructions fonctionneront avec n'importe quel élément de bloc DOM, pas seulement img.

  1. entourez votre image d'une balise div ou autre (dans votre cas un li).

    <div class="absolute-div">
      <img alt="my-image" src="#">
    </div>
    

    Note: les noms donnés à ces éléments ne sont pas spéciales.

  2. modifiez votre css ou scss pour donner le positionnement absolu div et votre image centrée.

    .absolute-div {
      position: absolute;
    
      width: 100%; 
      // Range to be centered over. 
    
      // If this element's parent is the body then 100% = the window's width
    
      // Note: You can apply additional top/bottom and left/right attributes
      // i.e. - top: 200px; left: 200px;
    
      // Test for desired positioning.
    }
    
    .absolute-div img {
      width: 500px;
      // Note: Setting a width is crucial for margin: auto to work.
    
      margin: 0 auto;
    }
    

et voilà! Votre img doit être centré!

votre code:

Essayez ceci:

body
{
  text-align : center;
}

#slideshow
{
  list-style : none;
  width      : 800px;
  // alter to taste

  margin     : 50px auto 0;
}

#slideshow li
{
  position : absolute;
}

#slideshow img
{
  border  : 1px solid #CCC;
  padding : 4px;
  height  : 500px;
  width   : auto;
  // This sets the width relative to your set height.

  // Setting a width is required for the margin auto attribute below. 

  margin  : 0 auto;
}
<ul id="slideshow">
    <li><img src="http://lorempixel.com/500/500/nature/" alt="Dummy 1" /></li>
    <li><img src="http://lorempixel.com/500/500/nature/" alt="Dummy 2" /></li>
</ul>

j'espère cela a été utile. Bonne chance!

3
répondu D3RPZ1LLA 2017-12-13 20:54:10

position absolute le sort du flux, et le place à 0x0 au parent ( dernier élément de bloc pour avoir une position absolue ou relative ).

Je ne suis pas sûr de savoir exactement ce que vous essayez d'accomplir, il pourrait être préférable de mettre le li à un position:relative et cela les centrera. Compte tenu de votre CSS actuel

Check out http://jsfiddle.net/rtgibbons/ejRTU/ jouer avec

1
répondu Ryan Gibbons 2011-12-14 16:59:55
#parent
{
    position : relative;
    height: 0;
    overflow: hidden;
    padding-bottom: 56.25% /* images with aspect ratio: 16:9  */
}

img 
{
    height: auto!important;
    width: auto!important;
    min-height: 100%;
    min-width: 100%;
    position: absolute;
    display: block;
    /*  */
    top: -9999px;
    bottom: -9999px;
    left: -9999px;
    right: -9999px;
    margin: auto;
}

Je ne me souviens pas où j'ai vu la méthode de centrage indiquée ci-dessus, en utilisant des valeurs négatives top, right, bottom, left. Pour moi, ce tehnique est le meilleur, dans la plupart des situations.

lorsque j'utilise la combinaison ci-dessus, l'image se comporte comme une image de fond avec les paramètres suivants:

background-position: 50% 50%;
background-repeat: no-repeat;
background-size: cover;

pour plus de détails sur le premier exemple, cliquez ici.:

maintenir le rapport d'aspect de un div avec CSS

1
répondu Marian07 2017-12-13 20:43:47

vous pouvez essayer de cette façon:

* { margin: 0px; padding: 0px; }
#body { height: 100vh; width: 100vw; position: relative; 
        text-align: center; 
        background-image: url('https://s-media-cache-ak0.pinimg.com/originals/96/2d/ff/962dff2247ad680c542622e20f44a645.jpg'); 
         background-size: cover; background-repeat: no-repeat; }
.text { position: absolute; top: 0; bottom: 0; left: 0; right: 0; height:100px; 
        display: inline-block; margin: auto; z-index: 999999; }
<html>
<body>
	<div id="body" class="container-fluid">
	  <!--Background-->
	    <!--Text-->
		  <div class="text">
		    <p>Random</p>
		  </div>	  
	</div>
</body>
</html>
1
répondu Chirag Dave 2018-02-25 12:58:19

ce qui semble se produire, c'est qu'il y a deux solutions: centrées en utilisant les marges et centrées en utilisant la position. Les deux fonctionnent bien, mais si vous voulez positionner un élément par rapport à cet élément centré, vous devez utiliser la méthode de la position absolue, parce que la position absolue du deuxième élément est par défaut au premier parent qui est positionné. Comme ceci:

<!-- CENTERED USING MARGIN -->
<div style="width:300px; height:100px; border: 1px solid #000; margin:20px auto; text- align:center;">
    <p style="line-height:4;">width: 300 px; margin: 0 auto</p>
    <div style="position:absolute; width:100px; height:100px; background-color:#ff0000; top:-20px; left:0px;">
        <p style="line-height:4;">Absolute</p>
    </div>
</div>

<!-- CENTERED USING POSITION -->
<div style="position:absolute; left:50%; width:300px; height:100px; border: 1px solid #000; margin:20px 0 20px -150px; text-align:center;">
    <p style="line-height:2;">width:300px; position: absolute; left: 50%; margin-left:-150px;</p>
    <div style="position:absolute; width:100px; height:100px; background-color:#ff0000; top:0px; left:-105px;">
        <p style="line-height:4;">Absolute</p>
    </div>
</div>

Jusqu'à ce que je lise ce message, en utilisant la technique de marge:0 auto, pour construire un menu à la gauche de mon contenu, j'ai dû construire une même largeur de colonne vers la droite pour l'équilibrer. Pas assez. Merci!

0
répondu Deane Nettles 2014-08-23 23:34:29

Utiliser margin-left: x%; où x est la moitié de la largeur de l'élément.

0
répondu Bibaswann Bandyopadhyay 2016-01-09 21:54:36

html, body, ul, li, img {
  box-sizing: border-box;
  margin: 0px;  
  padding: 0px;  
}

#slideshowWrapper {
  width: 25rem;
  height: auto;
  position: relative;
  
  margin-top: 50px;
  border: 3px solid black;
}

ul {
  list-style: none;
  border: 3px solid blue;  
}

li {
  /* center horizontal */
  position: relative;
  left: 0;
  top: 50%;
  width: 100%;
  text-align: center;
  font-size: 18px;
  /* center horizontal */
  
  border: 3px solid red; 
}

img {
  border: 1px solid #ccc;
  padding: 4px;
  //width: 200px;
  height: 100px;
}
<body>
  <div id="slideshowWrapper">
    <ul id="slideshow">
      <li><img src="http://via.placeholder.com/350x150" alt="Dummy 1" /></li>
      <li><img src="http://via.placeholder.com/140x100" alt="Dummy 2" /></li>
      <li><img src="http://via.placeholder.com/200x100" alt="Dummy 3" /></li>      
    </ul>
  </div>
</body>
-1
répondu antelove 2017-09-27 08:55:55