J'ai une très grande div
glissable dans ma fenêtre. Cette div
a une fenêtre plus petite.
<div id="draggable-area" style="width:500px;height:500px;overflow:hidden">
<div id="draggable" style="width:5000px;height:5000px">
<ul>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
....
</ul>
</div>
</div>
Comment savoir si l'élément li
est visible dans la fenêtre de l'utilisateur (je veux dire vraiment visible, pas dans la zone de débordement)?
regardez ce plugin
Il vous donne la possibilité de faire les sélecteurs suivants
$(":in-viewport")
$(":below-the-fold")
$(":above-the-top")
$(":left-of-screen")
$(":right-of-screen")
Pour vérifier si un élément est dans la fenêtre actuelle:
function elementInViewport(el) {
var top = el.offsetTop;
var left = el.offsetLeft;
var width = el.offsetWidth;
var height = el.offsetHeight;
while(el.offsetParent) {
el = el.offsetParent;
top += el.offsetTop;
left += el.offsetLeft;
}
return (
top >= window.pageYOffset &&
left >= window.pageXOffset &&
(top + height) <= (window.pageYOffset + window.innerHeight) &&
(left + width) <= (window.pageXOffset + window.innerWidth)
);
}
( La source )
Pour une méthode plus robuste, je recommanderais Viewport Selectors , qui vous permet simplement de faire:
$("#elem:in-viewport")
https://github.com/sakabako/scrollMonitor
var scrollMonitor = require("./scrollMonitor"); // if you're not using require, you can use the scrollMonitor global.
var myElement = document.getElementById("itemToWatch");
var elementWatcher = scrollMonitor.create( myElement );
elementWatcher.enterViewport(function() {
console.log( 'I have entered the viewport' );
});
elementWatcher.exitViewport(function() {
console.log( 'I have left the viewport' );
});
elementWatcher.isInViewport - true if any part of the element is visible, false if not.
elementWatcher.isFullyInViewport - true if the entire element is visible [1].
elementWatcher.isAboveViewport - true if any part of the element is above the viewport.
elementWatcher.isBelowViewport - true if any part of the element is below the viewport.
J'utilise (vérifie si un élément est au moins partiellement dans la vue) le code suivant:
var winSize;
function getWindowSize() {
var winW,WinH = 0;
if (document.body && document.body.offsetWidth) {
winW = document.body.offsetWidth;
winH = document.body.offsetHeight;
}
if (document.compatMode == 'CSS1Compat' &&
document.documentElement &&
document.documentElement.offsetWidth) {
winW = document.documentElement.offsetWidth;
winH = document.documentElement.offsetHeight;
}
if (window.innerWidth && window.innerHeight) {
winW = window.innerWidth;
winH = window.innerHeight;
}
return {w:winW, h:winH};
}
winSize = getWindowSize();
function inView(element) {
var box = element.getBoundingClientRect();
if ((box.bottom < 0) || (box.top > winSize.h)){
return false;
}
return true;
}
Ma solution utilise l'exemple de code donné, et elle vous montrera une idée générale de la façon de déterminer si l'élément li est visible. Découvrez le jsFiddle qui contient le code de votre question.
La méthode jQuery .offset () nous permet de récupérer la position actuelle d’un élément par rapport au document. Si vous cliquez sur un élément li à l'intérieur du glissable, votre décalage par rapport au sommet sera compris entre 0 et 500 et le décalage par rapport à gauche devrait être compris entre 0 et 500. Si vous appelez la fonction de décalage d'un élément non visible, le décalage sera inférieur à 0 ou supérieur à 500 par rapport au décalage supérieur ou gauche.
Si ce n'est pas une tâche ardue, j'aime toujours coder ce dont j'ai besoin depuis 'scrath', cela me donne plus de flexibilité pour modifier ou déboguer. C'est pourquoi je vous recommanderais d'envisager d'utiliser la fonction offset de jQuery plutôt que d'utiliser un plugin. Si ce que vous essayez d'accomplir est assez simple, utiliser votre propre fonction vous donnera une bibliothèque de moins à charger.