Resposta para 2018 :
A melhor maneira de fazer isso é usar a API Intersection Observer .
A API Intersection Observer fornece uma maneira de observar assincronamente alterações na interseção de um elemento de destino com um elemento ancestral ou com a viewport de um documento de nível superior.
Historicamente, detectar a visibilidade de um elemento ou a visibilidade relativa de dois elementos em relação um ao outro tem sido uma tarefa difícil para a qual as soluções não são confiáveis e estão sujeitas a causar lentidão no navegador e nos sites que o usuário está acessando. Infelizmente, à medida que a web amadureceu, a necessidade desse tipo de informação aumentou. As informações de interseção são necessárias por vários motivos, como:
- O carregamento lento de imagens ou outro conteúdo como uma página é rolado.
- Implementar sites da "rolagem infinita", onde cada vez mais conteúdo é carregado e renderizado à medida que você rola, para que o usuário não precise folhear as páginas.
- Relatórios de visibilidade de anúncios para calcular receitas de anúncios.
- Decidir se deve ou não executar tarefas ou processos de animação com base em se o usuário verá ou não o resultado.
A implementação da detecção de interseção no passado envolvia manipuladores de eventos e loops que chamavam métodos como Element.getBoundingClientRect () para criar as informações necessárias para cada elemento afetado. Como todo esse código é executado no thread principal, mesmo um deles pode causar problemas de desempenho. Quando um site é carregado com esses testes, as coisas podem ficar completamente feias.
Veja o seguinte exemplo de código:
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);
A maioria dos navegadores modernos oferece suporte ao IntersectionObserver , mas você deve usar o polyfill para compatibilidade com versões anteriores.
element
edocument.body
foram apenas exemplos). Consulte howtocreate.co.uk/tutorials/javascript/browserwindow para obter detalhes.