Je charge des éléments via AJAX. Certains d'entre eux ne sont visibles que si vous faites défiler la page.
Existe-t-il un moyen de savoir si un élément se trouve maintenant dans la partie visible de la page?
javascript
jquery
scroll
yoavf
la source
la source
Library.IsElementVisibleInContainer = function (elementSelector, containerSelector) { var containerViewTop = $(containerSelector).offset().top; var containerViewBottom = containerViewTop + $(containerSelector).height();
Réponses:
Cela devrait faire l'affaire:
Fonction utilitaire simple Cela vous permettra d'appeler une fonction utilitaire qui accepte l'élément que vous recherchez et si vous souhaitez que l'élément soit entièrement visible ou partiellement.
Usage
la source
window.innerHeight
placeelemTop
j'ai utilisé$(elem).position().top
etelemBottom
j'ai utiliséelemTop + $(elem).outerHeight(true)
.Cette réponse à la vanille:
la source
isVisible = elementTop < window.innerHeight && elementBottom >= 0
? Sinon, un élément à moitié sur l'écran renvoie faux.Mise à jour: utilisez IntersectionObserver
La meilleure méthode que j'ai trouvée jusqu'à présent est le plugin jQuery appear . Fonctionne comme un charme.
la source
appear plugin
et vous aurez probablement juste besoin d'ajouter un!
quelque part pour obtenir undisappear
plugin.Voici ma solution JavaScript pure qui fonctionne si elle est également cachée dans un conteneur défilant.
Démo ici (essayez aussi de redimensionner la fenêtre)
EDIT 2016-03-26: J'ai mis à jour la solution pour tenir compte du défilement au-delà de l'élément afin qu'il soit masqué au-dessus du haut du conteneur à défilement. EDIT 2018-10-08: mis à jour pour gérer le défilement hors de la vue au-dessus de l'écran.
la source
return top <= document.documentElement.clientHeight && top >= 0;
Utilisation de l' API IntersectionObserver (native dans les navigateurs modernes)
Il est facile et efficace de déterminer si un élément est visible dans la fenêtre de visualisation, ou dans n'importe quel conteneur déroulant, en utilisant un observateur .
La nécessité d'attacher un
scroll
événement et de vérifier manuellement le rappel de l'événement est éliminée, d'où l'efficacité:Afficher le tableau de prise en charge des navigateurs (non pris en charge dans IE / Safari)
la source
Le plugin jQuery Waypoints est très bien ici.
Il y a quelques exemples sur le site du plugin .
la source
$('#my-div').waypoint(function() { console.log('Hello there!'); }, { offset: '100%' });
Que diriez-vous
Après cela, vous pouvez déclencher ce que vous voulez une fois que l'élément est en vue comme celui-ci
Cela fonctionne très bien pour moi
la source
Tweeked la fonction cool de Scott Dowding pour mes besoins - ceci est utilisé pour trouver si l'élément vient de défiler dans l'écran, c'est-à-dire son bord supérieur.
la source
WebResourcesDepot a écrit un script à charger lors du défilement qui utilise jQuery il y a quelque temps. Vous pouvez voir leur démo en direct ici . Le bœuf de leur fonctionnalité était le suivant:
la source
Vanille simple pour vérifier si element (
el
) est visible dans div (holder
) défilantUtilisation avec jQuery:
la source
isScrolledIntoView est une fonction très nécessaire, donc je l'ai essayée, elle fonctionne pour des éléments pas plus élevés que la fenêtre, mais si l'élément est plus grand que la fenêtre, cela ne fonctionne pas. Pour résoudre ce problème, modifiez facilement la condition
pour ça:
Voir la démo ici: http://jsfiddle.net/RRSmQ/
la source
La plupart des réponses ici ne prennent pas en compte le fait qu'un élément peut également être masqué car il défile hors de la vue d'un div, pas seulement de la page entière.
Pour couvrir cette possibilité, vous devez essentiellement vérifier si l'élément est positionné à l'intérieur des limites de chacun de ses parents.
Cette solution fait exactement cela:
Il vous permet également de spécifier à quel pourcentage il doit être visible dans chaque direction.
Il ne couvre pas la possibilité qu'il puisse être caché en raison d'autres facteurs, comme
display: hidden
.Cela devrait fonctionner dans tous les principaux navigateurs, car il n'utilise que
getBoundingClientRect
. Je l'ai personnellement testé dans Chrome et Internet Explorer 11.la source
la source
Voici une autre solution de http://web-profile.com.ua/
Voir dans JSFiddle
la source
Cela prend en compte le remplissage, la bordure ou la marge de l'élément ainsi que les éléments plus grands que la fenêtre elle-même.
Pour l'appeler, utilisez quelque chose comme ceci:
la source
Il existe un plugin pour jQuery appelé inview qui ajoute un nouvel événement "inview".
Voici du code pour un plugin jQuery qui n'utilise pas d'événements:
J'ai trouvé cela dans un commentaire ici ( http://remysharp.com/2009/01/26/element-in-view-event-plugin/ ) par un mec appelé James
la source
Je devais vérifier la visibilité dans les éléments à l'intérieur du conteneur DIV déroulant
la source
e.style.opacity > 0
en(!e.style.opacity || e.style.opacity > 0)
car par défaut c'est la chaîne vide pour moi dans FF.À partir de cette excellente réponse , vous pouvez la simplifier un peu plus en utilisant ES2015 +:
Si vous ne vous souciez pas du haut qui sort de la fenêtre et que vous vous souciez simplement que le bas a été vu, cela peut être simplifié pour
ou même le one-liner
la source
Vous pouvez utiliser le plugin jquery "onScreen" pour vérifier si l'élément est dans la fenêtre courante lorsque vous faites défiler. Le plugin définit le ": onScreen" du sélecteur sur true lorsque le sélecteur apparaît à l'écran. Il s'agit du lien du plugin que vous pouvez inclure dans votre projet. " http://benpickles.github.io/onScreen/jquery.onscreen.min.js "
Vous pouvez essayer l'exemple ci-dessous qui fonctionne pour moi.
Code HTML:
CSS:
la source
J'ai une telle méthode dans mon application, mais elle n'utilise pas jQuery:
Edit: Cette méthode fonctionne bien pour IE (au moins la version 6). Lisez les commentaires pour la compatibilité avec FF.
la source
var visibleBottom = visibleTop + window.innerHeight;
je n'utilise pas jQuery et vous m'avez aidé à trouver la bonne réponse.Si vous souhaitez modifier cela pour faire défiler l'élément dans une autre div,
la source
Modification de la réponse acceptée afin que l'élément ait sa propriété d'affichage définie sur autre chose que «aucun» pour que la qualité soit visible.
la source
Voici un moyen de réaliser la même chose en utilisant Mootools, en horizontal, vertical ou les deux.
la source
Un exemple basé sur cette réponse pour vérifier si un élément est visible à 75% (c'est-à-dire que moins de 25% de celui-ci est hors de l'écran).
la source
Il y a plus de 30 réponses à cette question, et aucune d'entre elles n'utilise la solution JS incroyablement simple et pure que j'utilise. Il n'est pas nécessaire de charger jQuery juste pour résoudre ce problème, car beaucoup d'autres poussent.
Afin de savoir si l'élément se trouve dans la fenêtre, nous devons d'abord déterminer la position des éléments dans le corps. Nous n'avons pas besoin de le faire récursivement comme je le pensais autrefois. Au lieu de cela, nous pouvons utiliser
element.getBoundingClientRect()
.Cette valeur est la différence Y entre le haut de l'objet et le haut du corps.
Nous devons alors dire si l'élément est en vue. La plupart des implémentations demandent si l'élément complet se trouve dans la fenêtre d'affichage, c'est donc ce que nous allons couvrir.
Tout d' abord, la position de haut de la fenêtre est:
window.scrollY
.Nous pouvons obtenir la position inférieure de la fenêtre en ajoutant la hauteur de la fenêtre à sa position supérieure:
Permet de créer une fonction simple pour obtenir la position supérieure de l'élément:
Cette fonction renverra la position supérieure de l'élément dans la fenêtre ou elle reviendra
0
si vous lui passez autre chose qu'un élément avec la.getBoundingClientRect()
méthode. Cette méthode existe depuis longtemps, vous ne devriez donc pas avoir à vous soucier que votre navigateur ne la supporte pas.Maintenant, la première position de notre élément est:
Et la position inférieure de l'élément ou est:
Nous pouvons maintenant déterminer si l'élément se trouve dans la fenêtre en vérifiant si la position inférieure de l'élément est inférieure à la position supérieure de la fenêtre et en vérifiant si la position supérieure de l'élément est supérieure à la position inférieure de la fenêtre:
De là, vous pouvez effectuer la logique pour ajouter ou supprimer une
in-view
classe sur votre élément, que vous pourrez ensuite gérer plus tard avec des effets de transition dans votre CSS.Je suis absolument étonné de ne pas avoir trouvé cette solution ailleurs, mais je pense que c'est la solution la plus propre et la plus efficace, et elle ne vous oblige pas à charger jQuery!
la source
Une version plus efficace de cette réponse :
la source
Cette méthode renvoie true si une partie de l'élément est visible sur la page. Cela a mieux fonctionné dans mon cas et peut aider quelqu'un d'autre.
la source
Modification simple pour div défilable (conteneur)
REMARQUE: cela ne fonctionne pas si l'élément est plus grand que la div défilable.
la source
J'ai adapté cette courte extension de fonction jQuery, que vous pouvez utiliser librement (licence MIT).
la source
J'ai écrit un composant pour la tâche, conçu pour gérer un grand nombre d'éléments extrêmement rapidement (à hauteur de <10 ms pour 1000 éléments sur un mobile lent ).
Il fonctionne avec tous les types de conteneurs de défilement auxquels vous avez accès - fenêtre, éléments HTML, iframe intégré, fenêtre enfant générée - et est très flexible dans ce qu'il détecte ( visibilité complète ou partielle , zone de bordure ou zone de contenu , zone de tolérance personnalisée , etc. ).
Une énorme suite de tests, principalement générée automatiquement, garantit qu'elle fonctionne comme un navigateur croisé annoncé .
Essayez-le si vous le souhaitez: jQuery.isInView . Sinon, vous pourriez trouver l'inspiration dans le code source, par exemple ici .
la source