Quel est le moyen le plus rapide de vérifier si un élément possède des barres de défilement?
Une chose bien sûr est de vérifier si l'élément est plus grand que sa fenêtre, ce qui peut facilement être fait en vérifiant ces deux valeurs:
el.scrollHeight > el.offsetHeight || el.scrollWidth > el.offsetWidth
mais cela ne veut pas dire qu'il a aussi des barres de défilement (donc il peut être fait défiler par les humains).
Question
Comment puis-je vérifier les barres de défilement dans un 1 navigateur croix et 2 javascript seulement (comme dans aucune jQuery ) façon?
Javascript uniquement, car j'ai besoin de la plus petite surcharge possible, car j'aimerais écrire un filtre de sélection jQuery très rapide
// check for specific scrollbars
$(":scrollable(x/y/both)")
// check for ANY scrollbar
$(":scrollable")
Je suppose que je devrais vérifier les overflow
paramètres de style, mais comment puis-je faire cela dans un navigateur croisé?
Modification supplémentaire
Pas seulement les overflow
paramètres de style. Vérifier si un élément a une barre de défilement n'est pas aussi simple qu'il n'y paraît. La première formule que j'ai écrite ci-dessus fonctionne bien lorsque l'élément n'a pas de bordure, mais quand c'est le cas (en particulier lorsque la bordure a une largeur considérable), la offset
dimension peut être plus grande que la scroll
dimension, mais l'élément peut toujours faire défiler. Nous devons en fait soustraire les bordures de la offset
dimension pour obtenir la fenêtre déroulante réelle de l'élément et la comparer à la scroll
dimension.
Pour référence future
:scrollable
Le filtre de sélection jQuery est inclus dans mon .scrollintoview()
plugin jQuery. Le code complet peut être trouvé dans mon article de blog si quelqu'un en a besoin. Même s'il n'a pas fourni la solution réelle, le code de Soumya m'a considérablement aidé à résoudre le problème. Cela m'a orienté dans la bonne direction.
la source
overflow:hidden
posé? Il y aurait un excès de contenu, mais ce n'est toujours pas défilable. Le problème n'est de loin pas aussi simple qu'il y paraît.div.scrollHeight>div.clientHeight && !(div.style.overflow && div.style.overflow == 'hidden')
)?Essayer:
Pour la barre de défilement verticale
Pour la barre de défilement horizontale
Je sais que cela fonctionne au moins pour IE8 et Firefox 3.6+.
la source
overflow:hidden
et il ne serait plus défilable.overflow:hidden
... c'est toujours la bonne réponse à mon avis, car c'est la plus simple.Cela peut sembler (ou être) un peu hackish, mais vous pouvez tester le
scrollTop
scrollLeft
propriétés et .S'ils sont supérieurs à 0, vous savez qu'il existe des barres de défilement. S'ils sont 0, définissez-les sur 1 et testez-les à nouveau pour voir si vous obtenez un résultat de 1. Puis remettez-les à 0.
Exemple: http://jsfiddle.net/MxpR6/1/
Je crois qu'il existe une propriété différente pour IE, donc je vais mettre à jour dans une minute avec cela.EDIT: Apparaît comme si IE peut prendre en charge cette propriété. (Je ne peux pas tester IE pour le moment.)
http://msdn.microsoft.com/en-us/library/ms534618(VS.85).aspx
la source
offsetHeight
etclientHeight
. Ce dernier est toujours plus petit par la taille de la barre de défilement lorsque la barre de défilement est présente.overflow:scroll
, vous voulez qu'il soit signalé comme défilant, que les barres de défilement soient activées ou non. Bien sûr, ma solution pourrait avoir des problèmes s'il y a un événement onscroll attaché.Voici encore une autre solution:
Comme quelques personnes l'ont souligné, il ne suffit pas de comparer offsetHeight et scrollHeight car ils diffèrent sur les éléments avec le débordement caché, etc., qui n'ont toujours pas de barres de défilement. Donc, ici, je vérifie également si le débordement est scroll ou automatique sur les styles calculés pour l'élément:
la source
overflow*
c'est le cas,scroll
il y aura toujours une barre de défilement, donc je pense que vous voulezvertical: overflowY === 'scroll' || overflowY === 'auto' && node.scrollHeight > node.clientHeight
, etc. (c'est-à-dire supprimer les crochets pour quescroll*
vsclient*
ne soit testé que lorsqueoverflow*
c'est le casauto
). Sinon, cela semble être la solution la plus correcte.Je suis peut-être un peu en retard à la fête, mais ...
Je crois que vous pouvez détecter les barres de défilement avec e.offsetWidth contre e.clientWidth. La largeur du décalage comprend les bordures et les barres de défilement, le remplissage et la largeur. La largeur du client comprend le rembourrage et la largeur. S'il te plait regarde:
https://developer.mozilla.org/en/DOM/element.offsetWidth (deuxième image) https://developer.mozilla.org/en/DOM/element.clientWidth (deuxième image)
Vous devez vérifier:
Faites de même pour la verticale (offset / clientHeight).
IE7 signale un clientHeight de 0 pour certains éléments (je n'ai pas vérifié pourquoi), vous avez donc toujours besoin du premier contrôle de dépassement de capacité.
J'espère que cela t'aides!
la source
Il y a plusieurs problèmes en cas de vérification de l'existence de barres de défilement, dont l'un est que sous mac, vous n'avez pas de barre de défilement visible, donc toutes les solutions ci-dessus ne vous donneront pas une réponse précise.
Donc, comme le rendu du navigateur n'est pas très fréquent, vous pouvez vérifier le défilement avec changement de défilement, puis le remettre en place:
la source
Juste déconner ici car aucune des solutions ci-dessus n'a fonctionné pour moi (jusqu'à présent). J'ai trouvé un certain succès en comparant la hauteur de défilement d'une division à son décalage
Cela semble me donner une comparaison précise ... jusqu'à présent. Est-ce que quelqu'un sait si cela est légitime?
la source
Pour IE11 (Internet Explorer 11), j'ai dû changer la logique pour:
C'est parce que IE signale scrollHeight comme 1 plus grand que clientHeight quand aucune barre de défilement n'est présente mais environ 9 plus grand quand une barre de défilement est présente
la source
Si vous avez besoin de savoir s'il existe une barre de défilement pour toute la page Web et avec une prise en charge complète du navigateur, vous pouvez utiliser ceci:
Il est important d'utiliser
window.innerHeight
au lieu dedocument.body.clientHeight
car dans certains navigateurs mobiles, clientHeight n'obtiendra pas la taille de la barre d'adresse, mais scrollHeight le fera, vous obtenez donc de faux calculs.la source
aucune de ces réponses n'est correcte. vous devez utiliser ceci:
la source
Ajoutez un élément 100% large à l'intérieur. Définissez ensuite le débordement sur masqué. Si le style calculé de l'élément (à partir de jQ) change, le parent avait une barre de défilement.
EDIT: Il semble que vous vouliez une méthode multi-navigateurs comme getComputedStyle . Essayer:
la source
$(el).css("overflow/overflowX/overflowY")
et voir s'il est réglé sur automatique ou sur le défilement . Mais j'aimerais éviter d'utiliser jQuery.computedStyle = el.currentStyle || document.defaultView.getComputedStyle(el, null);