Séparateurs Pour La Navigation

J'ai besoin d'ajouter des séparateurs entre les éléments de navigation. Les séparateurs sont des images.

Séparateurs entre les éléments.

Ma structure HTML est comme: ol > li > A > img .

Ici, je viens à deux solutions possibles:

  1. pour ajouter plus de balisesli pour la séparation (boo!),
  2. inclure le séparateur dans l'image de chaque élément (c'est mieux, mais il est possible que l'utilisateur clique sur, par exemple, "Home", mais arrive à "Services", car ils sont l'un derrière l'autre et l'utilisateur peut accidentellement cliquer sur le séparateur qui appartient à "Services");

Que faire?

103
demandé sur daGrevis 2011-04-16 22:57:04

9 réponses

Utilisez simplement l'image du séparateur comme image d'arrière-plan sur le li.

Pour qu'elle n'apparaisse qu'entre les éléments de la liste, positionnez l'image à gauche du li, mais pas sur le premier.

Par exemple:

#nav li + li {
    background:url('seperator.gif') no-repeat top left;
    padding-left: 10px
}

Ce CSS ajoute l'image à chaque élément de liste qui suit un autre élément de liste-en d'autres termes, Tous sauf le premier.

NB. Sachez que le sélecteur adjacent (li + li) ne fonctionne pas dans IE6, vous devrez donc simplement ajouter l'arrière-plan image au Li conventionnel (avec une feuille de style conditionnelle) et peut-être appliquer une marge négative à l'un des bords.

61
répondu ajcw 2015-01-17 23:28:59

S'il n'y a pas un besoin pressant d'utiliser des images pour les séparateurs, vous pouvez le faire avec du CSS pur.

nav li + li:before{
    content: " | ";
    padding: 0 10px;
}

Cela place une barre entre chaque élément de la liste, tout comme l'image dans la question originale décrite. Mais puisque nous utilisons les sélecteurs adjacents , cela ne Place pas la barre avant le premier élément. Et puisque nous utilisons le pseudo sélecteur :before, Il n'en met pas un à la fin.

123
répondu jrue 2012-07-20 07:30:17

Les autres solutions sont correctes, mais il n'est pas nécessaire d'ajouter un séparateur à la toute fin si vous utilisez : after ou au tout début si vous utilisez : before.

Donc:

Cas: après

.link:after {
  content: '|';
  padding: 0 1rem;
}

.link:last-child:after {
  content: '';
}

Cas: avant

.link:before {
  content: '|';
  padding: 0 1rem;
}

.link:first-child:before {
  content: '';
}
3
répondu T04435 2016-04-28 15:30:09

Pour que le séparateur soit centré verticalement par rapport au texte du menu,

.menustyle li + li:before

    {
        content: " | ";
        padding: 0;
        position: relative; 
        top: -2px;
    }
3
répondu user7149870 2016-11-12 13:33:58

Ajoutez le séparateur à l'arrière-plan li et assurez-vous que le lien ne s'étend pas pour couvrir le séparateur, ce qui signifie que le séparateur ne sera pas cliquable.

2
répondu Soufiane Hassou 2011-04-16 19:01:33

, Vous pouvez ajouter un li élément sur lequel vous souhaitez ajouter diviseur

<ul>
    <li> your content </li>
    <li class="divider-vertical-second-menu"></li>
    <li> NExt content </li>
    <li class="divider-vertical-second-menu"></li>
    <li> last item </li>
</ul>

En CSS, vous pouvez ajouter le code suivant.

.divider-vertical-second-menu{
   height: 40px;
   width: 1px;
   margin: 0 5px;
   overflow: hidden;
   background-color: #DDD;
   border-right: 2px solid #FFF;
}

Cela vous augmentera la vitesse d'exécution car il ne chargera aucune image. juste de la tester.. :)

2
répondu Rajiv Pingale 2012-08-15 05:50:32

Pour ceux qui utilisent Sass , j'ai écrit un mixin à cette fin:

@mixin addSeparator($element, $separator, $padding) {
    #{$element+'+'+$element}:before {
        content: $separator;
        padding: 0 $padding;
    }
}

Exemple:

@include addSeparator('li', '|', 1em);

, Qui vous donnera ceci:

li+li:before {
  content: "|";
  padding: 0 1em;
}
2
répondu d4nyll 2015-01-23 04:13:17

Mettez-le en arrière-plan sur l'élément de liste:

<ul id="nav">
    <li><a><img /></a></li>
    ...
    <li><a><img /></a></li>
</ul>

#nav li{background: url(/images/separator.gif) no-repeat left; padding-left:20px;} 
/* left padding creates a gap between links */

Ensuite, je recommande un balisage différent pour l'accessibilité:
Plutôt que d'intégrer les images en ligne, mettez du texte en tant que texte, entourez chacune d'une portée, appliquez l'image en arrière-plan, puis masquez le texte avec display: none - cela donne beaucoup plus de flexibilité de style, et vous permet d'utiliser le carrelage avec une image BG 1px large, économise de la bande passante, et vous appels:

HTML:

<ul id="nav">
    <li><a><span>link text</span></a></li>
    ...
    <li><a><span>link text</span></a></li>
</ul

CSS:

#nav li{background: url(/images/separator.gif) no-repeat left; padding-left:20px;} 
#nav a{background: url(/images/nav-bg.gif) repeat-x;}
#nav a span{display:none;}

Mise à jour OK, je vois que d'autres ont obtenu une réponse similaire avant moi - Et je note que John inclut également un moyen pour empêcher le séparateur d'apparaître avant le premier élément, en utilisant le sélecteur li + li - ce qui signifie que tout li venant après un autre li.

1
répondu Faust 2011-04-16 19:28:01

Je crois que la meilleure solution pour cela, c'est ce que j'utilise, et c'est une bordure CSS naturelle:

border-right:1px solid;

Vous devrez peut-être prendre soin du remplissage comme:

padding-left: 5px;
padding-right: 5px;

Enfin, si vous ne voulez pas que le dernier li ait cette frontière séparée, donnez son dernier enfant "none" dans "border-right" comme ceci:

li:last-child{
  border-right:none;
}

Bonne chance :)

0
répondu Avi 2017-02-06 09:37:57