Después de tratar de encontrar una solución que manejara todas las circunstancias (opciones para animar el desplazamiento, rellenar el objeto una vez que se desplaza a la vista, funciona incluso en circunstancias oscuras como en un iframe), finalmente terminé escribiendo mi propia solución para esto. Como parece funcionar cuando muchas otras soluciones fallan, pensé en compartirlo:
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
es un objeto jQuery que contiene el objeto que desea desplazar a la vista si es necesario.
options
(opcional) puede contener las siguientes opciones pasadas en un objeto:
options.$container
- un objeto jQuery que apunta al elemento contenedor de $ target (en otras palabras, el elemento en el dom con las barras de desplazamiento). El valor predeterminado es la ventana que contiene el elemento $ target y es lo suficientemente inteligente como para seleccionar una ventana de iframe. Recuerde incluir los $ en el nombre de la propiedad.
options.padding
- el relleno en píxeles para agregar encima o debajo del objeto cuando se desplaza a la vista. De esta manera, no está justo contra el borde de la ventana. El valor predeterminado es 20.
options.instant
- si se establece en verdadero, jQuery animate no se usará y el desplazamiento aparecerá instantáneamente en la ubicación correcta. Por defecto es falso.
options.animationOptions
- cualquier opción jQuery que desee pasar a la función animada jQuery (consulte http://api.jquery.com/animate/ ). Con esto, puede cambiar la duración de la animación o ejecutar una función de devolución de llamada cuando se completa el desplazamiento. Esto solo funciona si options.instant
se establece en falso. Si necesita tener una animación instantánea pero con una devolución de llamada, configure en options.animationOptions.duration = 0
lugar de usar options.instant = true
.