11549 sujets

JavaScript, DOM et API Web HTML5

Bonjour,

Je suis en train de finaliser un site où on navigue entre les pages avec des ancres dans les liens et je masque et affiche en fonction des menus cliqué.

Le truc c'est que comme je fonctionne avec des ancres, quand un contenu est trop grand il se fixe au niveau du bloc div et par conséquent le menu situé en haut de page remonte.

Je n'aime pas cet effet et j'aimerais avec l'aide du JS "remonter" ma page. J'ai essayé tout un tas de trucs, notamment la fonction jQuery scrollTop() mais rien ne bouge.

Quelqu'un aurait il une idée ? Merci.
Modifié par MagicCarpet (25 Aug 2013 - 23:50)
P'tain tes phrases veulent pas dire grand chose ><.

scrollTop devrait fonctionner normalement, mais il faut bien l'appliquer au niveau du document entier. Ta page est en ligne quelque part que je puisse regarder comment tu l'as utilisé?
:) dsl

En fait dans le forum sur les débutants, j'ai un post qui parle plus amplement des choix etc. et qui expose ce problème.
Beh attends je pensais pas l'avoir en ligne mais en fait si, ici.

Donc si tu va sur la page History, la page remonte sur la première ligne du bloc div. Donc cache le menu. J'ai essayé pleins de trucs mais je pense que le mieux et plus simple serais un scrollTop() ou équivalent.
salut,
ça ne marche pas avec scrollTop car la fonction est appliquée avant que le navigateur ne remonte ta page. Si tu appliques un setTimeout de 10 millisecondes (ou peu plus pour les vieux navigateurs), cela fonctionnera normalement.
Juste pour dire que la fonction scrollTop() n'existe qu'en JQuery car en JS c'est une propriété et non une méthode. La vraie fonction est scrollTo() avec deux arguments à passer.
À noter aussi qu'il existe une méthode pure CSS sans passer par JS, qui se base cependant sur ":target" et qui posera donc problème pour les vieux navigateurs. Le principe est de cibler avec l'ancre un élément en "display:none", adjacent à l'élément que l'on souhaite réellement ciblé et afficher ce dernier avec ":target". Comme ceci.
Zelalsan a écrit :
salut,
ça ne marche pas avec scrollTop car la fonction est appliquée avant que le navigateur ne remonte ta page. Si tu appliques un setTimeout de 10 millisecondes (ou peu plus pour les vieux navigateurs), cela fonctionnera normalement.
Juste pour dire que la fonction scrollTop() n'existe qu'en JQuery car en JS c'est une propriété et non une méthode. La vraie fonction est scrollTo() avec deux arguments à passer.
À noter aussi qu'il existe une méthode pure CSS sans passer par JS, qui se base cependant sur &quot;:target&quot; et qui posera donc problème pour les vieux navigateurs. Le principe est de cibler avec l'ancre un élément en &quot;display:none&quot;, adjacent à l'élément que l'on souhaite réellement ciblé et afficher ce dernier avec &quot;:target&quot;. Comme ceci.


Ok, deux choses :
- Est-ce que tu peux me dire où je peux trouver une bonne doc sur JS parce que j'avais essayé scrollTo() mais sans succès. Pour les mêmes raisons ?
- Ton code, que dois-je voir ? faire ? Parce que rien ne remonte au click.

Merci pour ta réponse.
Si "rien ne se passe" avec le code que j'ai donné c'est que ça fait exactement ce que tu veux faire ==> ne pas descendre la page et masquer ainsi le menu. J'ai donné ce code pour être un peu plus complet et à titre indicatif car les vieux navigateurs ne le comprendront pas en raison de ":target".

La solution JS est plus crossbrowser et il y a peut être mieux et plus propre. Je t'ai donné un exemple sans trop me casser la tête qui consiste à mettre un setTimeout pour appliquer scrollTo().

setTimeout(function(){
	window.scrollTo(0, 0);
}, 10);

Tu mets ça dans une fonction associée au clic de tes liens qui ont des ancres.
Quand tu dis qu'il faut un time out pour les vieux navigateurs, tu penses à IE6 ?
Ou plutôt IE7 et 8 ?

Je te pose cette question parce que, si c'est IE6, alors j'en tiendrais pas compte.
J'utilise le Framework Foundation qui n'est pas compatible avec IE6 alors je suis pas à un truc près.

Par contre, je dois revoir ton code, y'a un truc que je ne saisie pas je pense ou je passe à côté.

EDIT : Ouais, sur la dernière version de Firefox il faut le timer sinon ça ne fonctionne pas. Bon je ne suis pas super satisfait mais bon, un ça me saoule, deux j'ai pas mieux, alors je pense que je vais garder comme ça. La solution CSS à l'air pas mal mais je ne sais pas comment l'appliquer pour le moment...
Modifié par MagicCarpet (23 Aug 2013 - 00:25)
En fait je dis "vieux navigateurs" mais je voulais dire selon les navigateurs. Cela peut marcher avec 10 millisecondes (pour FF par ex) et avec un peu plus pour IE (je ne sais pas je n'ai pas testé).
Qu'est-ce que tu ne saisies pas et de quel code parles-tu ?
Ah, j'ai mis un EDIT entre temps. Bon déjà je suis allez trop vite la première fois donc j'ai pas trop tilté le bloc rouge Smiley smile

Après je ne connaissais pas target mais maintenant ok. Faut juste que je regarde pour mon site, je ne sais pas comment l'adapté là tout de suite...
Pour le JS ça donne ça à peu près (faut faire plus propre avec la gestion d'évènement). Ça marche partout sauf IE qui met une fraction de seconde pour réagir.
Moi à ta place je gérerais entièrement l'affichage en JS et laisserais ce comportement lorsque JS est désactivée.