Первая проблема заключается в том, что outerHeight
не учитывает поля без передачи true
:
var height = $(message).outerHeight(true);
$(message).fadeTo("fast", 0.01).animate({marginTop: -height, marginBottom: 0}, function(){
$(message).remove();
});
Вторая проблема заключается в том, что по определению CSS вертикальные поля смежных элементов разрушаются, то есть нижнее поле перекрывает верхнее поле следующего элемента. Это усложняет расчет, если все верхние / нижние поля не всегда одинаковы.
Редактировать: Я думаю, что следующее должно работать, если у вас нет отрицательных полей или что-то действительно странное:
function closeMessage(message) {
var pBot = 0;
if ($(message).prev().length) {
pBot = parseInt($(message).prev().css('marginBottom'));
}
var height = $(message).outerHeight();
$(message).fadeTo("fast", 0.01).animate({
marginTop: -height-pBot+'px',
marginBottom: pBot+'px'
}, 'linear', function() {
$(message).remove();
});
}
Это заставляет удаляющийся элемент сворачивать его верхнее поле, сводя на нет поле элемента над ним и заставляя элемент "исчезать", вычитая его высоту (без полей), в то же время устанавливая свое собственное дно. -положить то же, что и элемент над ним, по существу совпадая с тем, что будет там, когда он исчезнет. Кажется, он работает нормально, и вам нужно беспокоиться только о предыдущем поле, потому что следующее обрабатывается автоматически.
Пример: http://jsfiddle.net/FxR9M/
Мой собственный пример, который помогает увидеть, что происходит: http://jsfiddle.net/5PRy2/2/