Estoy cargando elementos a través de AJAX. Algunos de ellos solo son visibles si se desplaza hacia abajo en la página.
¿Hay alguna manera de saber si un elemento está ahora en la parte visible de la página?
javascript
jquery
scroll
yoavf
fuente
fuente
Library.IsElementVisibleInContainer = function (elementSelector, containerSelector) { var containerViewTop = $(containerSelector).offset().top; var containerViewBottom = containerViewTop + $(containerSelector).height();
Respuestas:
Esto debería funcionar:
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é totalmente a la vista o parcialmente.
Uso
fuente
window.innerHeight
lugarelemTop
que usé$(elem).position().top
y por loelemBottom
que uséelemTop + $(elem).outerHeight(true)
.Esta respuesta en vainilla:
fuente
isVisible = elementTop < window.innerHeight && elementBottom >= 0
? De lo contrario, un elemento medio en la pantalla devuelve falso.Actualización: use IntersectionObserver
El mejor método que he encontrado hasta ahora es el complemento jQuery aparece . Funciona de maravilla.
fuente
appear plugin
y probablemente solo necesites agregar un!
lugar para obtener undisappear
complemento.Aquí está mi solución de JavaScript pura que funciona si también está oculta dentro de un contenedor desplazable.
Demostración aquí (intente cambiar el tamaño de la ventana también)
EDITAR 2016-03-26: He actualizado la solución para tener en cuenta el desplazamiento más allá del elemento para que esté oculto encima de la parte superior del contenedor desplazable. EDITAR 2018-10-08: actualizado para manejar cuando se desplaza fuera de la vista sobre la pantalla.
fuente
return top <= document.documentElement.clientHeight && top >= 0;
Uso de IntersectionObserver API (nativo en navegadores modernos)
Es fácil y eficiente determinar si un elemento es visible en la vista o en cualquier contenedor desplazable, utilizando un observador .
Se
scroll
elimina la necesidad de adjuntar un evento y verificar manualmente la devolución de llamada del evento, por lo tanto, la eficiencia:Ver tabla de soporte de navegadores (no es compatible con IE / Safari)
fuente
El complemento jQuery Waypoints va muy bien aquí.
Hay algunos ejemplos en el sitio del complemento .
fuente
$('#my-div').waypoint(function() { console.log('Hello there!'); }, { offset: '100%' });
Qué tal si
Después de eso, puede activar lo que quiera una vez que el elemento esté a la vista de esta manera
Eso me funciona bien
fuente
Ajusté la función genial de Scott Dowding para mi requisito: esto se usa para encontrar si el elemento acaba de desplazarse a la pantalla, es decir, es el borde superior.
fuente
WebResourcesDepot escribió un script para cargar durante el desplazamiento que usa jQuery hace algún tiempo. Puede ver su demostración en vivo aquí . La esencia de su funcionalidad fue esta:
fuente
Vainilla simple para verificar si el elemento (
el
) es visible en div desplazable (holder
)Uso con jQuery:
fuente
isScrolledIntoView es una función muy necesaria, así que lo probé, funciona para elementos que no son más altos que la ventana gráfica, pero si el elemento es más grande que la ventana gráfica, no funciona. Para solucionar esto, cambie fácilmente la condición
a esto:
Ver demostración aquí: http://jsfiddle.net/RRSmQ/
fuente
La mayoría de las respuestas aquí no tienen en cuenta que un elemento también puede ocultarse porque se desplaza fuera de la vista de un div, no solo de toda la página.
Para cubrir esa posibilidad, básicamente debe verificar si el elemento está ubicado dentro de los límites de cada uno de sus padres.
Esta solución hace exactamente eso:
También le permite especificar en qué porcentaje debe estar visible en cada dirección.
No cubre la posibilidad de que pueda estar oculto debido a otros factores, como
display: hidden
.Esto debería funcionar en todos los principales navegadores, ya que solo se usa
getBoundingClientRect
. Personalmente lo probé en Chrome e Internet Explorer 11.fuente
fuente
Aquí hay otra solución de http://web-profile.com.ua/
Véalo en JSFiddle
fuente
Esto considera cualquier relleno, borde o margen que tenga el elemento, así como elementos más grandes que la ventana gráfica.
Para llamarlo use algo como esto:
fuente
Hay un complemento para jQuery llamado inview que agrega un nuevo evento "inview".
Aquí hay un código para un complemento jQuery que no usa eventos:
Encontré esto en un comentario aquí ( http://remysharp.com/2009/01/26/element-in-view-event-plugin/ ) por un tipo llamado James
fuente
Necesitaba verificar la visibilidad en los elementos dentro del contenedor DIV desplazable
fuente
e.style.opacity > 0
a(!e.style.opacity || e.style.opacity > 0)
porque, por defecto, es la cadena vacía para mí en FF.A partir de esta gran respuesta , puede simplificarla un poco más con ES2015 +:
Si no le importa que salga la parte superior de la ventana y solo le importa que se haya visto la parte inferior, esto puede simplificarse para
o incluso el one-liner
fuente
Puede utilizar el complemento jquery "en pantalla" para verificar si el elemento está en la ventana gráfica actual cuando se desplaza. El complemento establece el ": en pantalla" del selector en verdadero cuando el selector aparece en la pantalla. Este es el enlace para el complemento que puede incluir en su proyecto. " http://benpickles.github.io/onScreen/jquery.onscreen.min.js "
Puedes probar el siguiente ejemplo que funciona para mí.
Código HTML:
CSS:
fuente
Tengo un método de este tipo en mi aplicación, pero no utiliza jQuery:
Editar: este método funciona bien para IE (al menos la versión 6). Lea los comentarios para compatibilidad con FF.
fuente
var visibleBottom = visibleTop + window.innerHeight;
no estoy usando jQuery y me ayudó a encontrar la respuesta correcta.Si desea ajustar esto para desplazar el elemento dentro de otro div,
fuente
Modificó la respuesta aceptada para que el elemento tenga que tener su propiedad de visualización configurada en algo diferente a "ninguno" para que la calidad sea visible.
fuente
Aquí hay una manera de lograr lo mismo usando Mootools, en horizontal, vertical o ambos.
fuente
Un ejemplo basado en esta respuesta para verificar si un elemento es visible en un 75% (es decir, menos del 25% está fuera de la pantalla).
fuente
Hay más de 30 respuestas a esta pregunta, y ninguna de ellas utiliza la solución JS increíblemente simple y pura que he estado usando. No es necesario cargar jQuery solo para resolver esto, ya que muchos otros están presionando.
Para saber si el elemento está dentro de la ventana gráfica, primero debemos determinar la posición de los elementos dentro del cuerpo. No necesitamos hacer esto de forma recursiva como alguna vez pensé. En cambio, podemos usar
element.getBoundingClientRect()
.Este valor es la diferencia Y entre la parte superior del objeto y la parte superior del cuerpo.
Entonces debemos decir si el elemento está a la vista. La mayoría de las implementaciones preguntan si el elemento completo está dentro de la ventana gráfica, por lo que esto es lo que cubriremos.
En primer lugar, la posición superior de la ventana es:
window.scrollY
.Podemos obtener la posición inferior de la ventana agregando la altura de la ventana a su posición superior:
Vamos a crear una función simple para obtener la posición superior del elemento:
Esta función devolverá la posición superior del elemento dentro de la ventana o volverá
0
si le pasa algo más que un elemento con el.getBoundingClientRect()
método. Este método ha existido durante mucho tiempo, por lo que no debería tener que preocuparse de que su navegador no lo admita.Ahora, la posición superior de nuestro elemento es:
Y la posición inferior del elemento es:
Ahora podemos determinar si el elemento está dentro de la ventana gráfica al verificar si la posición inferior del elemento es más baja que la posición superior de la ventana gráfica y al verificar si la posición superior del elemento es más alta que la posición inferior de la ventana gráfica:
A partir de ahí, puede realizar la lógica para agregar o eliminar una
in-view
clase en su elemento, que luego puede manejar con efectos de transición en su CSS.Estoy absolutamente asombrado de no haber encontrado esta solución en ningún otro lado, pero sí creo que es la solución más limpia y efectiva, ¡y no requiere que cargue jQuery!
fuente
Una versión más eficiente de esta respuesta :
fuente
Este método devolverá verdadero si alguna parte del elemento es visible en la página. Funcionó mejor en mi caso y puede ayudar a alguien más.
fuente
Modificación simple para div desplazable (contenedor)
NOTA: esto no funciona si el elemento es más grande que el div desplazable.
fuente
Adapte esta breve extensión de la función jQuery, que puede usar libremente (licencia MIT).
fuente
He escrito un componente para la tarea, diseñado para manejar grandes cantidades de elementos extremadamente rápido (con una sintonía de <10 ms para 1000 elementos en un móvil lento ).
Funciona con cada tipo de contenedor de desplazamiento al que tiene acceso: ventana, elementos HTML, iframe incrustado, ventana secundaria engendrada, y es muy flexible en lo que detecta ( visibilidad total o parcial , cuadro de borde o cuadro de contenido , zona de tolerancia personalizada , etc. )
Un conjunto de pruebas enorme, en su mayoría autogenerado, asegura que funcione como se anuncia, entre navegadores .
Pruébalo si quieres: jQuery.isInView . De lo contrario, puede encontrar inspiración en el código fuente, por ejemplo, aquí .
fuente