Utilitaires✨ Premium

Responsive Nav

Barre d'onglets qui n'affiche que ses icônes dans une colonne étroite et ajoute les libellés dès que son conteneur atteint 280 px — sans media query.

CSS@containerNav

Mis à jour le

Cet effet fait partie d'Effect.Labs — 840 effets vanilla, une partie gratuite, une partie premium. Utilitaires comprend 43 effets, dont 3 gratuits. Découvrir la catégorie →

3 exemples d'usage

Crestoval — la même barre dans un téléphone et une tablette — Responsive Nav exemple 1

① Crestoval — la même barre dans un téléphone et une tablette

QuandPage de présentation d'une appli de randonnée : deux maquettes côte à côte, un téléphone de 156 px et une tablette de 324 px, chacune avec sa liste de sentiers et la même barre Sentiers / Explorer / Profil en bas. Rien ne bouge : chaque barre lit la largeur de son écran.
PourquoiUn seul composant pour toutes les tailles d'écran de l'appli : l'utilisateur voit les mots quand il y a la place, et l'équipe n'écrit pas deux barres.
RéglagesRacine dans un bloc de pied d'écran (128 px dans le téléphone, 288 px dans la tablette) ; fond de la racine en transparent, fond de la barre en rgba(217,249,157,.06). Libellés et liens remplacés dans le HTML.
Corvessane — pied de fenêtre d'une appli de notes qu'on élargit — Responsive Nav exemple 2

② Corvessane — pied de fenêtre d'une appli de notes qu'on élargit

QuandFenêtre de bureau d'une appli de notes : une note en cours d'écriture et, en pied de fenêtre, la barre Notes / Chercher / Compte. En tirant le coin de la fenêtre, les libellés apparaissent dès que la barre atteint 280 px et disparaissent quand on la resserre.
PourquoiDans une appli redimensionnable, la barre garde toujours la même hauteur : elle gagne des mots au lieu de passer à la ligne ou de déborder.
RéglagesRacine en pied de fenêtre, fond transparent. La poignée de coin appartient à la scène : on la tire à la souris ou aux flèches ; pour la capture, la fenêtre s'élargit seule entre 236 et 492 px.
Talmirenc — barre d'un lecteur de podcast flottant qui se compacte — Responsive Nav exemple 3

③ Talmirenc — barre d'un lecteur de podcast flottant qui se compacte

QuandSite d'une émission de podcast : un lecteur flottant en bas à droite affiche l'épisode en cours et une barre Épisodes / Chercher / Compte. Le bouton « Réduire » rétrécit le lecteur de 316 à 190 px : la barre ne garde que ses icônes, sans qu'on la touche.
PourquoiUn composant posé dans un élément qui change de taille suit tout seul ; pas de classe à basculer dans la barre elle-même.
RéglagesRacine dans le lecteur (296 px puis 170 px), fond transparent, barre padding: 6px 8px. Le bouton « Réduire » est celui de la scène ; pour la capture, il est rejoué toutes les 1,3 s.

Comment ça marche

La racine .fx-0746-root est elle-même le conteneur interrogé (container: ctb-nav / inline-size). Elle contient un <nav class="ctb-bar"> et un lien .ctb-item par onglet : une icône SVG décorative et un <span class="ctb-label">. Ce qui décide de l'affichage, c'est la largeur de l'endroit où vous posez la barre, pas celle de l'écran : la même barre peut montrer ses libellés dans la page et rester en icônes dans une colonne voisine.

Sous 280 px, les libellés sont masqués à l'œil par la technique « visuellement caché » (boîte de 1 px, clip-path: inset(50%)) : ils restent dans la page et donnent leur nom aux liens. La règle @container ctb-nav (min-width: 280px) leur rend leur place à côté de l'icône. Les onglets restent centrés, espacés de 6 px, sur un fond rgba(255,255,255,.04) arrondi à 14 px.

L'onglet actif est celui qui porte aria-current="page" : fond violet rgba(139,92,246,.2), icône #8b5cf6, libellé #a78bfa. Le petit script se branche sur chaque racine (une fois, même s'il est collé deux fois) et déplace cet attribut sur le lien cliqué ; sur un site à plusieurs pages, posez simplement aria-current côté serveur.

Accessibilité

  • Vrais liens : chaque onglet est un <a href>, atteint par Tab et suivi par Entrée, au doigt comme à la souris. Sur Safari, Tab ne s'arrête sur les liens qu'avec Option+Tab ou le réglage « Utiliser Tab pour sélectionner » de macOS.
  • Nom conservé en mode icônes : le libellé est caché à l'œil, pas retiré : un lecteur d'écran annonce « Recherche, lien » même à 160 px de large. Les icônes portent aria-hidden="true".
  • Onglet en cours annoncé : aria-current="page" est lu (« page actuelle »). À l'œil, l'onglet actif se distingue par un fond violet et une couleur de texte : si vous voulez un repère qui ne repose pas sur la couleur, ajoutez un soulignement ou un trait sous .ctb-item[aria-current="page"].
  • Focus visible : contour de 2 px #a78bfa décalé de 2 px sur :focus-visible.
  • Mouvement réduit : sous prefers-reduced-motion: reduce, les fondus de fond et de couleur (0,3 s) sont supprimés ; l'apparition des libellés a toujours été instantanée.

Compatibilité navigateur

Requêtes de conteneur (container-type, @container : Chrome 105, Firefox 110, Safari 16) et :focus-visible (Safari 15.4). Mesuré dans Chromium 151, Firefox 153 et WebKit 26.5, deux copies dans la même page : libellés cachés jusqu'à 279 px, visibles dès 281 px, toujours sur une ligne à 800 px ; clic, toucher et Entrée déplacent l'onglet actif de la seule copie touchée ; 0 erreur.

Chrome 105+✓ Complet (mesuré)
Firefox 110+✓ Complet (mesuré)
Safari 16+✓ Complet (mesuré sous WebKit)
Edge 105+✓ Complet
Mobile iOS 16+✓ Complet
Android Chrome 105+✓ Complet

Sans requêtes de conteneur (navigateur antérieur), la barre reste en icônes seules à toutes les largeurs ; les libellés restent lus par les lecteurs d'écran et les liens fonctionnent. Sans JavaScript, seul le déplacement de l'onglet actif au clic disparaît.

Le code

Structure HTML à coller dans votre page (le CSS + JS sont inclus avec votre achat) :

index.html — structure
<div class="fx-0746-root">
  <nav class="ctb-bar" aria-label="…">
    <a class="ctb-item" href="#…" aria-current="page">
      <svg aria-hidden="true">…</svg>
      <span class="ctb-label">…</span>
    </a>
    <a class="ctb-item" href="#…">…</a>
  </nav>
</div>

Paiement unique, sans abonnement — le code est à toi pour toujours

Personnaliser

Options passées à l'API ou attributs data-* :

Option / propriétéDéfautEffet
Palier (CSS — @container ctb-nav (min-width: 280px)) 280 px Changez la valeur pour afficher les libellés plus tôt ou plus tard ; elle porte sur la largeur de la racine.
Onglets (HTML — .ctb-item) 3 liens : Accueil, Recherche, Profil Ajoutez ou retirez des liens ; avec plus d'onglets, relevez le palier pour que tous les libellés tiennent sur une ligne.
Onglet actif (HTML — aria-current="page") Le premier lien Posez l'attribut sur le lien de la page en cours ; le script le déplace au clic dans une appli d'une seule page.
Couleur d'accent (CSS — .ctb-item[aria-current="page"]) Fond rgba(139,92,246,.2), icône #8b5cf6, texte #a78bfa Remplacez ces trois valeurs pour l'onglet actif, et rgba(139,92,246,.15) pour le survol.
Fond (CSS — .fx-0746-root et .ctb-bar) #0a0a0f arrondi à 16 px, barre rgba(255,255,255,.04) Mettez la racine en background: transparent pour qu'elle prenne la couleur de votre pied de page.
Icônes (HTML — <svg> 24 × 24 en trait) Maison, loupe, silhouette ; trait 1,5 Collez vos propres icônes en trait (fill: none) : la couleur suit l'état de l'onglet.

FAQ

La barre regarde la largeur de sa racine, pas celle de la fenêtre. Si la racine est dans une colonne de 240 px, elle reste en icônes même sur un grand écran : élargissez la colonne ou baissez le palier de 280 px.
Oui. Le texte est caché à l'œil mais reste dans la page : il donne leur nom aux liens pour les lecteurs d'écran et la commande vocale (« cliquer Recherche »).
Seulement si vos onglets ne changent pas de page (appli d'une seule page, onglets d'un panneau). Sur un site classique, chaque page pose aria-current="page" sur son lien et le script peut être retiré : l'adaptation à la largeur est en CSS pur.