Le plugin jQuery InView permet de déclencher des actions en JavaScript en fonction de l’apparition à l’écran d’un élément ou d’une partie de cet élément. Il est donc facile d’imaginer toutes sortes de succession d’animations ou d’actions asynchrones grâce à ce plugin. Voyons comment l’utiliser.
Où le trouver
Cela se passe sur GitHub, il est donc possible de télécharger le script, mais également de l’améliorer et partager vos suggestions.
Télécharger InView
Comment l’utiliser ?
Commencez simplement par appeler votre bibliothèque jQuery, puis chargez le plugin InView :
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script src="js/jquery.inview.min.js"></script>
Une fois le plugin chargé, il est possible de « binder », autrement dit de lier un élément à l’évènement « inview » pour effectuer des actions.
$('.element').bind('inview',function(event, isInView, visiblePartX, visiblePartY){
// le code ici (ça va venir)
});
La fonction accepte plusieurs variables qui vont nous permettre d’exécuter les choses au bon moment.
Le deuxième paramètre (et variable) isInView
retourne true
ou false
en fonction de si l’élément est visible ou non (peu importe quelle partie est visible). visiblePartX
, la troisième variable détecte quelle partie latérale de l’élément est visible (sur l’axe X donc), les valeurs retournées possibles sont left
, right
et both
.
La dernière est visiblePartY
et détecte quelle partie en hauteur de l’élément est visible (sur l’axe Y donc), les valeurs retournées possibles sont top
, bottom
et both
.
Nous allons concevoir une bête démonstration pour comprendre les bases.
Définir les parties visibles d’un élément
Nous allons essayer d’afficher un contenu textuel qui nous dit quelle partie est visible de deux éléments d’une page HTML.
Commencez par copier/coller ce code HTML (rien de compliqué).
<div id="first-part">
<h2>This is the first part</h2>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
<span class="info"></span>
</div>
<div id="second-part">
<h2>This is the second part</h2>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
</div>
<div id="third-part">
<h2>This is the third part</h2>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
</div>
<div id="last-part">
<h2>This is the last part</h2>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
<span class="info"></span>
</div>
N’hésitez pas à mettre plus de contenu pour prendre un peu de hauteur dans votre document.
Je vous fourni également ce CSS pour que l’on ait à peu près le même document de test :
html {
width: 750px;
margin: 0 auto;
padding: 2em 0;
font-size: 62.5%;
line-height: 1.55em;
background: #f2f2f2;
color: #555;
font-family: Helvetica, Arial, Verdana, sans-serif;
}
body {
font-size: 1.4em;
line-height: 1.55em;
}
div {
margin: 4em 0;
position:relative;
}
.info {
position: absolute;
right: 0;
top:0;
padding: 15px;
border-radius: 8px;
background: #ddd;
border: 1px solid #fff;
color: #666;
font-weight:bold;
font-size: 16px;
box-shadow: 2px 2px 3px rgba(0,0,0,0.4);
}
L’élément .info
va nous servir à afficher du texte.
Reprenons sur du JS, ce JavaScript est à placer après l’appel à la bibliothèque jQuery et son plugin, bien entendu 😉
Nous allons analyser avec notre code JS quelles sont les zones visibles sur notre première division et sur la dernière division de notre document.
$(document).ready(function(){
$('.element').bind('inview', function(event, isInView, visiblePartX, visiblePartY) {
if (isInView) {
// l'élément est visible
if (visiblePartY == 'top') {
// Le haut de l'élément est visible
$(this).find('.info').text('Only top is visible');
}
else if (visiblePartY == 'bottom') {
// Le bas de l'élément est visible
$(this).find('.info').text('Only bottom is visible');
}
else {
// Les deux parties sont visibles (tout l'élément)
$(this).find('.info').text('Whole part is visible');
}
}
else {
// l'élément n'est pas visible
// on fait quoi maintenant ?
}
});
});
Ici le code est vraiment basique, nous ne faisons qu’ajouter du texte dans un élément span
porteur de la classe info
en fonction de la zone visible d’un élément.
Voici ce que vous devriez obtenir :
Voir la démonstration
Amusez-vous à faire défiler doucement la page pour voir ce qui s’affiche dans les blocs d’informations en haut et bas de la page.
Avec les quelques commentaires du code jQuery vous devriez maintenant avoir compris le fonctionnement du plugin. À vous d’envisager une suite ! :p (Lazy Load, chargement Ajax, infinite scroll, etc.)
Des exemples plus complexes sont donnés par l’auteur de ce plugin sur GitHub.
Plugin sur GitHub
Amusez-vous bien !
Ah tiens je cherchais justement à afficher un bouton qui fuit / apparait en fonction du scroll dans la page page mais j’avais pas encore pris le temps de chercher, c’est cool le service à domicile.
Il y a également la solution utilisée sur ce blog présentée sur le tutoriel suivant : http://www.creativejuiz.fr/blog/tutoriels/realiser-un-lien-top-qui-apparait-au-scroll-de-la-page-avec-jquery
L’une ou l’autre des solutions peut peut-être répondre à ton problème ^^
Enjoy !
Très sympa, il y a aussi le système de waypoint en jquery (http://imakewebthings.com/jquery-waypoints/), mais je trouve ce petit plugin eaucoup plus complet.
Merci !
Très sympa ce Waypoints, merci pour le partage Antoine 🙂
Salut,
j’ai un petit souci que je ne constate pas dans ton exemple, dès que j’actualise la page au niveau d’un élément que je dois détecter rien ne se passe.
Je dois scroller un peu pour que cela fasse effet.
Dans mon cas j’ajoute une class pour faire une petite animation dès que cet élément est dans la vue. Mais si je ne scroll pas, il ne se passe rien.
As-tu vu ce cas dans tes tests ?
Merci
Hello,
Je ne sais pas trop quoi te répondre. J’ai mis en place le script et ça semblait fonctionnait au premier chargement.
Il faudrait que je vois ton code pour t’apporter plus de précision 🙂
Bonne journée.
Merci de me répondre sur ce sujet qui date de 2012 ^^
voici mon code du inView :
$(projet).bind(‘inview’, function(event, isInView) {
if(isInView) { animElement(projet,’flipInX’,’200′);
}else {
}
});
La fonction que je lance :
function animElement(selector,animation,time){
$(selector).each(function(i){
var element = $(this);
setTimeout(function() {
element.addClass(‘animated ‘+animation);
}, time*i);
});
}
La bind fonctionne bien mais uniquement quand je scroll. Si j’actualise en plein milieu d’un élément et que je ne bouge pas, il ne se passe rien.
Merci pour l’article ! C’est exactement le script qu’il me fallait !