Salut,
ton scénario est du type « cacher tous, montrer un seul ». Tu as moyen de réduire le volume de code de manière assez importante, et de le rendre plus facile à faire évoluer, au cas où tu voudrais rajouter un type d’hébergement par exemple.
Pour commencer, il te faut donc une instruction qui ressemble à ça :
$('.hebergement').hide();
Bien entendu ça suppose que tu as rajouté une classe à chacun des hébergements.
Ensuite, il y a une astuce qui va te permettre de connaître la section à afficher en fonction du bouton qui a été cliqué. Cela te permet de n’avoir qu’une seule fonction .click(), et ainsi de n’avoir pas besoin d’en écrire une nouvelle à chaque fois que tu voudras rajouter un hébergement.
Il s’agit de récupérer l’attribut class du bouton et de repérer, à l’aide d’une expression rationnelle, la partie qui commence par image.
1 2 3 4 5 6
| $('.bouton').click(function () {
$('.hebergement').hide();
var match = this.className.match(/image(\w+)/);
console.log(match);
// ... |
En supposant que tes boutons ont une classe bouton. S’ils sont tous des images dans une nav (par exemple), tu peux aussi utiliser le sélecteur $('nav img'). Tu vois l’idée.
Dans une fonction d’évènement telle que notre fonction .click(), la variable this référence automatiquement l’objet de l’évènement, en l’occurence le bouton cliqué.
Je t’ai mis un console.log pour que tu voies le résultat de match dans la console F12. Si tu n’as pas l’habitude des expressions rationnelles, ça t’aidera de pouvoir le visualiser. Le résultat est un tableau avec, en position 0, la correspondance totale (par ex. imagechalets et, en position 1, la partie capturée par les parenthèses autour de \w+ (dans l’exemple, chalets).
Il ne reste plus qu’à compléter la fonction en utilisant match[1] :
1 2
| $('.contenu' + match[1]).show();
}); |
Pour reprendre mon exemple, si le bouton avait pour classe imagechalets, l’expression '.contenu' + match[1] sera égale à '.contenuchalets'.
Pour le scroll tu as au moins deux solutions :
A. Utiliser des id et manipuler le hash de l’URL (location.hash = '#chalets', et utiliser la pseudo-classe :target. Mais, selon le navigateur, ça ne te permet pas facilement d’avoir un défilement progressif.
B. Utiliser la méthode .offset() pour récupérer la position de l’élément cible, et modifier le scrollTop du document. Pour avoir un défilement progressif, tu peux alors utiliser .animate() ( $('html').animate({ scrollTop: ... }); ).
Voilà, n’hésite pas à poser des questions
Partager