Tabs (Onglets)
Le composant onglets permet de positioner plusieurs sections de contenu au même endroit, en affichant une section à la fois. Cliquer sur un onglet affiche le contenu de la section associée. Le comportement ressemble à celui d’onglets dans une application, comme ceux d’un navigateur.
Usage
- Le composant onglets est composé d’au moins 2 onglets.
- Un onglet se présente sous 2 états : standard / actif.
- Il existe 2 variantes :
- Inline (en ligne)
- Full-width (pleine largeur)
- Lorsque le nombre d’onglets dépasse la largeur de la colonne, on peut faire glisser la liste d’un simple toucher-glisser pour les écrans tactiles, ou d’un clic sur les boutons-flèches pour les tablettes et desktop.
Style & code
Dépendances :
- Classe
sipaui
sur un parent (par exemple le<body>
), - Helpers (classes d’aide),
- composant Carrousel (carrousel) (pour les onglets avec swipe).
Onglets inline
Cas minimal
Le cas minimal est une suite d’onglets se suivant naturellement et dont la largeur dépend de leur intitulé. Dans ce cas, l’espace libre à droite du dernier onglet est totalement vide. Pour créer ces onglets, il faut une liste de liens correspondant à chaque onglet voulu et des blocs contenant le contenu associé à chacun de ces onglets. La liste de liens devrait se trouver dans une balise <nav>
pour respecter les normes du HTML5 et être plus accessibles. Le fonctionnement de ces onglets s’appuie sur la fonctionnalité JS Onglet.
Liste des classes obligatoires :
- La liste doit porter la classe
su-tabs
. - Chaque élément structurant des onglets (onglets + blocs de contenu) doit avoir une classe d’identification unique (ici :
tab-id-1
). - Chaque bloc de contenu doit porter une classe
su-tab-content-*n*
oùn
est un nombre représentant l’ordre du contenu.
Ensuite, pour apporter l’interactivité, il faut ajouter les paramètres de `data-suonglet :
cont
pour indiquer l’identifiant unique des éléments concernés,ong
pour cibler le contenu à afficher.
<nav>
<ul class="su-tabs">
<li><a class="tab-id-1 su-tab-on" href="javascript:;" data-suonglet='{"cont":".tab-id-1","ong":".su-tab-content-1"}'>Onglet 1</a></li>
<li><a class="tab-id-1" href="javascript:;" data-suonglet='{"cont":".tab-id-1","ong":".su-tab-content-2"}'>Onglet 2</a></li>
<li><a class="tab-id-1" href="javascript:;" data-suonglet='{"cont":".tab-id-1","ong":".su-tab-content-3"}'>Onglet 3</a></li>
<li><a class="tab-id-1" href="javascript:;" data-suonglet='{"cont":".tab-id-1","ong":".su-tab-content-4"}'>Onglet 4</a></li>
</ul>
</nav>
<div class="tab-id-1 su-tab-content-1 su-tab-on">1. Contenu onglet 1</div>
<div class="tab-id-1 su-tab-content-2">2. Contenu onglet 2</div>
<div class="tab-id-1 su-tab-content-3">3. Contenu onglet 3</div>
<div class="tab-id-1 su-tab-content-4">4. Contenu onglet 4</div>
Cas avec contenu plus large que le conteneur
Si la largeur totale des onglets est supérieure à la largeur du conteneur, SipaUI rendra automatiquement la ligne d’onglet scrollable horizontalement. Toutefois, ce n’est pas suffisant pour rendre le composant ergonomique. Il faut donc rajouter divers éléments :
- Les classes du composant Carrousel (carrousel) (
su-carrousel
,snap-migrate
,su-carrousel-container
) - Les boutons du composant Navigation buttons (boutons de navigation) (
su-navigation-button
,su-inside
,su-left
,su-right
,su-inactive
) - l’attribut déclencheur du composant Carrousel (carrousel) (data-suonglet)
<div class="su-row">
<section class="su-col-md-12">
<nav class="su-carrousel snap-migrate">
<ul class="su-tabs su-carrousel-container" data-suswipe='{"sel":"li","halfSwipe":true,"rambo":false}'>
<li><a class="tab-id-2 su-tab-on" href="javascript:;" data-suonglet='{"cont":".tab-id-2","ong":".su-tab-content-1"}'>1. Lorem</a></li>
<li><a class="tab-id-2" href="javascript:;" data-suonglet='{"cont":".tab-id-2","ong":".su-tab-content-2"}'>2. Ipsum dolor sit amet</a></li>
<li><a class="tab-id-2" href="javascript:;" data-suonglet='{"cont":".tab-id-2","ong":".su-tab-content-3"}'>3. Consectetur adipisicing elit</a></li>
<li><a class="tab-id-2" href="javascript:;" data-suonglet='{"cont":".tab-id-2","ong":".su-tab-content-4"}'>4. Sed do eiusmod tempor incididunt</a></li>
<li><a class="tab-id-2" href="javascript:;" data-suonglet='{"cont":".tab-id-2","ong":".su-tab-content-5"}'>5. Ut enim ad minim veniam</a></li>
</ul>
<button class="su-navigation-button su-inside su-left su-inactive" data-suswipeprev><i class="su-icon">gauche</i></button>
<button class="su-navigation-button su-inside su-right" data-suswipenext><i class="su-icon">droite</i></button>
</nav>
<div class="tab-id-2 su-tab-content-1 su-tab-on">1. Contenu onglet 1</div>
<div class="tab-id-2 su-tab-content-2">2. Contenu onglet 2</div>
<div class="tab-id-2 su-tab-content-3">3. Contenu onglet 3</div>
<div class="tab-id-2 su-tab-content-4">4. Contenu onglet 4</div>
<div class="tab-id-2 su-tab-content-5">5. Contenu onglet 5</div>
</section>
</div>
Onglets sur fond sombre
Il est possible d’utiliser le composant onglets sur un fond sombre en positionnant la classe su-negative
à côté de la classe sipaui
, ou sur un parent de su-tabs
…
<div class="su-row" style="background: DimGray; padding: 10px">
<section class="su-col-md-12 su-negative">
<nav class="su-carrousel snap-migrate">
<ul class="su-tabs su-carrousel-container" data-suswipe='{"sel":"li","halfSwipe":true,"rambo":false}'>
<li><a class="tab-id-2 su-tab-on" href="javascript:;" data-suonglet='{"cont":".tab-id-2","ong":".su-tab-content-1"}'>1. Lorem</a></li>
<li><a class="tab-id-2" href="javascript:;" data-suonglet='{"cont":".tab-id-2","ong":".su-tab-content-2"}'>2. Ipsum dolor sit amet</a></li>
<li><a class="tab-id-2" href="javascript:;" data-suonglet='{"cont":".tab-id-2","ong":".su-tab-content-3"}'>3. Consectetur adipisicing elit</a></li>
<li><a class="tab-id-2" href="javascript:;" data-suonglet='{"cont":".tab-id-2","ong":".su-tab-content-4"}'>4. Sed do eiusmod tempor incididunt</a></li>
<li><a class="tab-id-2" href="javascript:;" data-suonglet='{"cont":".tab-id-2","ong":".su-tab-content-5"}'>5. Ut enim ad minim veniam</a></li>
</ul>
<button class="su-navigation-button su-inside su-left su-inactive" data-suswipeprev><i class="su-icon">gauche</i></button>
<button class="su-navigation-button su-inside su-right" data-suswipenext><i class="su-icon">droite</i></button>
</nav>
<div class="tab-id-2 su-tab-content-1 su-tab-on">1. Contenu onglet 1</div>
<div class="tab-id-2 su-tab-content-2">2. Contenu onglet 2</div>
<div class="tab-id-2 su-tab-content-3">3. Contenu onglet 3</div>
<div class="tab-id-2 su-tab-content-4">4. Contenu onglet 4</div>
<div class="tab-id-2 su-tab-content-5">5. Contenu onglet 5</div>
</section>
</div>
Onglets en pleine largeur
Il y a moyen de faire en sorte que le composant onglets prenne toute la largeur de son conteneur. Pour cela 2 solutions :
- on fait en sorte que le conteneur des onglets s’élargisse jusqu'au bord droit (via son filet du bas ou via son fond, en fonction des thèmes…)
- on fait en sorte que les onglets eux-mêmes s’élargissent pour prendre tout l’espace disponible.
Attention, le second cas implique 3 conséquences importantes :
- Vous devez maîtriser les intitulés et le nombre de ces onglets pour que la somme de leurs largeurs ne soit pas supérieure à celle du conteneur.
- Si le nombre d’onglets est trop faible par rapport à la largeur du parent, il y aura trop de vide entre les onglets, ce qui risque d’être « assez » inesthétique.
- Vous ne pourrez pas dans ce cas faire des onglets en carrousel (scrollables horizontalement).
Cas de pleine largeur du conteneur
Ici, avec la classe su-fullwidth
à côté de su-tabs
, on fait en sorte que la zone des onglets fasse toute la largeur du parent.
<nav>
<ul class="su-tabs su-fullwidth">
<li><a class="tab-id-1 su-tab-on" href="javascript:;" data-suonglet='{"cont":".tab-id-1","ong":".su-tab-content-1"}'>Onglet 1</a></li>
<li><a class="tab-id-1" href="javascript:;" data-suonglet='{"cont":".tab-id-1","ong":".su-tab-content-2"}'>Onglet 2</a></li>
<li><a class="tab-id-1" href="javascript:;" data-suonglet='{"cont":".tab-id-1","ong":".su-tab-content-3"}'>Onglet 3</a></li>
<li><a class="tab-id-1" href="javascript:;" data-suonglet='{"cont":".tab-id-1","ong":".su-tab-content-4"}'>Onglet 4</a></li>
</ul>
</nav>
<div class="tab-id-1 su-tab-content-1 su-tab-on">1. Contenu onglet 1</div>
<div class="tab-id-1 su-tab-content-2">2. Contenu onglet 2</div>
<div class="tab-id-1 su-tab-content-3">3. Contenu onglet 3</div>
<div class="tab-id-1 su-tab-content-4">4. Contenu onglet 4</div>
Ce cas est compatible avec la gestion en carrousel quand il y a trop d’onglets :
<div class="su-row">
<section class="su-col-md-16">
<nav class="su-carrousel snap-migrate">
<ul class="su-tabs su-fullwidth su-carrousel-container" data-suswipe='{"sel":"li","halfSwipe":true,"rambo":false}'>
<li><a class="tab-id-2 su-tab-on" href="javascript:;" data-suonglet='{"cont":".tab-id-2","ong":".su-tab-content-1"}'>1. Lorem</a></li>
<li><a class="tab-id-2" href="javascript:;" data-suonglet='{"cont":".tab-id-2","ong":".su-tab-content-2"}'>2. Ipsum dolor sit amet</a></li>
<li><a class="tab-id-2" href="javascript:;" data-suonglet='{"cont":".tab-id-2","ong":".su-tab-content-3"}'>3. Consectetur adipisicing elit</a></li>
<li><a class="tab-id-2" href="javascript:;" data-suonglet='{"cont":".tab-id-2","ong":".su-tab-content-4"}'>4. Sed do eiusmod tempor incididunt</a></li>
<li><a class="tab-id-2" href="javascript:;" data-suonglet='{"cont":".tab-id-2","ong":".su-tab-content-5"}'>5. Ut enim ad minim veniam</a></li>
</ul>
<button class="su-navigation-button su-inside su-left su-inactive" data-suswipeprev><i class="su-icon">gauche</i></button>
<button class="su-navigation-button su-inside su-right" data-suswipenext><i class="su-icon">droite</i></button>
</nav>
<div class="tab-id-2 su-tab-content-1 su-tab-on">1. Contenu onglet 1</div>
<div class="tab-id-2 su-tab-content-2">2. Contenu onglet 2</div>
<div class="tab-id-2 su-tab-content-3">3. Contenu onglet 3</div>
<div class="tab-id-2 su-tab-content-4">4. Contenu onglet 4</div>
<div class="tab-id-2 su-tab-content-5">5. Contenu onglet 5</div>
</section>
</div>
Cas de distribution des onglets
Ici, avec la classe su-distributed
à côté de su-tabs
, on fait en sorte que chaque onglets se répartissent la largeur du parent. Dans cet exemple, dans certaines largeurs de fenêtre (comme en mobile ici), les derniers onglets seront tronqués (mais ils restent glissables)…
<div class="su-row">
<section class="su-col-md-18">
<nav>
<ul class="su-tabs su-distributed">
<li><a class="tab-id-1 su-tab-on" href="javascript:;" data-suonglet='{"cont":".tab-id-1","ong":".su-tab-content-1"}'>Onglet 1</a></li>
<li><a class="tab-id-1" href="javascript:;" data-suonglet='{"cont":".tab-id-1","ong":".su-tab-content-2"}'>Onglet 2 un peu long</a></li>
<li><a class="tab-id-1" href="javascript:;" data-suonglet='{"cont":".tab-id-1","ong":".su-tab-content-3"}'>Onglet 3 encore plus long</a></li>
<li><a class="tab-id-1" href="javascript:;" data-suonglet='{"cont":".tab-id-1","ong":".su-tab-content-4"}'>Onglet 4</a></li>
</ul>
</nav>
<div class="tab-id-1 su-tab-content-1 su-tab-on">1. Contenu onglet 1</div>
<div class="tab-id-1 su-tab-content-2">2. Contenu onglet 2</div>
<div class="tab-id-1 su-tab-content-3">3. Contenu onglet 3</div>
<div class="tab-id-1 su-tab-content-4">4. Contenu onglet 4</div>
</section>
</div>
Il est possible d’empêcher la coupure sur le dernier onglet en rajoutant la classe su-truncate-1
(disponible dans les classes d’aide) sur les liens (<a>
). Cela aura pour effet de tronquer le contenu de chaque onglet trop grand (en ajoutant les « … »).
<div class="su-row">
<section class="su-col-md-12">
<nav>
<ul class="su-tabs su-distributed">
<li><a class="tab-id-1 su-truncate-1 su-tab-on" href="javascript:;" data-suonglet='{"cont":".tab-id-1","ong":".su-tab-content-1"}'>Onglet 1</a></li>
<li><a class="tab-id-1 su-truncate-1" href="javascript:;" data-suonglet='{"cont":".tab-id-1","ong":".su-tab-content-2"}'>Onglet 2 un peu long</a></li>
<li><a class="tab-id-1 su-truncate-1" href="javascript:;" data-suonglet='{"cont":".tab-id-1","ong":".su-tab-content-3"}'>Onglet 3 encore plus long</a></li>
<li><a class="tab-id-1 su-truncate-1" href="javascript:;" data-suonglet='{"cont":".tab-id-1","ong":".su-tab-content-4"}'>Onglet 4</a></li>
</ul>
</nav>
<div class="tab-id-1 su-tab-content-1 su-tab-on">1. Contenu onglet 1</div>
<div class="tab-id-1 su-tab-content-2">2. Contenu onglet 2</div>
<div class="tab-id-1 su-tab-content-3">3. Contenu onglet 3</div>
<div class="tab-id-1 su-tab-content-4">4. Contenu onglet 4</div>
</section>
</div>
Ce cas n’est pas compatible avec la gestion en carrousel !
Liste des classes disponibles
su-tabs
su-tab-on
su-tab-content-1
…su-fullwidth
su-distributed
su-truncate-1
su-negative
Classes anexes
su-carrousel
(dépendant du composant Carrousel (carrousel))snap-migrate
(dépendant du composant Carrousel (carrousel))su-carrousel-container
(dépendant du composant Carrousel (carrousel))su-inactive
(dépendant du composant Carrousel (carrousel))su-navigation-button
(dépendant du composant Navigation buttons (boutons de navigation))su-inside
(dépendant du composant Navigation buttons (boutons de navigation))su-left
(dépendant du composant Navigation buttons (boutons de navigation))su-right
(dépendant du composant Navigation buttons (boutons de navigation))su-fullwidth
(dépendant des Helpers (classes d’aide))su-truncate-1
(dépendant des Helpers (classes d’aide))
Autres attributs
data-suswipe