11485 sujets

JavaScript, DOM et API Web HTML5

Pages :
Bonjour,
Dans une page xhtml, j'ai un ascenseur vertical ou pas selon la résolution de l'écran.
L'ascenseur est défini par :
<div style="position: absolute; top: 0; height: 100%; overflow: auto"/>

J'ai besoin de savoir si cet ascenseur est présent ou pas.
Pour cela je comptais utiliser les variables suivantes :
<script type="text/javascript">
            window.onload = function ()
            {alert(window.innerHeight + " " + 
document.documentElement.clientHeight + " " + 
document.documentElement.scrollHeight);

Mais ces 3 variables me donnent toujours la même valeur quelque soit la résolution : 604 par exemple.
Est-ce que j'oublie quelque chose ?
Merci pour votre aide car je galère depuis plusieurs jours maintenant.
Modifié par denisduval75 (30 Nov 2020 - 11:11)
Oups ! c'est pour 'menubar', pas pour 'scrollbar'.

L'exemple MDN pour scrollbar est :

" La propriété Window.scrollbars renvoie l'objet scrollbars, dont la visibilité peut être vérifié. "


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Divers Tests DOM</title>
</head>
<body>
    
    <p>Divers Tests DOM</p>

    <script>
        let visibleScrollbars = window.scrollbars.visible;
        alert(visibleScrollbars);
      </script>

</body>
</html>


mais je viens d essayer, donne 'true' alors qu'il n'y a pas de barre de scroll !
Modérateur
Bonjour,

1) Détecter en toutes circonstances si des scrollbars sont visibles est périlleux.

2) Quand on fait un code qui a besoin de déterminer si les scrollbars sont visibles, c'est qu'on est en train de faire n'importe quoi.

3) Le mécanisme de scrollbars dépend des navigateurs. La tendance moderne est qu'elles viennent s'afficher "par dessus" le contenu selon l'action de l'utilisateur (par exemple un movement de doigt sur un track pad ou un écran tactile) voire même qu'elles ne sont jamais affichées, alors que sur les anciens navigateurs, elles venaient s'afficher "dans" le contenu et donc diminuaient l'espace disponible pour le contenu.

Du coup :
- visuellement, les scrollbars peuvent être cachées alors qu'elles sont en fait disponibles.
- elles n'occupent pas d'espace dans l'élément où s'affiche le contenu.


4) Avec les navigateurs modernes, on peut espérer sans certains cas déterminer si des scrollbars sont "disponibles" (c'est à dire qu'il y a quelque chose à scroller, mais pas forcément que les scrollbars sont effectivement visibles : et dans ce cas elles apparaissent éventuellement, mais pas toujours selon les navigateurs, si l'utilisateur essaie de scroller). Par exemple, s'il s'agit des scrollbars pour l'ensemble du document, on peut utiliser :
function hasScrollbars()
{
    var e=document.documentElement;
    return (e.clientHeight-e.scrollHeight)!==0;
}

Mais évidemment, pour que ça puisse marcher, il faut qu'il y ait quelque chose à scroller, c'est à dire ici que le contenu du document soit plus grand que la taille de la fenêtre.

Pour tester, faire un document avec un texte assez long, mais pas trop long, et faire varier la taille de la fenêtre.

5) Min-exemple complet (le résultat est envoyé dans la console)

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<script>
function hasScrollbars()
{
	var e=document.documentElement;
    return (e.clientHeight-e.scrollHeight)!==0;
}
</script>
</head>
<body>
<h1>Scrollbars</h1>
<button onclick="console.log(hasScrollbars())">
	Scrollbars du document
</button>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing 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>
<p>Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?</p>
</body>
</html>

Amicalement,
upload/1606752555-65675-participationcontribution.png Merci parsimonhi, mais ça ne marche pas pour moi.
J'ai effectivement quelque chose à scroller (on le voit bien sur l'image), mais la méthode hasScrollbars m'affiche toujours 0 !
Je crois que j'ai la poisse Smiley fache

Voici mon code :
window.onload = function ()
            {
                document.body.addEventListener("contextmenu", noteMenuContextuel);
                
              var e=document.documentElement;
              var x=e.clientHeight-e.scrollHeight;  
              alert(x);
            };
        </script>

upload/1606752649-65675-participationcontribution.png
Modifié par denisduval75 (30 Nov 2020 - 17:10)
Modérateur
Bonjour,

Tout dépend de ton html et ton css, camarade !

S'il y a toute la page dans l'image que tu montres, on voit surtout que la scrollbar n'est pas celle du document en entier.

Amicalement,
Modérateur
Bonjour,

Exemple de code où la scrollbar est visible, mais n'est pas sur le document entier (et on voit "false" dans la console).
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<style>
div
{
	position: absolute;
	top: 0;
	height: 100%;
	overflow: auto;
}
</style>
</head>
<body>
<div>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing 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>
<p>Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?</p>
</div>
<script>
function hasScrollbars()
{
	var e=document.documentElement;
    return (e.clientHeight-e.scrollHeight)!==0;
}
window.addEventListener("load",function(){console.log(hasScrollbars());})
</script>
</body>
</html>


Et maintenant, si tu supprimes simplement le overflow: auto;, visuellement, tu as la même chose, mais la scrollbar est sur le document entier (et on voit "true" dans la console).

Amicalement,
J'ai ôté overflow: auto mais j'ai toujour 0 avec :

var e=document.documentElement;
              var x=e.clientHeight-e.scrollHeight;


Voici une image plus précise.
upload/1606758139-65675-participationcontribution2.png
Modifié par denisduval75 (30 Nov 2020 - 18:42)
Modérateur
Bonjour,

Je ne peux pas te dire autre chose que : "ça dépend de ton code html et css".

Amicalement,
Modérateur
Bonjour,

Et c'est quoi, la mauvaise raison qui te pousses à détecter la présence de scrollbars ?

Amicalement,
Modifié par parsimonhi (30 Nov 2020 - 19:44)
Bonjour,

Je dois adapter le tableau et les graphiques selon la résolution, qui doivent s'étendre sur toute la largeur disponible de la page.

La 1ère colonne du tableau étant fixe (frozen), je dois déterminer la largeur du scroll horizontal du tableau, qui varie selon la résolution et la présence ou non d'un scroll vertical.

Merci.

PS : J'utilise les framework JSF et PrimeFaces.
Modifié par denisduval75 (01 Dec 2020 - 08:01)
Modérateur
Bonjour,

denisduval75 a écrit :
La 1ère colonne du tableau étant fixe (frozen), je dois déterminer la largeur du scroll horizontal du tableau, qui varie selon la résolution et la présence ou non d'un scroll vertical.


Les barres de scroll viennent s'afficher la plupart du temps par dessus le contenu. Elle compte pour 0. Et avec les navigateurs modernes, elles sont de plus "cachées" quand on ne s'en sert pas.

Je peux me tromper pour certains navigateurs, mais il me semble que dans le cas général, la largeur du scroll horizontal est la même avec ou sans scrollbar verticale.

C'est avec quel navigateur que tu vois une barre de scroll "permanente" ?

EDIT: bon, ok, je viens de voir que sous windows, les navigateurs affichaient encore les scrollbars en permanence. Pfff ! Le truc préhistorique !

Amicalement,
Modifié par parsimonhi (01 Dec 2020 - 10:16)
En fait je n'ai pas de problème de scrollbar permanente.
Selon la résolution, la scrollbar est présente ou non.
Pas de soucis de ce coté là.

Sinon je pense résoudre mon problème en utilisant la hauteur de page comparée à la hauteur des éléments affichés. Mais là aussi j'ai un problème. Si je scrolle vers le bas de la page, je vois évidemment le dernier élément affiché, mais il est suivi de 30px environ sans rien. C'est comme si j'avais une div de 30 px après le dernier élément de la page.
C'est normal ? et si oui quelle hauteur occupe le bas de page ?

Merci.
Modérateur
Bonjour,

En bas de page, ça dépend (sauf bricoles spéciales) des paddings et des margins de tes derniers éléments, ainsi que des balises body et éventuellement html dans le css.

Amicalement,
Modifié par parsimonhi (01 Dec 2020 - 10:26)
Ultime question : pour déterminer la hauteur des éléments de la page, je dessine une div de top 0 et 727px de hauteur.
Selon la résolution, le bas de cette div s'affiche en + ou - 8px !
J'oublie quelque chose ?
Modérateur
Bonjour,

1) Tu ne devrais jamais utiliser "px" (sauf éventuellement pour les bordures, margins et paddings). Smiley cligne

2) Je n'ai rien compris à ta question.
upload/1606816726-65675-participationcontribution3.png Voici une copie d'écran. Le bas de la page occupe un espace vide.
Modifié par denisduval75 (01 Dec 2020 - 10:58)
Pages :