Existe-t-il un moyen de vérifier si un élément est visible en JS pur (pas de jQuery)?
Ainsi, par exemple, dans cette page: Performance Bikes , si vous survolez Deals (dans le menu supérieur), une fenêtre d'offres apparaît, mais au début, elle n'était pas affichée. C'est dans le HTML mais ce n'est pas visible.
Donc, étant donné un élément DOM, comment puis-je vérifier s'il est visible ou non? J'ai essayé:
window.getComputedStyle(my_element)['display']);
mais cela ne semble pas fonctionner. Je me demande quels attributs dois-je vérifier. Cela me vient à l'esprit:
display !== 'none'
visibility !== 'hidden'
Y en a-t-il d'autres qui pourraient me manquer?
javascript
dom
Hommer Smith
la source
la source
document.getElementById('snDealsPanel').style.visibility
Réponses:
Selon cette documentation MDN , la
offsetParent
propriété d' un élément sera renvoyéenull
chaque fois que lui, ou l'un de ses parents, est masqué via la propriété de style d'affichage. Assurez-vous simplement que l'élément n'est pas fixe. Un script pour vérifier cela, si vous n'avez aucunposition: fixed;
élément sur votre page, pourrait ressembler à:D'autre part, si vous n'avez la position des éléments fixes qui pourraient se coincer dans cette recherche, vous malheureusement (et lentement) doivent utiliser . Dans ce cas, la fonction pourrait être:
window.getComputedStyle()
L'option # 2 est probablement un peu plus simple car elle représente plus de cas marginaux, mais je parie que c'est beaucoup plus lent aussi, donc si vous devez répéter cette opération plusieurs fois, mieux vaut probablement l'éviter.
la source
el.offsetParent
ne fonctionnait pas sur IE9 pour les éléments non fixes. Ou du moins, semble-t-il. (OK pour IE11, cependant.) Il en va de mêmegetComputedStyle
après tout.getComputedStyle
ne fonctionne pas correctement: plnkr.co/edit/6CSCA2fe4Gqt4jCBP2wu?p=preview Cependant, il en va de mêmeoffsetParent
- peut-être qu'une combinaison des deux devrait être utilisée?Toutes les autres solutions se sont cassées pour une situation pour moi ..
Voir la réponse gagnante se briser à:
http://plnkr.co/edit/6CSCA2fe4Gqt4jCBP2wu?p=preview
Finalement, j'ai décidé que la meilleure solution était
$(elem).is(':visible')
- cependant, ce n'est pas du pur javascript. c'est jquery ..alors j'ai jeté un œil à leur source et j'ai trouvé ce que je voulais
Ceci est la source: https://github.com/jquery/jquery/blob/master/src/css/hiddenVisibleSelectors.js
la source
true
pour un élément avecvisibility:hidden
visibility:hidden
n'afficher plus de contenu, mais prend toujours la largeur et la hauteur de l'élément!Si l'utilisateur est intéressé par le visible:
Testé sur (en utilisant la terminologie mocha ):
la source
scrollIntoView
droit?! C'est assez cher. Existe-t-il un autre moyen intelligent?Cela peut aider: Masquer l'élément en le positionnant à l'extrême gauche, puis vérifier la propriété offsetLeft. Si vous souhaitez utiliser jQuery, vous pouvez simplement vérifier le sélecteur : visible et obtenir l'état de visibilité de l'élément.
HTML:
CSS:
javaScript:
jQuery:
jsFiddle
la source
Utilisez le même code que jQuery:
Donc, dans une fonction:
Fonctionne comme un charme dans mon Win / IE10, Linux / Firefox.45, Linux / Chrome.52 ...
Un grand merci à jQuery sans jQuery!
la source
e.offsetWidth
c'est un entier,!e.offsetWidth
retournerafalse
sie.offsetWidth
est supérieur à zéro (l'élément est visible). Donc, ajouter un autre!
comme dans!!e.offsetWidth
retourneratrue
sie.offsetWidth
est supérieur à zéro. C'est un raccourci pourreturn e.offsetWidth > 0 ? true : false
ou évidemmentreturn e.offsetWidth > 0
.Combiner quelques réponses ci-dessus:
Comme l'a dit AlexZ, cela peut être plus lent que certaines de vos autres options si vous savez plus précisément ce que vous recherchez, mais cela devrait comprendre toutes les principales façons dont les éléments sont masqués.
Mais cela dépend aussi de ce qui compte pour vous. Par exemple, la hauteur d'une div peut être définie sur 0px mais le contenu reste visible en fonction des propriétés de débordement. Ou le contenu d'un div pourrait être de la même couleur que l'arrière-plan afin qu'il ne soit pas visible pour les utilisateurs mais toujours rendu sur la page. Ou un div pourrait être déplacé hors de l'écran ou caché derrière d'autres div, ou son contenu pourrait être non visible mais la bordure toujours visible. Dans une certaine mesure, «visible» est un terme subjectif.
la source
display:none
à cela serait formidable. Une bonne solution de travail!J'ai une solution plus performante par rapport à la solution getComputedStyle () d'AlexZ quand on a des éléments 'fixes' de position, si on veut ignorer certains cas de bord (vérifier les commentaires):
Note complémentaire: à strictement parler, la "visibilité" doit être définie en premier. Dans mon cas, je considère un élément visible tant que je peux exécuter toutes les méthodes / propriétés DOM dessus sans problème (même si l'opacité est 0 ou la propriété de visibilité CSS est «cachée», etc.).
la source
Si l'élément est régulièrement visible (display: block et visibillity: visible), mais qu'un conteneur parent est masqué, nous pouvons utiliser clientWidth et clientHeight pour vérifier cela.
Plunker (cliquez ici)
la source
ele.style.visibility !== 'hidden'
est redondant ici. Dans ce cas, clientWidth et clientHeight seront 0.Si nous ne faisons que collecter des méthodes de base pour détecter la visibilité, je ne vais pas oublier:
Et quant à la façon d'obtenir des attributs:
Donc, dans votre exemple:
Mais quoi? Ça ne marche pas ici. Regardez de plus près et vous constaterez que la visibilité est mise à jour non pas en tant qu'attribut sur l'élément, mais en utilisant la
style
propriété. C'est l'un des nombreux problèmes que vous rencontrez lorsque vous essayez de faire ce que vous faites. Entre autres: vous ne pouvez pas garantir qu'il y a réellement quelque chose à voir dans un élément, simplement parce que sa visibilité, son affichage et son opacité ont tous les bonnes valeurs. Il peut encore manquer de contenu ou manquer de hauteur et de largeur. Un autre objet pourrait l'obscurcir. Pour plus de détails, une recherche rapide sur Google révèle ce , et inclut même une bibliothèque pour essayer de résoudre le problème. (YMMV)Consultez les éléments suivants, qui sont des doublons possibles de cette question, avec d'excellentes réponses, y compris quelques aperçus du puissant John Resig. Cependant, votre cas d'utilisation spécifique est légèrement différent de celui standard, donc je m'abstiendrai de signaler:
(MODIFICATION: OP DIT QU'IL PERMET DE RETIRER DES PAGES, PAS LES CRÉER, DONC CI-DESSOUS N'EST PAS APPLICABLE) Une meilleure option? Liez la visibilité des éléments aux propriétés du modèle et toujours rendre la visibilité dépendante de ce modèle, tout comme Angular le fait avec ng-show. Vous pouvez le faire en utilisant n'importe quel outil que vous voulez: JS angulaire, simple, peu importe. Mieux encore, vous pouvez changer l'implémentation DOM au fil du temps, mais vous pourrez toujours lire l'état du modèle, au lieu du DOM. Lire votre vérité depuis le DOM est mauvais. Et lent. Il est préférable de vérifier le modèle et de faire confiance à votre implémentation pour vous assurer que l'état DOM reflète le modèle. (Et utilisez des tests automatisés pour confirmer cette hypothèse.)
la source
La réponse acceptée n'a pas fonctionné pour moi. Réponse de l'an 2020 :
1) La méthode (elem.offsetParent! == null) fonctionne très bien dans Firefox mais pas dans Chrome. Pour Chrome "position: fixed;" fera également offsetParent retourner "null" même l'élément s'il est visible dans la page.
Démo:
vous pouvez voir ce type de mégatest https://stackoverflow.com/a/11639664/4481831 (exécutez-le avec plusieurs navigateurs pour voir les différences).
2) Le (getComputedStyle (elem) .display! == 'none') ne fonctionne pas car l'élément peut être invisible car l'une des propriétés d'affichage des parents est définie sur none, getComputedStyle ne l'attrapera pas.
Démo:
3) Le (elem.clientHeight! == 0) . Cette méthode n'est pas influencée par la position fixe et vérifie également si les parents d'élément ne sont pas visibles. Mais il a des problèmes avec des éléments simples qui n'ont pas de disposition CSS, voir plus ici
Démo:
4) Les (elem.getClientRects (). Length! == 0) qui semblent dépasser les problèmes des 3 méthodes précédentes. Cependant, il a des problèmes avec les éléments qui utilisent des astuces CSS (autres que "display: none") pour se cacher dans la page.
CONCLUSION: Donc, ce que je vous ai montré, c'est qu'aucune méthode n'est parfaite. Pour effectuer une vérification de visibilité correcte, vous devez utiliser une combinaison des 3 dernières méthodes.
la source
Juste pour la référence, il convient de noter que cela
getBoundingClientRect()
peut fonctionner dans certains cas.Par exemple, une simple vérification que l'élément est masqué à l'aide
display: none
pourrait ressembler à ceci:Ceci est également pratique car il couvre également la largeur zéro, la hauteur zéro et les
position: fixed
étuis. Cependant, il ne doit pas signaler les éléments cachés avecopacity: 0
ouvisibility: hidden
(mais aucun ne le feraitoffsetParent
).la source
var isVisible = el => (r => r.width && r.height)(el.getBoundingClientRect());
. Ensuite , je peux filtrer les tableaux d'éléments de la façon suivante:$$(sel).filter(isVisible)
.Donc, ce que j'ai trouvé est la méthode la plus pratique:
Ceci est construit sur ces faits:
display: none
élément (même imbriqué) n'a ni largeur ni hauteur.visiblity
esthidden
même pour les éléments imbriqués.Donc pas besoin de tester
offsetParent
ou de boucler dans l'arborescence DOM pour tester quel parent avisibility: hidden
. Cela devrait fonctionner même dans IE 9.Vous pourriez discuter si
opacity: 0
et les éléments effondrés (a une largeur mais pas de hauteur - ou vice versa) ne sont pas vraiment visibles non plus. Mais là encore, ils ne sont pas pour autant cachés.la source
Un petit ajout à la réponse d'Ohad Navon.
Si le centre de l'élément appartient à un autre élément, nous ne le trouverons pas.
Donc, pour vous assurer que l'un des points de l'élément est visible
la source
Améliorer la réponse de @Guy Messika ci - dessus , casser et retourner faux si le point central 'X est <0 est faux car l'élément de droite peut entrer dans la vue. voici une solution:
la source
Le code jQuery de http://code.jquery.com/jquery-1.11.1.js a un paramètre isHidden
Il semble donc qu'il y ait une vérification supplémentaire liée au document du propriétaire
Je me demande si cela attrape vraiment les cas suivants:
la source
Voici le code que j'ai écrit pour trouver le seul visible parmi quelques éléments similaires et retourner la valeur de son attribut "class" sans jQuery:
la source
C'est ce que j'ai fait:
HTML et CSS: rendu l'élément caché par défaut
JavaScript: Ajout d'un code pour vérifier si la visibilité est masquée ou non:
la source
C'est un moyen de le déterminer pour toutes les propriétés CSS, y compris la visibilité:
html:
css:
javascript:
Il fonctionne pour n'importe quelle propriété CSS et est très polyvalent et fiable.
la source