Respuesta para 2018 :
La mejor manera de hacer cosas así es usar la API Intersection Observer .
La API Intersection Observer proporciona una manera de observar asincrónicamente los cambios en la intersección de un elemento de destino con un elemento ancestro o con la ventana de un documento de nivel superior.
Históricamente, detectar la visibilidad de un elemento, o la visibilidad relativa de dos elementos en relación entre sí, ha sido una tarea difícil para la que las soluciones no han sido confiables y propensas a hacer que el navegador y los sitios a los que accede el usuario se vuelvan lentos. Desafortunadamente, a medida que la web ha madurado, la necesidad de este tipo de información ha crecido. La información de intersección es necesaria por muchas razones, tales como:
- Desplazamiento lento de imágenes u otro contenido a medida que se desplaza una página.
- Implementación de sitios web de "desplazamiento infinito", donde cada vez se carga más contenido y se procesa a medida que se desplaza, para que el usuario no tenga que pasar las páginas.
- Informe de visibilidad de anuncios para calcular los ingresos publicitarios.
- Decidir si realizar o no tareas o procesos de animación en función de si el usuario verá o no el resultado.
La implementación de la detección de intersecciones en el pasado involucraba controladores de eventos y métodos de llamada de bucles como Element.getBoundingClientRect () para generar la información necesaria para cada elemento afectado. Dado que todo este código se ejecuta en el hilo principal, incluso uno de estos puede causar problemas de rendimiento. Cuando un sitio se carga con estas pruebas, las cosas pueden ponerse completamente feas.
Vea el siguiente código de ejemplo:
var options = {
root: document.querySelector('#scrollArea'),
rootMargin: '0px',
threshold: 1.0
}
var observer = new IntersectionObserver(callback, options);
var target = document.querySelector('#listItem');
observer.observe(target);
La mayoría de los navegadores modernos admiten IntersectionObserver , pero debe usar el polyfill para compatibilidad con versiones anteriores.
element
ydocument.body
eran solo ejemplos). Vea howtocreate.co.uk/tutorials/javascript/browserwindow para más detalles.