Thématiques :
Tags :

Breadcrumbs en CSS

Posé ici le jeudi 15 octobre 2009 à 12:31 par Jay Salvat

Les Breadcrumbs (littéralement miettes de pain, certainement en référence au petit Poucet) sont des aides à la navigation permettant de mieux se repérer dans une hiérarchie de pages. Ce type de navigation est graphiquement élégant et ergonomiquement intéressant. Pourquoi s'en priver.

Des breadcrumbs en CSS

Dans mes précédents articles, très trop souvent consacrés à jQuery, j'applique des techniques CSS sans jamais les détailler. Cet article sera le prétexte à en aborder quelques unes en créant progressivement une barre de navigation façon Breadcrumbs en pur CSS à partir d'une simple liste ordonnée.

Etape 1 : Le Html

Partons d'une simple liste ordonnée, sémantiquement idéale pour présenter des liens.

<ul id="breadcrumbs">
    <li><a href="/home">Accueil</a></li>
    <li><a href="/articles">Articles</a></li>
    <li><a href="/articles/css">Css</a></li>
    <li>Réalisation de Breadcrumbs en CSS</li>
</ul>

L'aspect est brut de fonderie.

breadcrumbs5.png

Etape 2 : Les polices

Premier coup de peinture, on change la police, on supprimer les puces et les marges de la liste.

#breadcrumbs {
    font:11px Arial, sans-serif;
    color:#111;
    list-style:none;
    padding:0; margin:0;
}

On y voit déjà plus clair.

breadcrumbs6.png

Etape 3 : Placement horizontal

Présentons maintenant les éléments horizontalement.

#breadcrumbs li {
    float:left;
    padding:0 10px;
} 

Float permet aux éléments de devenir flottant. Padding permet de garder un certain espace entre eux.

Etape 4 : Les liens

Les liens bleus surlignés par défaut manquent un peu de classe. On en change l'aspect.

#breadcrumbs a {
    text-decoration:none;
    color:#999;
}
#breadcrumbs a:hover {
    color:#CC6600;
}

Text-decoration:none annule tout soulignement des liens a de notre barre de navigation. Lorsque le lien est survolé (a:hover) la couleur passe de #999 à #CC6600.

Le résultat commence à être intéressant. L'ajout de quelques images fera le reste.

Etape 5 : Les images

Voici les images utilisées. La première est le fond de la barre de navigation ul. La deuxième est le fond appliqué à chaque élément li de la liste.

breadcrumb-bg.png breadcrumb-right.png

Commençons par la barre.

#breadcrumbs {
    font:11px Arial, sans-serif;
    color:#111;
    list-style:none;
    padding:0; margin:0;

    /* Ajout ici */
    background:url(breadcrumb-bg.png) repeat-x center;
    border:1px solid #CCC;

    border-radius:0.4em; /* Standard */
    -moz-border-radius:0.4em; /* Firefox */
    -webkit-border-radius:0.4em; /* Safari */

    overflow:hidden;
}

L'image breadcrumb-bg.png est placée en fond avec répétition horizontale, ainsi elle couvrira toute la longueur de la barre. Une bordure grise est ajoutée à laquelle on applique un arrondi. Le procédé étant un peu récent, chaque navigateur ne comprend que sa propre méthode. Une fois de plus, n'attendez rien d'Internet Explorer.

Lorsqu'un élément possède des enfants flottants, il voit sa hauteur réduite à zéro. CSS est ainsi fait. Ajouter overflow:hidden à l'élément parent permet de contrer cet étrange comportement.

Poursuivons avec les éléments li de la liste.

#breadcrumbs li {
    float:left;

    /* Ajout ici */
    background:url(breadcrumb-right.png) no-repeat right center;
    padding:0 20px 0 10px;
    height:28px; line-height:28px;
}

L'image du chevron est appliquée à droite de chaque élément li, sans répétition, après avoir pris soin d'élargir le padding pour lui donner la place de se loger. Définir un height égale au line-height permet de centrer le texte verticalement.

Etape 6 : Le bouton Accueil

Le résultat est sympa, nos Breadcrumbs pourraient déjà fonctionner ainsi. Mais pour que la barre soit plus sympa, remplaçons le lien Accueil par un icône.

breadcrumb-home.png

L'icône est tiré d'un pack d'icônes libre de droit. Je n'en retrouve plus la provenance. Que l'auteur m'en excuse.

#breadcrumbs li:first-child a {
    display:block;
    width:30px;
    text-indent:-9999px;
    background:url(home.png) no-repeat center center;
}

Pour remplacer le contenu d'un lien par une image, il faut le passer en block puis lui allouer une largeur (ici 30px). Pour que le texte disparaisse, l'indentation text-indent est réduire à une valeur négative que le fera sortir du cadre. La place étant libre, on applique l'icône en fond.

Et voilà le travail.

Fin : Les étapes bout à bout

L'intégralité du code ci-dessous :

#breadcrumbs {
    font:11px Arial, sans-serif;
    color:#111;
    list-style:none;
    padding:0; margin:0;
    background:url(breadcrumb-bg.png) repeat-x center;
    border:1px solid #CCC;
    border-radius:0.4em;
    -moz-border-radius:0.4em;
    -webkit-border-radius:0.4em;
    overflow:hidden;
}
#breadcrumbs li {
    float:left;
    background:url(breadcrumb-right.png) no-repeat right center;
    padding:0 20px 0 10px;
    height:28px; line-height:28px;
}   
#breadcrumbs li:first-child a {
    display:block;
    width:30px;
    text-indent:-9999px;
    background:url(home.png) no-repeat center center;
}
#breadcrumbs a {
    text-decoration:none;
    color:#999;
}
#breadcrumbs a:hover {
    color:#CC6600;
}

Trackbacks

0 trackback

Commentaires

12 commentaires

Simple, efficace, bravo :)

1. Par Stan le jeudi 15 octobre 2009 à 15:34

Salut,
pourquoi ne pas directement mettre l'image home dans l'html ?
(j'aime pas les techniques pour cacher du texte).
Merci pour cet article très détaillé...
Bonne continuation

2. Par Tchup le mardi 20 octobre 2009 à 23:02

Bonsoir,
Parce qu'une image n'est pas sémantiquement correcte.
Le Html est censé définir de manière neutre, durable et universelle le contenu. Le CSS s'occupe de l'aspect graphique.

Aussi, si demain, tu ne veux plus présenter ta liste sous forme de Breadcrumbs, l'image dans le li n'aura plus aucun sens.

Enfin, si le navigateur ou device lisant ta page n'affiche pas les images, ton lien Home devient invisible.

3. Par Jay Salvat le mardi 20 octobre 2009 à 23:13

l'attribut alt de la balise img n'est pas prévu pour cela ?

4. Par Tchup le mercredi 21 octobre 2009 à 11:40

Je pense que tu confonds accessibilité et sémantique :)

Quoi qu'il en soit procède comme tu préfères. Je pars toujours d'une base sémantique, neutre et le CSS ajoute l'aspect graphique.
Perso je me refuse à mettre une images dans ce cas précis. Demain, qui me dit que je voudrais un icône pour representer le lien Home ?

5. Par Jay Salvat le mercredi 21 octobre 2009 à 11:49

J'appuie Jay : la balise image permet d'insérer une image (super Stan, t'as bien fait de donner une définition de la balise :) ). La sémantique veut donc qu'il s'agisse d'une donnée utile représentée sous la forme d'une image (un graphique, une photo, etc.) et non pas d'une façon sympa de représenter une autre notion sémantique (un lien par exemple).

Comme le dit Jay, que se passe-t-il si on veut afficher le bandeau dans un navigateur texte ? Ou bien dicté par un navigateur vocal ?

Bien séparer la sémantique de la mise en forme peut ne pas être "pratique" dans le cas des images mais je pense que c'est important. Pas uniquement pour "les autres" mais même pour soi. Le jour où on veut harmoniser un site avec des nouvelles icônes, il est tout de même plus simple de modifier une seule CSS que plusieurs fichiers ou une classe PHP.
De plus, il est plus facile de présenter plusieurs styles pour un thème avec des images dans la CSS que dans les fichiers PHP.

Encore une fois, la sémantique n'est pas l'accessibilité. Mettre un alt pour une image est nécessaire pour qu'une personne n'ayant pas accès à l'image (service d'hébergement de l'image temporairement HS ou navigateur sans image) puisse se faire une idée du contenu.

6. Par Stan le mercredi 21 octobre 2009 à 16:42

Et bien moi je dis que j'arrête de courrir après les billets de Jay, il est trop fort :)

Franchement, je ne me souviens pas avoir poster un commentaire sur ton blog mais a chaque fois que je cherche de l'inspiration mon reflexe est : Jay Salvat sur Google lol...

Merci pour tous ces posts...

Jérémy

P.S. : Il faut le dire quand c'est bien ;)

7. Par Jérémy le lundi 30 novembre 2009 à 15:29

Salut, super post!
Je vois juste un petit problème. Si on accède à la page (quelqu'en soit la raison) en ayant désactivé les images, il n'y a plus de lien visible vers la page d'acceuil!
non?
Je me demande si cette technique recevrait une certification accéssibilité (?)
Merci
Hubert
@+

8. Par Hubert le mardi 01 décembre 2009 à 17:23

@Jérémy
Merci ça fait plaisir. J'ai un peu du mal à trouver le temps d'écrire en ce moment. Désolé.

@Hubert
En effet le lien n'apparait plus si les images sont désactivées (même soucis avec une images traditionnelle). Si ton soucis est l'accessibilité à 100%, tous ces effets graphiques sont à proscrire absolument. Seul le contenu doit être privilégié.

9. Par Jay Salvat le mercredi 02 décembre 2009 à 10:45

Je viens de tomber sur votre blog dont je parcours tous les billets avec intérêt ; mes félicitations !
Une remarque cependant sur cet article, concernant le la propriété text-indent: -9999px; que je trouve farfelue et incongrue (si, si !). Il vaudrait selon moi mieux utiliser un color:transparent, qui a pour avantage de se passer de l'aspect 'bidouille' de la propriété à valeur négative.
Ce qui n'enlève malheureusement rien au problème soulevé par Hubert.

10. Par Bastien le samedi 05 décembre 2009 à 23:35

Bonsoir Bastin,

En effet text-indent sent la bidouille. Mais de mémoire c'est la solution la plus "cross-browser".

Si je me souviens bien, color:transparent n'est pas suporté par tous les naviagateurs. Si ?

11. Par Jay Salvat le samedi 05 décembre 2009 à 23:57

Je n'ai pas les moyens de vérifier, mais c'est fort possible (j'aurais même pu m'en douter...)
A réserver à des usages personnels, donc.

12. Par Bastien le dimanche 06 décembre 2009 à 00:40

Obligatoire. Vrai nom apprécié.

Il ne sera ni affiché, ni spammé.

Votre blog ou votre site web.

Constructif, courtois et correctement écrit. SMS proscrit. Merci.