2010-03-30 17 views
5

Kann die DIV-Position von absolut zu relativ (und von relativ zu absolut) geändert werden? DIV sollte am selben Ort bleiben.Absolutposition in Relativ konvertieren

+1

Fragen Sie "Wird es am selben Ort bleiben?". Wenn ja, ja, wird es, aber als relativ, wird es im Dokumentenfluss sein, absolut, es wird nicht. – Zoidberg

+0

Ich habe absolut Elemente positioniert, die relativiert werden sollen.Das Problem ist, dass ich die relative rechte Position (oben, links) nicht berechnen kann, so dass die Elemente an ihren Plätzen bleiben. – John

Antwort

5

können Sie dieses Attribut ändern mit

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

Zum Beispiel:
Sie Methoden jQuery verwenden könnten .position() oder .offset() „top“ zu setzen und „links“ CSS-Attribut als gut, auf diese Weise soll Ihr Objekt bleiben an seiner Position ändert sich von relativ -> absolut.

Ich glaube nicht, dass das umgekehrt funktioniert.

Demo-Code: offsetleft und offsetTop Werte wie links und oben Stile http://jsbin.com/uvoka

+0

$ (Objekt) .css ({Position: 'absolut', oben: dy, links: dx}); clone.css ({Position: 'relativ'}); funktioniert nicht - Element Position nach dem Wechsel zu relativ, Position ist anders aber wenn ich Offset gespeichert und neu eingestellt nach dem Wechsel auf relativ, ist die Position gleich $ (Objekt) .css ({Position: 'absolute', top : dy, links: dx}); var x = clone.offset() .links; var y = clone.offset(). Top; clone.css ({Position: 'relativ'}); Offset ({oben: y, links: x}); – John

+0

kurzes Beispiel possibilitys: http://jsbin.com/uvoka Mit freundlichen Grüßen, --Andy – jAndy

+0

Die "Lösung" vorgeschlagen wird NICHTS Umwandlung !!! –

0

Sie können ganz leicht aus relativ durch es ist mit dem absoluten ändern.

Andersherum ist härter. Sie müssten es im Grunde auf relativ ändern und sehen, wo es gelandet ist, und dann neue Offset-Werte aus dem aktuellen Offset und der gewünschten Position berechnen.

Beachten Sie, dass das Element, wenn die Positionierung relativ ist, Teil des Seitenflusses ist und andere Elemente beeinflussen kann. Wenn die Position absolut ist, befindet sich das Element außerhalb des Seitenflusses und beeinflusst andere Elemente nicht. Wenn Sie also zwischen absoluter und relativer Positionierung wechseln, müssen Sie möglicherweise Änderungen an anderen Elementen vornehmen, auch wenn Sie sie nicht verschieben möchten.

8

Da in den Kommentaren der Formatierung I-Lösung hier

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

Funktioniert nicht veröffentlichen wird nicht funktionieren: ist Element Position relativ nach dem Wechsel anders.

Aber wenn ich Offset gespeichert und setzen Sie ihn wieder nach der relativen Änderung Position ist das gleiche:

$(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

Thx für das Teilen. hat mir wirklich geholfen. –

+0

ändert sich dieser Code von absolut zu relativ? – Varun

1

prototype.js hat element.absolutize() und element.relativize, die sehr gut funktionieren.

Das Problem von relativ zum absoluten geht, ist, dass element.offsetTop und offsetleft

nur der Offset des Elements zu seinem übergeordneten geben. Sie müssen die cumualtive messen Offset (dh

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

Ich habe mich immer gefragt, was diese Methode eigentlich macht? Wird es ein Nicht-Körper-Kind-Element dazu bringen, seine Position beizubehalten, während es an den Körper des Dokuments angehängt wird? Oder "absolutiert" es einfach ein Element relativ zu seinem Elternteil? Wenn es das letztere ist, dann werde ich die Lösung, über Ihrem verwenden. Danke –

2

Wenn Sie wirklich die gesamte Oberseite eines Elements versetzt zu bekommen, dass ein Kind von Elementen mit absoluten und relativen Positionen könnten Sie Verwenden Sie diese Funktion

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

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

Dies ist im Grunde der Code für die oben genannte Lösung von plodder.

+0

Dies ist perfekt für Elemente in einem Nicht-Körper Elternteil, die genau das ist, was ich benötige. Vielen Dank. Ich benutze eigentlich das prototype.js Framework, also habe ich mich gefragt, ob 'absolutize()' das gleiche tut, wie unten erwähnt, aber ich habe das Gefühl, dass es nur ein Element 'absolut' macht, relativ zu seinem Elternteil und nicht dem Dokumentkörper.So werde ich Ihre Lösung verwenden ... –