You need to use a callback function after one of your chained elements, otherwise the values are computed only once.
function iphoneAnimate() {
$('.iphone-screen div').repeat().css({
opacity: 0,
top: 0
})
.each($)
.fadeTo(1000, 1)
.then(function(){
$(this).animate({top: $('.iphone-screen').height() - $(this).height()
},4000);})
.fadeTo(1000, 0, $);
}
iphoneAnimate();
Working demo : http://jsfiddle.net/ZGnTe/2/