Первый раз, когда вы установили left: 30px
. Второй раз вы установили right: 30px
. Но left: 30px
все еще установлен. Они не являются эксклюзивной собственностью; Предполагается, что при установке обоих элементов элемент расширяется в соответствии с расстоянием между левым краем 30 пикселей и правым краем 30 пикселей.
Однако я предполагаю, что у вас есть фиксированная ширина элемента close
. Это оставляет left: 30px; right: 30px; width: 100px
, который чрезмерно ограничен , в результате чего свойство right
игнорируется, не вызывая движения. То же самое касается top
/ bottom
/ height
.
Для анимации между выровненными по левому и правому краю позициями вам потребуется написать только один из left
или right
. Чтобы выяснить, какой будет позиция пикселя left
для позиции, выровненной по правому краю, вам нужно взглянуть на размер содержащего элемента блока. Предполагая, что содержащий блок является целым документом:
<div id="close" style="background: red; position: absolute; width: 100px; height: 50px;">foo</div>
<script type="text/javascript">
var close_step= 0;
$('#close').click(function() {
if (close_step>=4) {
$(this).remove();
return;
}
var w= $(window).width()-$(this).width()-30*2;
var h= $(window).height()-$(this).height()-30*2;
var x= [0, 1, 0, 1][close_step]*w+30;
var y= [0, 1, 1, 0][close_step]*h+30;
var pos= {left: x+'px', top: y+'px'};
if (close_step===0)
$(this).css(pos);
else
$(this).animate(pos);
$(this).text([
'First click here', 'Now click here', 'And now click here', 'And finally click here'
][close_step]);
close_step++;
}).click();
</script>
Если бы #close
были вложены в блок с position
, вам нужно смотреть на ширину / высоту этого блока вместо window
.