How to reposition a relative DIV using left/top?
...it will relatively set the left to its parents position.
Actually, no. If you use left
and top
with a position: relative
element, they'll offset it from where it otherwise would be if it weren't positioned (e.g., in the static flow), while continuing to reserve its space in the static flow. A subtle but important distinction (and hugely useful for drag-and-drop).
If you want to animate it to the top left of the document, you can figure out its offset (via offset
), and then provide those as negative numbers for left
and top
, since of course if it's at (say) [100,50], then positioning it at [-100,-50] compared to its default position will...put it at [0,0].
Like this:
$("selector_for_your_divs").click(function() {
var pos, $this;
$this = $(this);
pos = $this.offset();
$this.animate({
left: "-" + pos.left + "px",
top: "-" + pos.top + "px"
});
});
Similarly, if you want to move it to be where another element is, simply subtract its position from the other element's position — that gives you the delta to apply:
$("selector_for_your_divs").click(function() {
var mypos, otherpos, $this;
// Move to the target element
$this = $(this);
pos = $this.offset();
otherpos = $('selector_for_other_element').offset();
pos.left = otherpos.left - pos.left;
pos.top = otherpos.top - pos.top;
$this.animate({
left: pos.left + "px",
top: pos.top + "px"
});
});
Roel
Updated on June 05, 2022Comments
-
Roel almost 2 years
I have a
div
with the attributeposition: relative;
. Now, there are three of thesediv
s. They all get a unique ID etc.Now if I click a
div
, I want it to animate to a certain position in the document. Although I cannot determine the left/top values since if I use "top" and "left", it will relatively set the left to its parents position.Maybe a bit unclear, but here is what I got.
The CSS of the clickable
DIV
that will move.div#left_hldr .switch_project { z-index: 1001; position: relative; margin: 10px 0px 0px 0px; cursor: pointer; }
// Open project. $(".switch_project").live('click', function() { // Get the ID value. var More_Id = $(this).attr("id"); // Explode the Id. var Id_Split = More_Id.split("_"); // Get the project ID. var Project_Id = Id_Split[2]; /* Replacement of the switch project div. 1 ) Define the current position. 2 ) Define the new position. 3 ) Replace the DIV to the new position. 4 ) Fade the new page in. 5 ) Put the DIV back to its original position. */ // Current Position. var Ori_Left = $(this).offset().left; var Ori_Top = $(this).offset().top; // New Position. [ Based on the content_hldr container ] var New_Top = $("div#content_hldr").offset().top; var New_Left = $("div#content_hldr").offset().left; // Define the current div. var Div_Rep = $(this); // Hide the More Info tab. $(Div_Rep).children(".more_info").fadeOut("fast"); // Fade content out. $("div#content_hldr").fadeOut("fast"); // Replace the div. $(Div_Rep).animate({ top: New_Top, left: New_Left }, "slow", function() { // Load Home page in. $("div#content_hldr").load("content/content.projects.php?id=" + Project_Id, function() { // Re-define Cufon. Cufon.replace('h2'); }); // Fade in the content. $("div#content_hldr").fadeIn("fast", function() { // Hide the replaced div. $(Div_Rep).hide(); // Replace it back to its position. $(Div_Rep).css({ top: Ori_Top, left: Ori_Left }); // Show the More Info tab again. $(Div_Rep).children(".more_info").show(); // Fade back in. $(Div_Rep).fadeIn("medium"); }); }); });