DEV Community

Cover image for CSS Moderne : Recréer une Navigation "Glassmorphic" avec l'API Anchor Positioning
Samuel DIDIER-LAURENT
Samuel DIDIER-LAURENT

Posted on

CSS Moderne : Recréer une Navigation "Glassmorphic" avec l'API Anchor Positioning

En tant que développeur frontend, on cherche souvent l'équilibre parfait entre performance, esthétique et maintenabilité. Récemment, je suis tombé sur une vidéo de Wes Bos relevant un défi de design lancé par Raul Dronca. Le challenge ? Une navigation ultra-fluide où un indicateur magnétique suit le curseur.

Historiquement, ce genre d'interaction nécessitait du JavaScript et des calculs de getBoundingClientRect(). En 2026, nous pouvons faire cela de manière native et déclarative grâce à l'API CSS Anchor Positioning.


1. Le Concept : L'Adieu aux calculs JavaScript

L'Anchor Positioning permet de lier la position d'un élément (l'indicateur ou "bubble") à un autre (le lien du menu), même s'ils ne partagent pas le même parent direct pour le positionnement.

La structure HTML

Nous gardons un DOM propre et accessible. Les bulles sont des éléments frères des liens, ce qui simplifie la gestion des animations.

<div class="nav-wrap">
  <nav id="main-nav">
    <div class="bubble bubble-active"></div>
    <div class="bubble bubble-hover"></div>

    <a href="#" class="nav-link active">Projets</a>
    <a href="#" class="nav-link">Articles</a>
    <a href="#" class="nav-link">Expérience</a>
    <a href="#" class="nav-link">Contact</a>
  </nav>
</div>
Enter fullscreen mode Exit fullscreen mode

2. La Technique : anchor-name et position-anchor

C’est ici que réside la magie. Le processus se déroule en deux étapes :

Étape A : Identifier l'Ancre

On utilise la propriété anchor-name pour "nommer" l'élément que l'on veut suivre. Notez l'utilisation du double tiret --, obligatoire pour les noms d'ancres.

.nav-link.active {
  anchor-name: --active-link;
}

.nav-link:hover {
  anchor-name: --hover-link;
}
Enter fullscreen mode Exit fullscreen mode

Étape B : Lier l'Indicateur

L'indicateur utilise position-anchor pour savoir quelle ancre regarder, puis les fonctions anchor() pour mapper ses dimensions sur celles de l'ancre.

.bubble-active {
  position: absolute;
  position-anchor: --active-link;

  /* L'indicateur épouse parfaitement les bords de l'ancre */
  top: anchor(top);
  left: anchor(left);
  right: anchor(right);
  bottom: anchor(bottom);

  transition: all 0.4s cubic-bezier(0.16, 1, 0.3, 1);
}
Enter fullscreen mode Exit fullscreen mode

3. Le Rendu Visuel : Détails et Subtilités

Un bon développeur frontend se distingue par son souci du détail. Pour obtenir cet aspect "premium" vu dans la vidéo, nous jouons sur plusieurs tableaux :

  • Gradients Linéaires : Au lieu d'une simple couleur plate, on utilise des dégradés subtils pour simuler la lumière.
  • Box Shadows Inset : Pour donner un effet de profondeur (le bouton semble "creusé" dans la barre).
  • Glassmorphism : Une légère opacité combinée à un backdrop-filter (si nécessaire) pour laisser transparaître le fond.

Note technique : L'utilisation de isolation: isolate sur le parent <nav> est cruciale. Elle crée un nouveau contexte d'empilement, permettant aux bulles de se glisser derrière le texte (z-index: 1) tout en restant au-dessus du fond du menu.


4. Pourquoi cette approche est-elle supérieure ?

Critère Méthode JS Classique API Anchor Positioning
Performance Calculs sur le thread principal Géré nativement par le moteur de rendu
Complexité Écouteurs d'événements + ResizeObserver Quelques lignes de CSS pur
Fluidité Risque de "jank" si le JS sature Transitions CSS 60fps garanties

5. Conclusion

L'API Anchor Positioning n'est pas seulement un gadget ; c'est une preuve supplémentaire que le CSS devient de plus en plus puissant, réduisant notre dépendance aux scripts tiers pour l'UI.

En explorant ces techniques, on ne se contente pas de copier un design : on optimise l'expérience utilisateur tout en respectant les standards modernes du web.


Envie de voir le code en action ? Retrouvez ma démo interactive sur CodePen

Qu'en pensez-vous ? Est-ce que vous seriez prêts à utiliser cette nouvelle API (Discutons en commentaires)

Top comments (0)