Unlimited Wordpress themes, plugins, graphics & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Web Design
  2. Navigation Design
Webdesign

Comment construire un changement d'effet de relance de soulignement avec CSS et JavaScript

by
Difficulty:IntermediateLength:ShortLanguages:

French (Français) translation by New Lune (you can also view the original English article)

Dans le tutoriel d'aujourd'hui, nous allons utiliser un peu de CSS et JavaScript pour créer un effet fantaisie de survol du menu. Ce n'est pas un résultat final compliqué, mais la construction de celui-ci sera une excellente occasion de pratiquer nos compétences de front-end.

Sans autre intro, voyons ce que nous allons construire:

Le balisage

Nous commençons par un balisage très élémentaire; un élément nav qui contient le menu et un élément span vide:

Le CSS

Avec le balisage prêt, nous allons ensuite spécifier quelques styles de base pour les éléments associés:

Notez que l'élément span (.target) est absolument positionné. Comme nous le verrons dans un instant, nous utiliserons JavaScript pour déterminer sa position exacte. En outre, il devrait apparaître derrière les liens de menu, donc nous lui donnons un z-index négatif.

Le JavaScript

À ce stade, concentrons notre attention sur le JavaScript requis. Pour commencer, nous ciblons les éléments souhaités. Nous définissons également un tableau de couleurs que nous utiliserons plus tard.

Événements

Ensuite, nous écoutons les événements click et mouseenter des liens du menu.

Lorsque l'événement click se produit, nous empêchons la page de recharger. Bien sûr, cela fonctionne dans notre cas car tous les liens ont un attribut href vide. Dans un projet réel cependant, chacun des liens de menu ouvrirait probablement une page différente.

Plus important encore, dès que l'événement mouseenter se déclenche, la fonction callback mouseenterFunc est exécutée:

mouseenterFunc

Le corps de la fonction mouseenterFunc ressemble à ceci:

Dans cette fonction nous faisons ce qui suit:

  1. Ajoutez la classe active au parent immédiat (li) du lien cible.
  2. Diminuez l'opacity de tous les liens de menu, en dehors de l'"actif ".
  3. Utilisez la méthode getBoundingClientRect pour récupérer la taille du lien associé et sa position par rapport à la fenêtre.
  4. Obtenez une couleur aléatoire de la matrice mentionnée ci-dessus et transmettez-la en tant que valeur à la propriété border-color de l'élément span. N'oubliez pas que sa valeur de propriété initiale est définie sur transparent.
  5. Attribuez les valeurs extraites de la méthode getBoundingClientRect aux propriétés correspondantes de l'élément span. En d'autres termes, la balise span hérite de la taille et de la position du lien sur lequel on traverse.
  6. Réinitialiser la transformation par défaut appliquée à l'élément span. Ce comportement n'est important que la première fois que nous survolons un lien. Dans ce cas, la transformation de l'élément passe de transform: translateX(-60px) à transform: none. Cela nous donne un bel effet de glissement.

If Active

Il est important de noter que le code ci-dessus est exécuté chaque fois que nous survolons un lien. Il fonctionne donc lorsque nous planer sur un lien "actif" ainsi. Pour éviter ce comportement, nous enveloppons le code ci-dessus dans une instruction if:

Jusqu'à présent, notre démo se présente comme suit:

Presque, mais pas assez

Donc, tout semble fonctionner comme prévu, non? Eh bien, ce n'est pas vrai, car si nous faisons défiler la page ou redimensionnons la fenêtre, puis essayons de sélectionner un lien, les choses deviennent désordonnées. Plus précisément, la position de l'élément de span devient incorrecte.

Jouez avec la démo de page pleine pour voir ce que je veux dire.

Pour le résoudre, nous devons calculer la distance parcourue depuis le haut de la fenêtre et ajouter cette valeur à la valeur top courante de l'élément cible. De la même façon, nous devons calculer jusqu'à quel point le document a été défilé horizontalement (juste au cas où). La valeur résultante est ajoutée à la valeur de left actuelle de l'élément cible.

Voici les deux lignes de code que nous mettons à jour:

Gardez à l'esprit que tout le code ci-dessus est exécuté dès que le navigateur traite le DOM et trouve le script approprié. Encore une fois, pour vos propres implémentations et conceptions, vous voudrez peut-être exécuter ce code lorsque la page est chargée, ou quelque chose comme ça. Dans un tel scénario, vous devrez l'intégrer dans un gestionnaire d'événements (ex. load event handler).

Point de vue

La dernière chose que nous devons faire est de s'assurer que l'effet continuera à fonctionner comme nous redimensionner la fenêtre du navigateur. Pour le faire, nous écoutons l'événement de resize et inscrivons le gestionnaire d'événements resizeFunc.

Voici le corps de ce gestionnaire:

Dans la fonction ci-dessus, nous procédons comme suit:

  1. Vérifiez s'il y a un élément de liste de menu avec la classe active. S'il existe un tel élément, cela indique que nous avons déjà survolé un lien.
  2. Obtenez les nouvelles propriétés de left et de top de l'élément "active" ainsi que les propriétés de fenêtre associées et attribuez-les à l'élément span. Notez que nous récupérons les valeurs uniquement pour les propriétés qui changent pendant l'événement de resize. Cela signifie qu'il n'est pas nécessaire de recalculer la largeur et la hauteur des liens de menu.

Prise en charge du navigateur

La démo fonctionne bien dans tous les navigateurs récents. Si vous rencontrez des problèmes cependant, laissez-moi savoir dans les commentaires ci-dessous. En outre, comme vous l'avez peut-être remarqué, nous utilisons Babel pour compiler notre code ES6 jusqu'à ES5.

Conclusion

Dans cette astuce rapide nous avons traversé le processus de création d'un simple, mais intéressant menu hover effet.

J'espère que vous avez apprécié ce que nous avons construit ici et s'est inspiré pour développer des effets de menu encore plus puissants comme celui apparaissant (au moment de la rédaction) dans le site Stripe.

Avez-vous déjà créé quelque chose de semblable? Si oui, assurez-vous de partager avec nous les défis que vous avez rencontrés.

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.