jQuery 动画后偏移量不变

offset not changing after jQuery animation

http://plnkr.co/edit/c6OaitTTvLhltk7b3muf?p=preview

我正在制作 jQuery 动画,需要让动画 div 在动画结束后保留​​其新的偏移量。

动画的目标是能够单击底部的较小圆圈之一,然后它将 places/size 与顶部的较大圆圈交换。

function leadershipToShow(id) {
  console.log('leadershipToShow (' + id + ')');
  var x = $('.activeLeadership').offset().left;
  var y = $('.activeLeadership').offset().top;
  var h = $('.activeLeadership').height();
  var w = $('.activeLeadership').width();
  if($(id).hasClass('activeLeadership')){ console.log('already selected');return false; }
  console.log('x ' + x + ', y ' + y);
  console.log($(id).offset());
  var xi = $(id).offset().left;
  var yi = $(id).offset().top;
  console.log('xi ' + xi + ', yi ' + yi);
  var hi = $(id).height();
  var wi = $(id).width();
  var xOffset = Math.abs(x - xi);
  var yOffset = Math.abs(y - yi);

  console.log('xOffset ' + xOffset + ', yOffset ' + yOffset);

  $(id).animate({
  left: -xOffset + 15,
  top: -yOffset, 
  height: h,
  width: w
  }, 500, 'linear', function() {console.log('Id Animation Complete');});

  var selected = $('.activeLeadership'); 
  console.log(selected.offset());
  selected.animate({
  left: xOffset + 15,
  top: yOffset, 
  height: hi,
  width: wi
  }, 500, 'linear',function() {
    console.log('selected Animation Complete');
    console.log('new active ' + $('.activeLeadership').attr('id'));
    console.log('new active position x ' +   $('.activeLeadership').offset().left      + ', y ' +   $('.activeLeadership').offset().top);
    console.log('previous active ' + selected.attr('id'));
    console.log('previous active position x ' + selected.offset().left + ', y   '          + selected.offset().top);}
   );
  $(id).addClass('activeLeadership');
  selected.removeClass('activeLeadership');

}

我得到了一些帮助并弄明白了。解决方案是您必须根据 div 的第一个偏移位置来获取它们的偏移量。在对它们进行动画处理后,再次移动它们总是相对于它们的起始偏移量。因此,要完成这项工作,您必须将它们的起始偏移位置存储在函数外部的全局变量中。使用 if 语句,然后将 div 的 id 与初始偏移量的变量相关联。然后,只需计算要设置动画的初始偏移量 div 与要将其移动到的位置之间的差异即可。

更新了 plunker http://plnkr.co/edit/c6OaitTTvLhltk7b3muf?p=preview

var circle0 = { 'left': $('#circle0').offset().left, 'top': $('#circle0').offset().top };
var bigCircle = { 'height': $('.activeLeadership').height(), 'width': $('.activeLeadership').width() };
var circle1 = { 'left': $('#circle1').offset().left, 'top': $('#circle1').offset().top };
var circle2 = { 'left': $('#circle2').offset().left, 'top':              $('#circle2').offset().top };
var circle3 = { 'left': $('#circle3').offset().left, 'top':       $('#circle3').offset().top };
var circle4 = { 'left': $('#circle4').offset().left, 'top':   $('#circle4').offset().top };
var otherCircles = { 'height': $('#circle1').height(), 'width':   $('#circle1').width() };
var time = 400;

function leadershipToShow(id) {
  var circleToMoveUp = $(id);
  if(circleToMoveUp.hasClass('activeLeadership')){ return false; }
  var originOfCircleToMoveUp;
  if(id === '#circle0'){ originOfCircleToMoveUp = circle0; }
  else if(id === '#circle1'){ originOfCircleToMoveUp = circle1; }
  else if(id === '#circle2'){ originOfCircleToMoveUp = circle2; }
  else if(id === '#circle3'){ originOfCircleToMoveUp = circle3; }
  else if(id === '#circle4'){ originOfCircleToMoveUp = circle4; }
  var xOffsetUp = circle0.left - originOfCircleToMoveUp.left;
  var yOffsetUp = circle0.top - originOfCircleToMoveUp.top;

  var circleToMoveDown = $('.activeLeadership');
  var originOfCircleToMoveDown;
  if(circleToMoveDown.attr('id') === 'circle0'){ originOfCircleToMoveDown = circle0; }
  else if(circleToMoveDown.attr('id') === 'circle1'){ originOfCircleToMoveDown = circle1; }
  else if(circleToMoveDown.attr('id') === 'circle2'){ originOfCircleToMoveDown = circle2; }
  else if(circleToMoveDown.attr('id') === 'circle3'){ originOfCircleToMoveDown = circle3; }
  else if(circleToMoveDown.attr('id') === 'circle4'){     originOfCircleToMoveDown = circle4; }
  var xOffsetDown = circleToMoveUp.offset().left -  originOfCircleToMoveDown.left;
  var yOffsetDown = circleToMoveUp.offset().top -   originOfCircleToMoveDown.top;

  /* SMALL CIRCLE to BIG CIRCLE animation */
  circleToMoveUp.animate({
    left: xOffsetUp + 15,
    top: yOffsetUp, 
    height: bigCircle.height,
    width: bigCircle.width
  }, time, 'linear');
  /* BIG CIRCLE to SMALL CIRCLE animation */
  circleToMoveDown.animate({
    left: xOffsetDown + 15,
    top: yOffsetDown, 
    height: otherCircles.height,
    width: otherCircles.width
  }, time, 'linear');

  circleToMoveUp.addClass('activeLeadership');
  circleToMoveDown.removeClass('activeLeadership');
}