Je rencontre un problème pour centrer un élément dont l'attribut position
est défini sur absolute
. Est-ce que quelqu'un sait pourquoi les images ne sont pas centrées?
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;
}
<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>
position: absolute;
margin-left: auto;
margin-right: auto;
left: 0;
right: 0;
Sans connaître la width
/height
du positionné1 élément, il est toujours possible de l'aligner comme suit:
.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 à noter que CSS Transformest pris en charge par IE9 et les versions ultérieures . (Préfixes du fournisseur omis pour des raisons de brièveté)
L'ajout de top
/ left
de 50%
déplace le bord supérieur/gauche du bord de l'élément au milieu du parent, et translate()
fonction avec la valeur (négative) de -50%
déplace l'élément de la moitié de sa taille. L'élément sera donc placé au milieu.
Cela est dû au fait qu'une valeur de pourcentage des propriétés top
/ left
est relative à la hauteur/largeur de l'élément parent (qui crée un bloc conteneur).
Alors qu’une valeur en pourcentage de translate()
transformation , la fonction est relative à la largeur/hauteur de l’élément lui-même (en fait, il fait référence à la taille de cadre de sélection ) .
Pour un alignement unidirectionnel, utilisez plutôt translateX(-50%)
ou translateY(-50%)
.
1. Un élément avec position
autre que static
. C'est à dire. relative
, absolute
, fixed
valeurs.
Centrer quelque chose absolute
ly positionné est plutôt compliqué en CSS.
ul#slideshow li {
position: absolute;
left:50%;
margin-left:-20px;
}
Remplacez margin-left
par (négatif) la moitié de la largeur de l’élément que vous essayez de centrer.
centre aligné verticalement et horizontalement
top: 0;
bottom: 0;
margin: auto;
position: absolute;
left: 0;
right: 0;
Remarque: la largeur et la hauteur des éléments doivent être définies
Un truc simple en CSS, ajoutez simplement:
width: 100%;
text-align: center;
Cela fonctionne à la fois sur les images et le texte.
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 souhaitez que le 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, indépendamment du fait 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 au 15 décembre 2015
Eh bien, j'ai appris cela un autre nouveau tour il y a quelques mois. En supposant que vous ayez 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 cela, je pense que c'est une meilleure réponse que mon ancienne solution. Puisque vous n'avez pas à spécifier largeur ET hauteur. Celui-ci adapte le contenu de l'élément lui-même.
Cela a fonctionné pour moi:
position: absolute;
left: 50%;
transform: translateX(-50%);
pour centrer une position: attribut absolu, vous devez définir à gauche: 50% et marge à gauche: -50% de la largeur de la 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 le centre vertical absolu vous devez faire la même chose bourgeon pas à gauche juste en haut. (REMARQUE: le html et le corps doivent avoir une hauteur minimale 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>
Centrer un élément "position: absolu".
.your-element {
position: absolute;
left: 0;
right: 0;
text-align: center; // or this -> margin: 0 auto;
}
<div class="centered_content"> content </div>
<style type="text/css">
.centered_content {
text-align: center;
position: absolute;
left: 0;
right: 0;
}
</style>
voir la 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;
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 balise img dans une balise qui a la position sportive: propriété relative, comme suit:
<div style="width:256px; height: 256px; position:relative;">
<img src="photo.jpg"/>
</div>
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/
probablement le plus court
position:absolute;
left:0;right:0;top:0;bottom:0;
margin:0 auto;
Je ne suis pas sûr de ce que vous voulez accomplir, mais dans ce cas, il ne suffit que d'ajouter width: 100%;
à votre ul#slideshow li
.
Les balises img
sont des éléments de bloc en ligne. Cela signifie qu’ils s’écoulent en ligne comme du texte, mais qu’ils ont une largeur et une hauteur similaires à celles des éléments de bloc. Dans votre css, il y a deux règles text-align: center;
appliquées au <body>
et au #slideshowWrapper
(ce qui est redondant d'ailleurs). Ainsi, tous les éléments enfants inline et inline-block sont centrés sur leurs éléments les plus proches. éléments de bloc, dans votre code, il s’agit de balises li
. Tous les éléments de bloc ont width: 100%
s'il s'agit du flux statique (position: static;
), qui est la valeur par défaut. Le problème est que, lorsque vous indiquez que les balises li
sont position: absolute;
, vous les sortez du flux statique normal, ce qui les oblige à réduire leur taille pour s’adapter simplement à leur contenu intérieur. de "perdre" leur propriété width: 100%
.
Utiliser left: calc(50% - Wpx/2);
où W est la largeur de l'élément fonctionne pour moi.
Vos images ne sont pas centrées car vos éléments de liste ne sont pas centrés; seul leur texte est centré. Vous pouvez obtenir le positionnement souhaité en centrant la liste entière ou en centrant les images dans la liste.
Une version révisée de votre code se trouve en bas. Dans ma révision, je centre à la fois la liste et les images qu’elle contient.
La vérité est que vous ne pouvez pas centrer un élément dont la position est définie sur absolue.
Remarque: Ces instructions fonctionneront avec tout élément de bloc DOM, pas seulement img.
Entourez votre image avec 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éciaux.
Modifiez votre css ou scss pour donner à la div le positionnement absolu 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;
}
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 que cela a été utile. Bonne chance!
Un objet absolu à l'intérieur d'un objet relatif est relatif à son parent. Le problème est que vous avez besoin d'une largeur statique pour le conteneur #slideshowWrapper
et que le reste de la solution ressemble à ce que disent les autres utilisateurs.
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;
}
Voici la solution la plus simple et la meilleure pour les éléments centraux 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>
#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 haut, droite, bas et gauche. Pour moi, cette technique est la meilleure, dans la plupart des situations.
Lorsque j'utilise la combinaison ci-dessus, l'image se comporte comme une image d'arrière-plan avec les paramètres suivants:
background-position: 50% 50%;
background-repeat: no-repeat;
background-size: cover;
Plus de détails sur le premier exemple peuvent être trouvés ici:
Conserver les proportions d'un div avec CSS
Position absolute le sort du flux et le place à 0x0 dans le parent (dernier élément de bloc ayant une position absolue ou une position relative).
Je ne sais pas exactement ce que vous essayez d'accomplir. Il serait peut-être préférable de définir le li sur un position:relative
et que cela les centre. Compte tenu de votre CSS actuel
Découvrez http://jsfiddle.net/rtgibbons/ejRTU/ pour jouer avec
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>
Utilisez margin-left: x%;
où x est la moitié de la largeur de l'élément.
Ce qui semble se passer, c'est qu'il y a deux solutions. centré à l'aide des marges et centré à l'aide de la position. Les deux fonctionnent correctement, mais si vous souhaitez positionner de manière absolue un élément par rapport à cet élément centré, vous devez utiliser la méthode de la position absolue, car la position absolue du deuxième élément est définie par défaut sur le premier parent positionné. Ainsi:
<!-- 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 cette publication, en utilisant la technique automatique marge: 0, pour créer un menu à gauche de mon contenu, je devais créer une colonne de même largeur à droite pour l'équilibrer. Pas beau. Merci!