Générateur d'onglets CSS

Suivant

Les onglets sont partout, panneaux de paramètres, sites de documentation, galeries de produits. Le HTML natif n’a pas d’élément d’onglet dédié, donc les développeurs créent le leur. Ce générateur construit une barre d’onglets simple en HTML + CSS : une couleur d’accent pour l’onglet actif, un arrondi des angles pour les boutons et un état au survol. Collez le balisage dans votre projet et reliez le changement d’onglets à votre propre JavaScript.

Comment créer des onglets

  1. 1

    Choisissez une couleur d'accent

    La couleur de fond et de texte de l'onglet actif. Choisissez une couleur qui correspond à votre marque.

  2. 2

    Définissez l'arrondi des angles

    Arrondit les coins supérieurs des boutons d'onglet. Des valeurs plus élevées donnent un rendu plus doux.

  3. 3

    Modifiez les étiquettes

    Le résultat contient trois boutons, "Overview", "Details" et "Settings" : renommez-les selon votre contenu.

  4. 4

    Copiez le code

    Le balisage des onglets inclut son propre bloc <style>. Collez les deux dans votre page.

  5. 5

    Ajoutez le changement d'onglets

    Le générateur produit uniquement la partie visuelle. Reliez les boutons à votre propre JavaScript ou à votre bibliothèque d'interface pour afficher et masquer les panneaux.

Balisage accessible correct

<div class="tabs">
  <div role="tablist" aria-label="Informations sur le produit">
    <button role="tab" id="tab-1" aria-selected="true"  aria-controls="panel-1" tabindex="0">Aperçu</button>
    <button role="tab" id="tab-2" aria-selected="false" aria-controls="panel-2" tabindex="-1">Spécifications</button>
    <button role="tab" id="tab-3" aria-selected="false" aria-controls="panel-3" tabindex="-1">Avis</button>
  </div>
  <section role="tabpanel" id="panel-1" aria-labelledby="tab-1">...</section>
  <section role="tabpanel" id="panel-2" aria-labelledby="tab-2" hidden>...</section>
  <section role="tabpanel" id="panel-3" aria-labelledby="tab-3" hidden>...</section>
</div>

Attributs critiques :

  • role="tablist" enveloppe les boutons.
  • role="tab" sur chaque bouton, avec aria-selected et aria-controls.
  • tabindex utilise le modèle de tabindex itinérant : seul l’onglet actif est 0, les autres sont -1. Les flèches déplacent le focus entre eux.
  • role="tabpanel" sur chaque panneau, avec aria-labelledby pointant vers son onglet.
  • hidden sur les panneaux inactifs (pas seulement display: none, l’attribut est ce que les AT utilisent).

Contrat clavier

Touche Action
Tab Passer dans / hors de la liste d’onglets
ArrowLeft Onglet précédent (revient au dernier)
ArrowRight Onglet suivant (revient au premier)
Home Premier onglet
End Dernier onglet
Enter / Space Activer l’onglet ciblé (si activation manuelle)

Activation automatique (l’onglet change lorsque le focus se déplace) contre manuelle (le focus se déplace, l’onglet s’active sur Entrée), WAI-ARIA permet les deux. L’automatique est plus facile pour les utilisateurs voyants ; la manuelle est meilleure lorsque le contenu de l’onglet est lourd à rendre.

Style souligné

[role="tablist"] {
  display: flex;
  border-bottom: 1px solid #e5e7eb;
}
[role="tab"] {
  padding: 0.75rem 1rem;
  background: transparent;
  border: 0;
  color: #6b7280;
  position: relative;
  cursor: pointer;
}
[role="tab"][aria-selected="true"] {
  color: #111827;
}
[role="tab"][aria-selected="true"]::after {
  content: "";
  position: absolute;
  left: 1rem; right: 1rem; bottom: -1px;
  height: 2px;
  background: #2563eb;
}

Style arrondi

[role="tab"] {
  padding: 0.5rem 0.9rem;
  border-radius: 9999px;
  border: 0;
  background: transparent;
}
[role="tab"][aria-selected="true"] {
  background: #2563eb;
  color: #fff;
}

Focus au clavier visible

Affichez toujours un anneau de focus lorsque le focus arrive via le clavier :

[role="tab"]:focus-visible {
  outline: 2px solid #60a5fa;
  outline-offset: 2px;
}

Le JavaScript

En gros :

const tabs = document.querySelectorAll('[role="tab"]');
tabs.forEach(tab => {
  tab.addEventListener('click', () => activate(tab));
  tab.addEventListener('keydown', e => {
    const i = [...tabs].indexOf(tab);
    if (e.key === 'ArrowRight') tabs[(i + 1) % tabs.length].focus();
    if (e.key === 'ArrowLeft')  tabs[(i - 1 + tabs.length) % tabs.length].focus();
    if (e.key === 'Home') tabs[0].focus();
    if (e.key === 'End')  tabs[tabs.length - 1].focus();
  });
});

function activate(tab) {
  tabs.forEach(t => {
    const panel = document.getElementById(t.getAttribute('aria-controls'));
    const active = t === tab;
    t.setAttribute('aria-selected', active);
    t.setAttribute('tabindex', active ? '0' : '-1');
    panel.hidden = !active;
  });
  tab.focus();
}

Trente lignes au total, zéro dépendances.

Onglets vs. accordéons

Sur les écrans étroits, les rangées d’onglets deviennent encombrées. Modèle courant : onglets sur bureau, accordéon sur mobile. Utilisez une requête de conteneur ou une requête média pour changer le traitement visuel sans changer les rôles ARIA.

Questions fréquentes

Pour des onglets accessibles, oui. Sans role="tablist" et role="tab", les lecteurs d’écran traitent les boutons comme des boutons ordinaires et les utilisateurs perdent la convention de navigation. L’alternative est un accordéon <details> / <summary> simple, qui a une sémantique intégrée.

L’activation automatique (l’onglet s’active lorsque le focus se déplace) est acceptable lorsque le contenu de chaque onglet est léger à rendre. L’activation manuelle (le focus se déplace, Entrée active) est préférable lorsque le changement d’onglets déclenche un travail lourd comme le chargement ou le rendu d’un grand formulaire.

Pour les onglets contenant du contenu (documentation, onglets de produits), oui, utilisez un hash (#specs) ou un paramètre de requête afin que les liens puissent pointer vers un onglet spécifique et que l’onglet actif persiste entre les rechargements. Pour les onglets UI (panneaux de paramètres), l’URL est optionnelle.

Seulement avec le hack checkbox/radio, qui manque de navigation par touches fléchées et d’états ARIA. Pour une mise en œuvre réellement accessible, le petit extrait JS en vaut la peine. Si vous avez besoin de solutions de secours rendues par le serveur, liez chaque onglet à une URL unique et rendez le panneau correspondant côté serveur.

Outils similaires

Outil disponible dans d’autres langues