11521 sujets

JavaScript, DOM et API Web HTML5

Bonjour,
J'espère que vous m'excuserez d'aborder cette question sans doute maintes fois traitée.
Je souhaite créer une page web classique (header, nav, aside, article, footer), dont le barre de navigation <nav> soit toujours visible, c'est-à-dire qu'elle se fixe en haut de la page dès que le scroll vertical risque de la faire disparaître.
J'ai parcouru le web à la recherche d'une solution simple, et n'ai rien trouvé de satisfaisant, sauf dans un topic du forum Alsacréations, Fixer un menu après scroll, où la solution proposée par Zelalsan, une autre façon de faire, m'a séduit par son apparente simplicité, et un comportement de la page exactement tel que je l'attendais !
Hélas, je ne réussis pas à la faire fonctionner (je ne maîtrise pas vraiment JavaScript), et serais heureux que vous m'éclairiez.
Pour présenter la question de façon concise, j'ai intégré la feuille de style et le script dans le code HTML. Je précise que je ne souhaite pas que l'on me présente une autre solution (sauf si, pour fournir le même résultat, elle est encore plus concise), mais qu'on m'explique comment faire fonctionner celle-ci... Je vous en remercie par avance. Smiley smile

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>MenuFixe</title>
<!--
<link rel="stylesheet" href="MenuFixe.css"/>
<script src="MenuFixe.js"></script>
-->
<style>
html, body {height:100%;margin:0;}
#GrandeIntro {height:100%;background:url(MenuFixe.jpg) no-repeat;background-size:cover;}
#siteWrapper {margin-top:-80px;}
#siteWrapper header {height:80px;background:#000;}
#siteWrapper header.fixed {position:fixed;width:100%;top:0;left:0;}
#content {padding:60px 0;background:#0c9;}
#siteWrapper header.fixed+#content {margin-top:80px;}
#content div {width:80%;height:1500px;margin:auto;border:solid;}
</style>
<script>
var header = document.querySelector("#siteWrapper header");
function scrolled(){
	var windowHeight = document.body.clientHeight,
		currentScroll = document.body.scrollTop || document.documentElement.scrollTop;
	header.className = (currentScroll >= windowHeight - header.offsetHeight) ? "fixed" : "";
}
addEventListener("scroll", scrolled, false);
</script>
</head>
<body>
<div id="GrandeIntro"></div>
<div id="siteWrapper">
  <header>
    <div id="headerTop"></div>
    <div id="Grandenavigation">
      <nav>
        <ul><li>Choix 1</li><li>Choix 2</li></ul>
      </nav>
    </div>
  </header>
  <section id="content">
    <div></div>
  </section>
</div>
</body>
</html>

Modifié par dylav (14 Dec 2016 - 23:59)
Bonjour.

Si vous mettez la partie Javascript juste avant la balise fermante de body, il n'y a apparemment plus de problèmes... C'est ce que je fais toujours. La partie HTML est ainsi bien chargée avant que des modifications soient susceptibles d'être faites par la suite.

Smiley smile
Bonjour Zelana, et merci pour votre réponse.

Je viens de tester votre suggestion, et ai pu constater que cela fonctionne.
Je suis néanmoins un peu choqué, sémantiquement parlant. En effet, j'ai toujours cru indispensable de positionner les scripts dans le <head> (bien qu'ayant plusieurs fois aperçu des scripts JavaScript un peu partout dans le <body>, mais je considérais alors que ces pages étaient mal rédigées). Toutefois, je ne demande qu'à être détrompé...

Quoi qu'il en soit, merci encore pour votre solution. Smiley smile
Cependant, avant de clore ce sujet, je souhaite attendre encore un peu dans l'espoir d'avoir une réponse de principe sur le séquencement HTML / JavaScript.
dylav a écrit :
Bonjour Zelana, et merci pour votre réponse.


Je suis néanmoins un peu choqué, sémantiquement parlant. En effet, j'ai toujours cru indispensable de positionner les scripts dans le &lt;head&gt;


Pas forcément.... il y a des cas où c'est préférable de les mettre en fin de document juste avant le </body>

Sinon, pour les menus fixes (et responsive), tu as des solutions simples avec bootstrap....
Administrateur
dylav a écrit :
Toutefois, je ne demande qu'à être détrompé...

Bonjour,

Je confirme qu'il est préférable de placer ses éléments scripts le plus bas possible dans le DOM. (Google préconise même de les placer après </html> mais ce ne sera plus valide W3C)

Un peu d'explication : http://www.alsacreations.com/astuce/lire/80-comment-intgrer-du-code-javascript-dans-une-page.html

Sinon, il existe également les très utiles attributs defer et async : http://www.alsacreations.com/astuce/lire/1562-script-attribut-async-defer.html

Bonne soirée Smiley smile
Modifié par Raphael (14 Dec 2016 - 16:51)
Merci à vous deux pour la confirmation de la position des scripts JavaScript en fin de <body>.
Merci également pour le lien d'optimisation (attributs async & defer, que je vais garder dans un coin de ma tête).
Je crois que la question est entièrement résolue !

P.S.: je ne trouve plus la case à cocher [Résolu]... Smiley decu
Modifié par dylav (14 Dec 2016 - 18:08)
Il y a certains cas (librairies Modernizr je crois, par exemple) où il faut toutefois placer le chargement du script en haut car cette librairie fabrique des classes css pour les éléments du D.O.M. et elle créé aussi des fonctions javascript pour tester les fonctionnalités du navigateur.
dylav a écrit :

P.S.: je ne trouve plus la case à cocher [Résolu]... Smiley decu

Je crois pas qu'elle existe mais en principe tu peux éditer la première intervention de ton post et modifier le titre en lui rajoutant [résolu] au début.