Navigation, Menus & Composants UI
Menus animés, composants UI et anchor positioning.
Mis à jour le
Comment créer des menus animés qui restent accessibles ?
Les effets de navigation rendent menus, onglets et infobulles plus faciles à suivre : soulignement qui glisse vers le lien actif, menu hamburger qui se transforme en croix, menus déroulants et accordéons qui s'ouvrent en douceur. Ils utilisent des transitions CSS, l'élément details ou de petits scripts, et le positionnement d'ancrage CSS, là où il est pris en charge, pour accrocher une infobulle à son déclencheur.
Comment choisir, performances et accessibilité
- Underline Expand et Pill Indicator conviennent à un en-tête de site, Morphing Hamburger à un menu mobile, Tab Slider à un sélecteur de formules ou de fonctionnalités, et Sticky Header Detection à une page longue.
- Chaque menu doit s'ouvrir, se fermer avec Échap et déplacer correctement le focus au clavier, exposer son état avec
aria-expandedet rester utilisable sans animation. - Underline Expand, Accordion Basic, Smart Tooltip System et Connected Nodes sont gratuits avec leur code complet ; les autres composants de navigation sont inclus dans Premium.
Voir le code source
<div class="demo-preview">
<div class="nav-demo">
<span class="nav-link-demo link-underline-expand">Accueil</span>
<span class="nav-link-demo link-underline-expand">Services</span>
<span class="nav-link-demo link-underline-expand">Contact</span>
</div>
</div>.demo-preview,
.demo-preview *,
.demo-preview *::before,
.demo-preview *::after {
box-sizing: border-box
}
.demo-preview {
display: flex;
align-items: center;
justify-content: center;
width: 100%;
height: 250px;
overflow: hidden;
position: relative;
background: rgb(26, 26, 36);
color: rgb(255, 255, 255);
font-family: sans-serif;
}
/* Variables du design system du site, dont ce code dépend (valeurs de css/style.css — à adapter librement). */
.demo-preview {
--gradient-primary: linear-gradient(135deg, #6366f1 0%, #8b5cf6 50%, #d946ef 100%);
--space-2: 0.5rem;
--space-8: 2rem;
--text-primary: #ffffff;
--text-secondary: #a1a1aa;
}
.nav-demo {
display: flex;
gap: var(--space-8);
align-items: center;
}
.nav-link-demo {
color: var(--text-secondary);
font-weight: 500;
padding: var(--space-2) 0;
position: relative;
cursor: pointer;
transition: color 0.3s;
}
.nav-link-demo:hover {
color: var(--text-primary);
}
.link-underline-expand::after {
content: '';
position: absolute;
bottom: 0;
left: 50%;
width: 0;
height: 2px;
background: var(--gradient-primary);
transition: all 0.3s ease;
transform: translateX(-50%);
}
.link-underline-expand:hover::after {
width: 100%;
}/* CSS pur — aucun JavaScript requis */Sticky Header Detection
Header sticky avec Intersection Observer qui détecte le scroll et change de style.
Page de l’effet →Custom Bezier Transition
Transition de couleur avec courbe cubic-bezier personnalisée pour un mouvement fluide.
Page de l’effet →Floating Indicator
Indicateur flottant avec transition cubic-bezier fluide. Inspiré de CTA Gallery.
Page de l’effet →Accordion Basic
Sections extensibles avec animation de hauteur fluide. Plusieurs sections peuvent être ouvertes.
Page de l’effet →Voir le code source
<div class="demo-preview">
<div class="component-demo">
<div class="accordion" id="accordionBasic">
<div class="accordion-item active">
<button class="accordion-header" onclick="toggleAccordion(this, 'basic')">
Section 1
<svg class="accordion-icon" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
<path d="M6 9l6 6 6-6"/>
</svg>
</button>
<div class="accordion-content">
<div class="accordion-body">
Contenu de la première section avec animation de hauteur fluide.
</div>
</div>
</div>
<div class="accordion-item">
<button class="accordion-header" onclick="toggleAccordion(this, 'basic')">
Section 2
<svg class="accordion-icon" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
<path d="M6 9l6 6 6-6"/>
</svg>
</button>
<div class="accordion-content">
<div class="accordion-body">
Deuxieme section avec du contenu different.
</div>
</div>
</div>
<div class="accordion-item">
<button class="accordion-header" onclick="toggleAccordion(this, 'basic')">
Section 3
<svg class="accordion-icon" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
<path d="M6 9l6 6 6-6"/>
</svg>
</button>
<div class="accordion-content">
<div class="accordion-body">
Troisieme et dernière section.
</div>
</div>
</div>
</div>
</div>
</div>.demo-preview,
.demo-preview *,
.demo-preview *::before,
.demo-preview *::after {
box-sizing: border-box
}
.demo-preview {
display: flex;
align-items: center;
justify-content: center;
width: 100%;
height: 250px;
overflow: hidden;
position: relative;
background: rgb(26, 26, 36);
color: rgb(255, 255, 255);
font-family: sans-serif;
}
.component-demo {
width: 100%;
min-height: 200px;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 12px;
}
.accordion {
width: 100%;
max-width: 350px;
}
.accordion-item {
background: rgba(255, 255, 255, 0.05);
border-radius: 8px;
margin-bottom: 8px;
overflow: hidden;
}
.accordion-header {
width: 100%;
padding: 16px 20px;
background: transparent;
border: none;
color: white;
font-size: 0.95rem;
font-weight: 500;
font-family: inherit;
display: flex;
justify-content: space-between;
align-items: center;
cursor: pointer;
transition: background 0.3s ease;
}
.accordion-header:hover {
background: rgba(255, 255, 255, 0.05);
}
.accordion-icon {
transition: transform 0.3s ease;
}
.accordion-item.active .accordion-icon {
transform: rotate(180deg);
}
.accordion-content {
max-height: 0;
overflow: hidden;
transition: max-height 0.4s ease, padding 0.3s ease;
}
.accordion-item.active .accordion-content {
max-height: 200px;
}
.accordion-body {
padding: 0 20px 16px;
color: rgba(255, 255, 255, 0.6);
font-size: 0.9rem;
line-height: 1.6;
}(function() {
function toggleAccordion(header, type) {
const item = header.parentElement;
const accordion = item.parentElement;
if (type === 'single') {
// Close all other items in single mode
accordion.querySelectorAll('.accordion-item').forEach(otherItem => {
if (otherItem !== item) {
otherItem.classList.remove('active');
}
});
}
item.classList.toggle('active');
}
window.toggleAccordion = toggleAccordion;
})();Accordion Single
Une seule section ouverte à la fois. Les autres se ferment automatiquement.
Page de l’effet →Toast Success
Notification de succès verte avec animation de glissement. Disparait après 3 secondes.
Page de l’effet →Toast Error
Notification d'erreur rouge pour alerter l'utilisateur. Auto-dismiss après 3 secondes.
Page de l’effet →Skeleton Card
Placeholder de carte avec effet de scintillement pendant le chargement.
Page de l’effet →