Po próbie znalezienia rozwiązania, które poradziłoby sobie z każdą sytuacją (opcje animacji zwoju, wypełniania wokół obiektu po przewinięciu do widoku, działa nawet w niejasnych okolicznościach, takich jak iframe), w końcu napisałem własne rozwiązanie tego problemu. Ponieważ wydaje się działać, gdy wiele innych rozwiązań zawiodło, pomyślałem, że podzielę się tym:
function scrollIntoViewIfNeeded($target, options) {
var options = options ? options : {},
$win = $($target[0].ownerDocument.defaultView), //get the window object of the $target, don't use "window" because the element could possibly be in a different iframe than the one calling the function
$container = options.$container ? options.$container : $win,
padding = options.padding ? options.padding : 20,
elemTop = $target.offset().top,
elemHeight = $target.outerHeight(),
containerTop = $container.scrollTop(),
//Everything past this point is used only to get the container's visible height, which is needed to do this accurately
containerHeight = $container.outerHeight(),
winTop = $win.scrollTop(),
winBot = winTop + $win.height(),
containerVisibleTop = containerTop < winTop ? winTop : containerTop,
containerVisibleBottom = containerTop + containerHeight > winBot ? winBot : containerTop + containerHeight,
containerVisibleHeight = containerVisibleBottom - containerVisibleTop;
if (elemTop < containerTop) {
//scroll up
if (options.instant) {
$container.scrollTop(elemTop - padding);
} else {
$container.animate({scrollTop: elemTop - padding}, options.animationOptions);
}
} else if (elemTop + elemHeight > containerTop + containerVisibleHeight) {
//scroll down
if (options.instant) {
$container.scrollTop(elemTop + elemHeight - containerVisibleHeight + padding);
} else {
$container.animate({scrollTop: elemTop + elemHeight - containerVisibleHeight + padding}, options.animationOptions);
}
}
}
$target jest obiektem jQuery zawierającym obiekt, który chcesz przewinąć do widoku w razie potrzeby.
options (opcjonalnie) może zawierać następujące opcje przekazane w obiekcie:
options.$container- obiekt jQuery wskazujący na zawierający element $ target (innymi słowy, element w dom z suwakami). Domyślnie jest to okno, które zawiera element $ target i jest wystarczająco inteligentne, aby wybrać okno iframe. Pamiętaj o umieszczeniu znaku $ w nazwie właściwości.
options.padding- wypełnienie w pikselach, które ma być dodane powyżej lub poniżej obiektu, gdy jest przewijany do widoku. W ten sposób nie znajduje się bezpośrednio przy krawędzi okna. Domyślnie 20.
options.instant- jeśli ustawione na true, jQuery animate nie będzie używane, a przewijanie natychmiast wyskoczy do właściwej lokalizacji. Domyślnie false.
options.animationOptions - wszelkie opcje jQuery, które chcesz przekazać do funkcji animacji jQuery (patrz http://api.jquery.com/animate/ ). Dzięki temu możesz zmienić czas trwania animacji lub zlecić wykonanie funkcji zwrotnej po zakończeniu przewijania. Działa to tylko wtedy, gdy options.instantma wartość false. Jeśli potrzebujesz natychmiastowej animacji, ale z wywołaniem zwrotnym, ustaw options.animationOptions.duration = 0zamiast używać options.instant = true.