Je ne sais pas dans quelle mesure cela est pris en charge par les navigateurs plus anciens ou moins modernes, mais j'utilise quelque chose comme ceci (sans avoir besoin de bibliothèques) :
function visible(element) {
if (element.offsetWidth === 0 || element.offsetHeight === 0) return false;
var height = document.documentElement.clientHeight,
rects = element.getClientRects(),
on_top = function(r) {
var x = (r.left + r.right)/2, y = (r.top + r.bottom)/2;
return document.elementFromPoint(x, y) === element;
};
for (var i = 0, l = rects.length; i < l; i++) {
var r = rects[i],
in_viewport = r.top > 0 ? r.top <= height : (r.bottom > 0 && r.bottom <= height);
if (in_viewport && on_top(r)) return true;
}
return false;
}
Il vérifie que l'élément a une surface > 0 et ensuite il vérifie si une partie de l'élément est dans le viewport et qu'il n'est pas caché "sous" un autre élément (en fait je ne vérifie que sur un seul point au centre de l'élément, donc ce n'est pas assuré à 100% -- mais vous pourriez juste modifier le script pour itérer sur tous les points de l'élément, si vous en avez vraiment besoin...).
Mise à jour
Modifié la fonction on_top qui vérifie chaque pixel :
on_top = function(r) {
for (var x = Math.floor(r.left), x_max = Math.ceil(r.right); x <= x_max; x++)
for (var y = Math.floor(r.top), y_max = Math.ceil(r.bottom); y <= y_max; y++) {
if (document.elementFromPoint(x, y) === element) return true;
}
return false;
};
Je ne sais pas pour les performances :)
0 votes
Je ne voudrais pas vous rediriger vers jQuery (comme on le fait souvent), mais cette discussion sur le moment où les éléments sont vraiment visibles est très perspicace. Et comme jQuery 1.3.2 c'est plus de problème .
0 votes
Cela résout la première et la troisième partie, mais qu'en est-il de la deuxième ? Comment savoir s'il se trouve sous un autre élément ? De plus, pour des raisons techniques, je ne peux pas utiliser jQuery, ni aucun autre include, bien que Prototype soit déjà disponible.
0 votes
Pouvez-vous nous parler des problèmes techniques qui vous empêchent d'inclure les bibliothèques ? J'ai lu le même problème dans plusieurs cas, mais je ne vois pas de scénario pertinent (dans les documents XHTML, par exemple).
0 votes
La deuxième exigence soulève de nouveaux problèmes : qu'en est-il des éléments qui ne couvrent que partiellement les autres ? Ou qui en couvrent entièrement d'autres, mais qui, par exemple, ont une image de fond transparente qui permet de voir les éléments sous-jacents. Doit-on considérer ces éléments comme visibles ou non ?
0 votes
@Itay Le code s'exécute à l'intérieur d'un test Selenium. @Török Pour plus de simplicité (c'est-à-dire que cela ne se produit pas dans ce cas), vous pouvez appeler les deux comme non visibles.
0 votes
Qu'en est-il du nouveau HTML5
hidden
attribut ? (il est déjà pris en charge par les navigateurs modernes).<div hidden>...</div>
0 votes
Je propose une solution concernant le
overflow:hidden
situation ici : stackoverflow.com/questions/31588220/0 votes
Je me sens toujours mal de voter pour fermer une ancienne question en tant que doublon d'une plus récente. Malheureusement, personne n'a fermé la question la plus récente à ce moment-là, et celle-ci a depuis obtenu un peu plus de vues et une réponse plus populaire.
0 votes
La réponse acceptée à la question "duplicate" repose (uniquement) sur l'attribut d'affichage, que cette question rejette en tant que partiel solution. En outre, il existe une réponse appropriée ici (celle qui a été acceptée).
0 votes
@JamesDonnelly Envisagez de rouvrir la question. La réponse acceptée de la nouvelle question ne résoudra pas le problème de cette question. Il s'agit de deux questions différentes. (Voir mon autre commentaire précédent.) Merci !