Ich habe eine Liste von Artikeln. Das Format ist so etwas wie dieses:Ein Element in einer sortierbaren Liste nach oben/unten verschieben, während das Element an derselben Position im Ansichtsfenster bleibt?
||||||||||||||||||||||||||||||
| SPACER DIV |
||||||||||||||||||||||||||||||
| ELEMENT DIV |
| |
||||||||||||||||||||||||||||||
| SPACER DIV |
||||||||||||||||||||||||||||||
| ELEMENT DIV |
| |
||||||||||||||||||||||||||||||
Ich bin mit einem Skript jQuery ein Element nach oben/unten die Liste:
$(sortableContainer).on('click', '.sortable-controls i', function(e){
var that = $(e.target);
var item = that.closest(panel);
var thisWindow = $(window);
var scrollTop = thisWindow.scrollTop(),
elementOffsetTop = item.offset().top,
distanceTop = (elementOffsetTop - scrollTop);
if(that.hasClass('sortable-up')) {
var filler = item.prev();
var prev = item.prevAll(panel).first();
if (prev.length == 0)
return;
item.prev().remove();
prev.css('z-index', 999).css('position','relative').animate({
top: item.height()
}, 250);
item.css('z-index', 1000).css('position', 'relative').animate({ top: '-' + prev.height(), queue: false}, 300, function() {
prev.css('z-index', '').css('top', '').css('position', '');
item.css('z-index', '').css('top', '').css('position', '');
item.insertBefore(prev);
filler.insertBefore(prev);
Abayo.builder.updateSorted(item, sortableContainer);
});
var scrollDifference = distanceTop - prev.height() - filler.height();
$("html, body").animate({ scrollTop: scrollDifference, queue: false }, 300);
} else if(that.hasClass('sortable-down')) {
var filler = item.next();
var next = item.nextAll(panel).first();
if (next.length == 0)
return;
item.next().remove();
next.css('z-index', 999).css('position', 'relative').animate({
top: '-' + item.height()
}, 250);
item.css('z-index', 1000).css('position', 'relative').animate({ top: next.height(), queue: false }, 300, function() {
next.css('z-index', '').css('top', '').css('position', '');
item.css('z-index', '').css('top', '').css('position', '');
item.insertAfter(next);
filler.insertAfter(next);
Abayo.builder.updateSorted(item, sortableContainer);
});
$("html, body").animate({ scrollTop: distanceTop + next.height() + filler.height(), queue: false }, 300);
}
})
Leider dies nicht gut funktioniert, wenn das Element nicht genau in der Mitte und es gibt genug Elemente, um einen Überlauf-y zu erstellen.
Wie ändert man dieses Skript, indem es immer das Element im Ansichtsfenster behält und auch die Größe des Darstellungsbereichs berücksichtigt?
Ich muss in der Lage sein, ein Top-Element ganz nach unten zu klicken, aber nach ein paar Klicks fällt die Abwärts-Schaltfläche außerhalb meines Ansichtsfensters, und ich muss manuell scrollen, um dies fortzusetzen.
Fest Ausgabe in Demo sichtbar zu machen, wenn alle Elemente haben den gleichen Inhalt und Stil – charlietfl
Ernsthaft? Bewegen Sie das Element einige Male nach unten. Sie sehen, dass es nicht im Ansichtsfenster bleibt. – Abayob
Machen Sie zumindest einen Unterschied, damit wir nicht damit spielen müssen, um es herauszufinden. Wenn ich etwas verschiebe, das "Some Content" sagt, dann sehe ich genau das. – charlietfl