Estou carregando elementos via AJAX. Alguns deles são visíveis apenas se você rolar a página.
Existe alguma maneira de saber se um elemento está agora na parte visível da página?
javascript
jquery
scroll
yoavf
fonte
fonte
Library.IsElementVisibleInContainer = function (elementSelector, containerSelector) { var containerViewTop = $(containerSelector).offset().top; var containerViewBottom = containerViewTop + $(containerSelector).height();
Respostas:
Isso deve fazer o truque:
Função Utilitária Simples Isso permitirá que você chame uma função utilitária que aceite o elemento que está procurando e se desejar que o elemento esteja totalmente à vista ou parcialmente.
Uso
fonte
window.innerHeight
vezelemTop
eu usei$(elem).position().top
e paraelemBottom
eu useielemTop + $(elem).outerHeight(true)
.Esta resposta no Vanilla:
fonte
isVisible = elementTop < window.innerHeight && elementBottom >= 0
? Caso contrário, um elemento na metade da tela retornará falso.Atualização: use IntersectionObserver
O melhor método que encontrei até agora é o plugin jQuery appear . Funciona como um encanto.
fonte
appear plugin
e provavelmente você precisará adicionar um local!
para obter umdisappear
plugin.Aqui está minha solução JavaScript pura que funciona se também estiver oculta em um contêiner rolável.
Demonstração aqui (tente redimensionar a janela também)
EDIT 26-03-2016: atualizei a solução para considerar a rolagem além do elemento, para que fique oculto acima da parte superior do contêiner capaz de rolagem. EDIT 2018-10-08: atualizado para lidar com quando rolado fora da vista acima da tela.
fonte
return top <= document.documentElement.clientHeight && top >= 0;
Usando a API IntersectionObserver (nativo em navegadores modernos)
É fácil e eficiente determinar se um elemento está visível no viewpor ou em qualquer contêiner rolável usando um observador .
A necessidade de anexar um
scroll
evento e a verificação manual do retorno de chamada do evento são eliminadas, assim a eficiência:Exibir tabela de suporte de navegadores (não suportada no IE / Safari)
fonte
O plugin jQuery Waypoints é muito bom aqui.
Existem alguns exemplos no site do plugin .
fonte
$('#my-div').waypoint(function() { console.log('Hello there!'); }, { offset: '100%' });
E se
Depois disso, você pode acionar o que quiser quando o elemento estiver em exibição como este
Isso funciona para mim muito bem
fonte
O WebResourcesDepot escreveu um script para carregar durante a rolagem que usa o jQuery há algum tempo. Você pode ver a demonstração ao vivo aqui . A carne de sua funcionalidade era esta:
fonte
A função interessante de Tweeked Scott Dowding para minha exigência - isso é usado para descobrir se o elemento acabou de rolar a tela, ou seja, é a borda superior.
fonte
Baunilha comum para verificar se o elemento (
el
) está visível em div (holder
) rolávelUso com jQuery:
fonte
isScrolledIntoView é uma função muito necessária, então eu tentei, funciona para elementos não maiores que a viewport, mas se o elemento for maior que a viewport, não funcionará. Para corrigir isso, mude facilmente a condição
para isso:
Veja a demonstração aqui: http://jsfiddle.net/RRSmQ/
fonte
A maioria das respostas aqui não leva em consideração que um elemento também pode ser oculto porque é rolado para fora da visualização de uma div, não apenas da página inteira.
Para cobrir essa possibilidade, você basicamente precisa verificar se o elemento está posicionado dentro dos limites de cada um de seus pais.
Esta solução faz exatamente isso:
Também permite especificar em que porcentagem deve ser visível em cada direção.
Não cobre a possibilidade de ocultar devido a outros fatores, como
display: hidden
.Isso deve funcionar em todos os principais navegadores, já que ele usa apenas
getBoundingClientRect
. Eu testei pessoalmente no Chrome e no Internet Explorer 11.fonte
fonte
Aqui está outra solução em http://web-profile.com.ua/
Veja no JSFiddle
fonte
Isso considera qualquer preenchimento, borda ou margem que o elemento tenha, além de elementos maiores que a própria viewport.
Para chamá-lo, use algo como isto:
fonte
Existe um plugin para o jQuery chamado inview que adiciona um novo evento "inview".
Aqui está um código para um plugin jQuery que não usa eventos:
Encontrei isso em um comentário aqui ( http://remysharp.com/2009/01/26/element-in-view-event-plugin/ ) por um cara chamado James
fonte
Eu precisava verificar a visibilidade nos elementos dentro do contêiner DIV rolável
fonte
e.style.opacity > 0
para,(!e.style.opacity || e.style.opacity > 0)
porque, por padrão, é a string vazia para mim no FF.Com base nessa ótima resposta , você pode simplificá-la um pouco mais usando o ES2015 +:
Se você não se importa com a parte superior saindo pela janela e apenas se preocupando com a visualização da parte inferior, isso pode ser simplificado para
ou mesmo o one-liner
fonte
Você pode usar o plugin jquery "onScreen" para verificar se o elemento está na janela de exibição atual quando você rola. O plug-in define o ": onScreen" do seletor como true quando o seletor aparece na tela. Este é o link para o plugin que você pode incluir no seu projeto. " http://benpickles.github.io/onScreen/jquery.onscreen.min.js "
Você pode tentar o exemplo abaixo, que funciona para mim.
Código HTML:
CSS:
fonte
Eu tenho esse método no meu aplicativo, mas ele não usa o jQuery:
Edit: Este método funciona bem para o IE (pelo menos versão 6). Leia os comentários para compatibilidade com o FF.
fonte
var visibleBottom = visibleTop + window.innerHeight;
não estou usando jQuery e você me ajudou a encontrar a resposta correta.Se você quiser ajustar isso para rolar o item dentro de outra div,
fonte
Modificou a resposta aceita para que o elemento tenha sua propriedade de exibição definida como algo diferente de "nenhum" para a qualidade como visível.
fonte
Aqui está uma maneira de conseguir a mesma coisa usando o Mootools, na horizontal, na vertical ou em ambas.
fonte
Um exemplo baseado nesta resposta para verificar se um elemento está 75% visível (ou seja, menos de 25% dele está fora da tela).
fonte
Existem mais de 30 respostas para essa pergunta e nenhuma delas usa a solução JS pura e incrivelmente simples que eu tenho usado. Não é necessário carregar o jQuery apenas para resolver isso, pois muitos outros estão pressionando.
Para saber se o elemento está dentro da viewport, devemos primeiro determinar a posição dos elementos no corpo. Não precisamos fazer isso recursivamente, como eu pensava. Em vez disso, podemos usar
element.getBoundingClientRect()
.Este valor é a diferença Y entre a parte superior do objeto e a parte superior do corpo.
Devemos então dizer se o elemento está à vista. A maioria das implementações pergunta se o elemento completo está dentro da janela de exibição, então é isso que abordaremos.
Primeiro de tudo, a posição superior da janela é:
window.scrollY
.Podemos obter a posição inferior da janela adicionando a altura da janela à sua posição superior:
Vamos criar uma função simples para obter a posição superior do elemento:
Esta função retornará a posição superior do elemento dentro da janela ou retornará
0
se você passar algo diferente de um elemento com o.getBoundingClientRect()
método Esse método existe há muito tempo, portanto você não precisa se preocupar com o fato de seu navegador não o suportar.Agora, a posição superior do nosso elemento é:
E ou a posição inferior do elemento é:
Agora, podemos determinar se o elemento está dentro da viewport, verificando se a posição inferior do elemento é menor que a posição superior da viewport e verificando se a posição superior do elemento é maior que a posição inferior da viewport:
A partir daí, você pode executar a lógica para adicionar ou remover uma
in-view
classe em seu elemento, com a qual poderá lidar posteriormente com efeitos de transição em seu CSS.Estou absolutamente surpreso por não encontrar essa solução em nenhum outro lugar, mas acredito que essa é a solução mais limpa e eficaz e não exige que você carregue o jQuery!
fonte
Uma versão mais eficiente desta resposta :
fonte
Este método retornará true se qualquer parte do elemento estiver visível na página. Funcionou melhor no meu caso e pode ajudar outra pessoa.
fonte
Modificação simples para div rolável (contêiner)
NOTA: isso não funciona se o elemento for maior que a div rolável.
fonte
Adaptei esta curta extensão de função jQuery, que você pode usar (licença MIT).
fonte
Eu escrevi um componente para a tarefa, projetado para lidar com um grande número de elementos extremamente rápido (na faixa de <10ms para 1000 elementos em um celular lento ).
Ele funciona com qualquer tipo de recipiente de rolagem você tem acesso a - janela, elementos HTML, iframe incorporado, janela filho gerou - e é muito flexível no que detecta ( visibilidade total ou parcial , beira caixa ou caixa de conteúdo , costume zona de tolerância , etc )
Um conjunto de testes enorme, principalmente gerado automaticamente, garante que ele funcione como anunciado em vários navegadores .
Experimente se você gosta: jQuery.isInView . Caso contrário, você pode encontrar inspiração no código fonte, por exemplo, aqui .
fonte