2010-03-30 31 views
5

Est-il possible de changer la position DIV de l'absolu au relatif (et de relatif à l'absolu)? DIV devrait rester au même endroit.Convertir la position absolue en relative

+1

Demandez-vous "Restera-t-il au même endroit?". Si oui, oui, mais en tant que relatif, il sera dans le flux de documents, absolu, il ne sera pas. – Zoidberg

+0

J'ai des éléments absolument positionnés qui devraient être convertis en relatif.Le problème est que je ne peux pas calculer la bonne position relative (haut, gauche), donc les éléments seront conservés à leur place. – John

Répondre

5

vous pouvez modifier cet attribut avec

$(object).css({position: 'absolute'}); 

Par exemple:
Vous pouvez utiliser les méthodes de jQuery .position() ou .offset() pour définir « top » et « gauche » attribut css aswell, cette façon, votre objet doit rester à sa position changeant de relative -> absolue.

Je ne pense pas que cela fonctionne vice versa.

Code de démonstration: http://jsbin.com/uvoka

+0

$ (objet) .css ({position: 'absolute', en haut: dy, left: dx}); clone.css ({position: 'relative'}); ne fonctionne pas - position de l'élément après le changement de parenté, la position est différente mais quand j'ai stocké offset et le définir à nouveau après le passage à relatif, la position est la même $ (objet) .css ({position: 'absolute', top : dy, à gauche: dx}); var x = clone.offset(). À gauche; var y = clone.offset(). Top; clone.css ({position: 'relative'}); offset ({top: y, gauche: x}); – John

+0

exemple rapide de possibilitys: http://jsbin.com/uvoka Cordialement, --Andy – jAndy

+0

La suggéré "solution" n'est pas quoi que ce soit !!! conversion –

0

Vous pouvez changer assez facilement de par rapport à absolu en utilisant ses valeurs et offsetLeft offsetTop que les styles gauche et en haut.

L'inverse est plus difficile. Vous devriez essentiellement le changer en relatif et voir où il a fini, puis calculer de nouvelles valeurs de décalage à partir du décalage actuel et l'emplacement désiré.

Notez que lorsque le positionnement est relatif, l'élément fait partie du flux de la page et peut affecter d'autres éléments. Lorsque la position est absolue, l'élément est en dehors du flux de la page et n'affecte pas les autres éléments. Donc, si vous changez de positionnement absolu et relatif, vous devrez peut-être faire des changements à d'autres éléments si vous ne voulez pas qu'ils bougent.

8

Parce que le formatage dans les commentaires est pas un travail que je publierai ici solution

$(object).css({position: 'absolute',top: dy, left:dx}); 
// dy, dx - some coordinates 
$(object).css({position: 'relative'}); 

ne fonctionne pas: position de l'élément après le changement de rapport est différent.

Mais quand j'emmagasinés offset et mis à nouveau après avoir changé par rapport, la position est la même:

$(object).css({position: 'absolute',top: dy, left:dx}); 
var x = $(object).offset().left; 
var y = $(object).offset().top; 
$(object).css({position: 'relative'}); 
$(object).offset({ top: y, left: x }); 
+0

Merci d'avoir partagé cela. m'a vraiment aidé. –

+0

ce code passe-t-il de l'absolu au relatif ?? – Varun

1

prototype.js a element.absolutize() et qui element.relativize très bien.

Le problème va de par rapport à absolu est que element.offsetTop et offsetLeft

ne donnent que le décalage de votre élément à son parent. Vous devez mesurer la cumualtive offset (c.-à-

the offset of your element to its parent + 
the offset of the parent to its parent + 
the offset of its parent to its parent + 

etc.)

+0

Je me suis toujours demandé ce que cette méthode fait réellement? Cela va-t-il permettre à un élément enfant non 'body' de conserver sa position, tout en l'ajoutant au corps du document? Ou est-ce simplement «absolutiser» un élément par rapport à son parent? Si c'est le dernier, alors je vais utiliser la solution, au-dessus de la vôtre. Merci –

2

Si vous voulez vraiment obtenir le haut décalage total d'un élément qui est un enfant d'éléments avec des positions absolues et relatives que vous pourriez utiliser cette fonction

function calcTotalOffsetTop(elm) 
{ 
var totalOffsetTop = 0, 
curr   = elm; 

while(curr.parent().is(':not(body)')) 
{ 
    curr   = curr.parent(); 
    totalOffsetTop += curr[0].offsetTop; 
} 
return totalOffsetTop; 
} 

c'est fondamentalement le code de la solution donnée par la machine ci-dessus.

+0

Ceci est parfait pour les éléments à l'intérieur d'un parent non corps, ce qui est exactement ce dont j'ai besoin. Merci. En fait, j'utilise le framework prototype.js, donc je me demandais si 'absolutize()' fait la même chose, comme mentionné ci-dessous, mais j'ai le sentiment qu'il ne fait qu'un élément 'absolu', par rapport à son parent et non Donc, je vais utiliser votre solution ... –