1356 votes

Comment vérifier si un élément est visible après défilement?

Je charge des éléments via AJAX. Certains d'entre eux ne sont visibles que si vous faites défiler la page. Est-il possible de savoir si un élément est maintenant visible à l'écran ?

0 votes

Je ne comprends pas vraiment le problème. Pourrais-tu essayer d'ajouter plus d'informations?

58 votes

Il signifie qu'il veut une méthode pour savoir si un élément donné est affiché dans la fenêtre du navigateur, ou si l'utilisateur doit faire défiler pour le voir.

1 votes

Pour vérifier si un élément est entièrement visible dans un conteneur, il suffit d'ajouter un paramètre de sélecteur supplémentaire et de réutiliser le code d'élément pour celui-ci. Library.IsElementVisibleInContainer = function (elementSelector, containerSelector) { var containerViewTop = $(containerSelector).offset().top; var containerViewBottom = containerViewTop + $(containerSelector).height();

1332voto

Scott Dowding Points 5167

Cela devrait faire l'affaire :

function isScrolledIntoView(elem)
{
    var docViewTop = $(window).scrollTop();
    var docViewBottom = docViewTop + $(window).height();

    var elemTop = $(elem).offset().top;
    var elemBottom = elemTop + $(elem).height();

    return ((elemBottom <= docViewBottom) && (elemTop >= docViewTop));
}

Fonction utilitaire simple Cela vous permettra d'appeler une fonction utilitaire qui accepte l'élément que vous recherchez et si vous voulez que l'élément soit entièrement visible ou partiellement.

function Utils() {

}

Utils.prototype = {
    constructor: Utils,
    isElementInView: function (element, fullyInView) {
        var pageTop = $(window).scrollTop();
        var pageBottom = pageTop + $(window).height();
        var elementTop = $(element).offset().top;
        var elementBottom = elementTop + $(element).height();

        if (fullyInView === true) {
            return ((pageTop < elementTop) && (pageBottom > elementBottom));
        } else {
            return ((elementTop <= pageBottom) && (elementBottom >= pageTop));
        }
    }
};

var Utils = new Utils();

Utilisation

var isElementInView = Utils.isElementInView($('#flyout-left-container'), false);

if (isElementInView) {
    console.log('à la vue');
} else {
    console.log('hors de la vue');
}

68 votes

Notez que cela ne fonctionne que si le document est l'élément en train d'être défilé, c'est-à-dire que vous ne vérifiez pas la visibilité d'un élément à l'intérieur d'un panneau intérieur déroulant.

8 votes

Comment ajouter un léger décalage ?

5 votes

Uniquement fonctionné lorsque j'ai utilisé window.innerHeight à la place.

529voto

bravedick Points 1213

Cette réponse en Vanilla:

function isScrolledIntoView(el) {
    var rect = el.getBoundingClientRect();
    var elemTop = rect.top;
    var elemBottom = rect.bottom;

    // Seuls les éléments complètement visibles renvoient true:
    var isVisible = (elemTop >= 0) && (elemBottom <= window.innerHeight);
    // Les éléments partiellement visibles renvoient true:
    //isVisible = elemTop < window.innerHeight && elemBottom >= 0;
    return isVisible;
}

36 votes

Ne devrait-ce pas être isVisible = elementTop < window.innerHeight && elementBottom >= 0? Sinon, un élément à moitié sur l'écran retourne faux.

14 votes

Non. je vérifie si un élément est entièrement visible sur la page. si vous voulez vérifier la visibilité d'une partie - vous pouvez personnaliser cet extrait.

21 votes

Je trouve cette réponse plus performante que la réponse choisie. Plus simple aussi.

132voto

Joe Lencioni Points 4642

Mise à jour : utiliser IntersectionObserver


La meilleure méthode que j'ai trouvée jusqu'à présent est le plugin jQuery appear. Ça fonctionne à merveille.

Imite un événement "appear" personnalisé, qui se déclenche lorsque un élément apparaît à l'écran ou devient visible pour l'utilisateur.

$('#foo').appear(function() {
  $(this).text('Bonjour tout le monde');
});

Ce plugin peut être utilisé pour empêcher des requêtes inutiles pour du contenu qui est caché ou hors de la zone visible.

34 votes

C'est un plugin génial, sans aucun doute, mais ne répond pas à la question.

5 votes

Alors que le plugin jQuery-appear est bon pour le contenu de la zone principale de la page, il a malheureusement des problèmes avec les divs de défilement de taille fixe avec un dépassement. L'événement peut se déclencher prématurément lorsque l'élément lié est dans la zone visible de la page mais à l'extérieur de la zone visible de la div, puis ne se déclenche pas comme prévu lorsque l'élément entre dans la vue de la div.

20 votes

Y a-t-il un plugin de disparition?

101voto

Ally Points 969

Voici ma solution JavaScript pure qui fonctionne même si elle est cachée à l'intérieur d'un conteneur scrollable.

Démo ici (essayez de redimensionner la fenêtre également)

var visibleY = function(el){
  var rect = el.getBoundingClientRect(), top = rect.top, height = rect.height, 
    el = el.parentNode
  // Vérifier si le bas de l'élément est hors de la page
  if (rect.bottom < 0) return false
  // Vérifier si c'est dans le viewport du document
  if (top > document.documentElement.clientHeight) return false
  do {
    rect = el.getBoundingClientRect()
    if (top <= rect.bottom === false) return false
    // Vérifier si l'élément est hors de vue en raison d'un défilement du conteneur
    if ((top + height) <= rect.top) return false
    el = el.parentNode
  } while (el != document.body)
  return true
};

MODIFICATION 2016-03-26 : J'ai mis à jour la solution pour tenir compte du défilement passé de l'élément donc il est caché au-dessus du haut du conteneur scrollable. MODIFICATION 2018-10-08 : Mise à jour pour gérer quand il est défilé hors de vue au-dessus de l'écran.

0 votes

Merci, peut-être mieux être retour top <= document.documentElement.clientHeight && top >= 0;

23 votes

+1 C'était la seule réponse codée (c'est-à-dire pas de tierce partie) qui tient compte de la nature récursive des éléments. J'ai étendu pour gérer le défilement horizontal, vertical et de page: jsfiddle.net/9nuqpgqa

4 votes

Cette solution ne vérifie que le sommet de l'élément. Si le premier pixel en haut est visible, elle renverra true même si le reste de l'élément n'est pas visible. Pour vérifier si l'ensemble de l'élément est visible, vous devez également vérifier la propriété bottom.

41voto

Fedir Points 3235

Le plugin jQuery Waypoints se comporte très bien ici.

$('.entry').waypoint(function() {
   alert('Vous avez fait défiler jusqu'à une entrée.');
});

Il y a quelques exemples sur le site du plugin.

3 votes

Pour moi, cela n'a fonctionné qu'avec un décalage $('#my-div').waypoint(function() { console.log('Bonjour !'); }, { offset: '100%' });

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X