¿Cómo comprobar si el elemento es visible después de desplazarse?

Resuelto yoavf asked hace 15 años • 47 respuestas

Estoy cargando elementos vía AJAX. Algunos de ellos sólo son visibles si te desplazas hacia abajo en la página. ¿Hay alguna manera de saber si un elemento está ahora en la parte visible de la página?

yoavf avatar Jan 28 '09 17:01 yoavf
Aceptado

Esto debería funcionar:

function isScrolledIntoView(elem)
{
    var docViewTop = $(window).scrollTop();
    var docViewBottom = docViewTop + $(window).height();

    var elemTop = $(elem).offset().top;
    var elemBottom = elemTop + $(elem).height();

    return ((elemBottom <= docViewBottom) && (elemTop >= docViewTop));
}

Función de utilidad simple Esto le permitirá llamar a una función de utilidad que acepte el elemento que está buscando y si desea que el elemento esté total o parcialmente a la vista.

function Utils() {

}

Utils.prototype = {
    constructor: Utils,
    isElementInView: function (element, fullyInView) {
        var pageTop = $(window).scrollTop();
        var pageBottom = pageTop + $(window).height();
        var elementTop = $(element).offset().top;
        var elementBottom = elementTop + $(element).height();

        if (fullyInView === true) {
            return ((pageTop < elementTop) && (pageBottom > elementBottom));
        } else {
            return ((elementTop <= pageBottom) && (elementBottom >= pageTop));
        }
    }
};

var Utils = new Utils();

Uso

var isElementInView = Utils.isElementInView($('#flyout-left-container'), false);

if (isElementInView) {
    console.log('in view');
} else {
    console.log('out of view');
}
Scott Dowding avatar Jan 28 '2009 15:01 Scott Dowding

Esta respuesta en vainilla:

function isScrolledIntoView(el) {
    var rect = el.getBoundingClientRect();
    var elemTop = rect.top;
    var elemBottom = rect.bottom;

    // Only completely visible elements return true:
    var isVisible = (elemTop >= 0) && (elemBottom <= window.innerHeight);
    // Partially visible elements return true:
    //isVisible = elemTop < window.innerHeight && elemBottom >= 0;
    return isVisible;
}
korywka avatar Mar 18 '2014 13:03 korywka

Usando la API IntersectionObserver

(nativo en navegadores modernos)


Es fácil y eficiente determinar si un elemento es visible en la ventana gráfica o en cualquier contenedor desplazable mediante el uso de un observador .

Se elimina la necesidad de adjuntar un scrollevento y verificar manualmente la devolución de llamada del evento, lo cual es más eficiente:

// define an observer instance
var observer = new IntersectionObserver(onIntersection, {
  root: null,   // default is the viewport
  threshold: .5 // percentage of target's visible area. Triggers "onIntersection"
})

// callback is called on intersection change
function onIntersection(entries, opts){
  entries.forEach(entry =>  
    entry.target.classList.toggle('visible', entry.isIntersecting)
  )
}

// Use the observer to observe an element
observer.observe( document.querySelector('.box') )

// To stop observing:
// observer.unobserve(entry.target)
span{ position:fixed; top:0; left:0; }
.box{ width:100px; height:100px; background:red; margin:1000px; transition:.75s; }
.box.visible{ background:green; border-radius:50%; }
<span>Scroll both Vertically &amp; Horizontally...</span>
<div class='box'></div>
Expandir fragmento


Compatible con navegadores modernos, incluidos los navegadores móviles. No compatible con IE: ver la tabla de compatibilidad de navegadores

vsync avatar Aug 10 '2017 15:08 vsync

Actualización: use IntersectionObserver


El mejor método que he encontrado hasta ahora es el complemento jQuery . Funciona de maravilla.

Imita un evento personalizado de "aparición", que se activa cuando un elemento se desplaza a la vista o se vuelve visible para el usuario.

$('#foo').appear(function() {
  $(this).text('Hello world');
});

Este complemento se puede utilizar para evitar solicitudes innecesarias de contenido oculto o fuera del área visible.

Joe Lencioni avatar Aug 20 '2010 21:08 Joe Lencioni