Разделители для навигации

107

Мне нужно добавить разделители между элементами навигации. Разделители - это изображения.

Разделители между элементами.

Моя HTML структура как: ol > li > a > img.

Здесь я подхожу к двум возможным решениям:

  1. Чтобы добавить больше liтегов для разделения (бу!),
  2. Включите разделитель в изображение каждого элемента (это лучше, но это дает возможность, что пользователь может щелкнуть, например, «Домашняя страница», но попасть в «Службы», потому что они расположены один за другим, и пользователь может случайно щелкнуть разделитель, который принадлежит «Сервисам»);

Что делать?

даГревис
источник
96
+1 за художественное исполнение.
Джеймс П.

Ответы:

64

Просто используйте изображение-разделитель в качестве фонового изображения на li .

Чтобы оно отображалось только между элементами списка, расположите изображение слева от li , но не на первом.

Например:

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

Этот CSS добавляет изображение к каждому элементу списка, который следует за другим элементом списка - другими словами, ко всем, кроме первого.

NB. Имейте в виду, что соседний селектор (li + li) не работает в IE6, поэтому вам нужно будет просто добавить фоновое изображение к обычному li (с условной таблицей стилей) и, возможно, применить отрицательное поле к одному из краев.

ajcw
источник
2
Использование :beforeпсевдоселектора предотвращает его появление после последнего элемента.
jrue
3
Хорошее решение - работает как шарм - Поддержка IE6? Какая разница! :) Если мы все перестанем поддерживать устаревшие браузеры, возможно, мы заставим людей прекратить их использовать.
Jordan
Работает как chram с, border-leftчтобы провести вертикальную линию между элементами.
Ричард-Дедженн
132

Если нет необходимости использовать изображения для разделителей, вы можете сделать это с помощью чистого CSS.

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

Это помещает полосу между каждым элементом списка, как показано на изображении в исходном вопросе. Но поскольку мы используем соседние селекторы , он не помещает полосу перед первым элементом. И поскольку мы используем :beforeпсевдоселектор, он не помещает его в конец.

Джрю
источник
Вот Это Да! Это именно то, что мне нужно для моего нижнего колонтитула. Конечно, с дополнительным CSS.
Владимир
Технически вы все еще можете использовать изображение, но base64 кодирует его и сохраняет изображение встроенным. css-tricks.com/data-uris
commadelimited
@jrue можно ли также вертикально изменить расположение разделителей? Он не реагирует на верхний отступ / поле.
Флорис
3

Вы можете добавить один liэлемент там, где хотите добавить разделитель

<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>

В CSS вы можете добавить следующий код.

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

Это увеличит скорость выполнения, так как не будет загружаться изображение. просто проверь это .. :)

Раджив Пингейл
источник
не могли бы вы объяснить как? Но всегда есть другой путь ... CSS3: мы можем добавить N-й элемент и добавить к нему разделитель.
Rajiv Pingale
1
Драт, я вляпался в какой-то беспорядок. Я просто потратил 30 минут на поиск документов по стандартам, брошюр RWD и даже попробовал разные программы чтения с экрана, чтобы доказать свою точку зрения. Однако, по крайней мере, программы чтения с экрана достаточно умны, чтобы НЕ ПРОЧИТАТЬ ГРОМКО пустые маркеры (и не перечислять отсутствующие параметры при использовании @ ol @ вместо @ ul @). Поэтому я могу просто указать, что использование @ li @ здесь относится к той же категории, что и использование таблицы для достижения макета столбцов.
Volker Stolz
3

Другое решение в порядке, но нет необходимости добавлять разделитель в самом конце, если используется : after, или в самом начале, если используется : before .

ТАК:

случай: после

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

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

случай: до

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

.link:first-child:before {
  content: '';
}
T04435
источник
3

Чтобы разделитель располагался по центру по вертикали относительно текста меню,

.menustyle li + li:before

    {
        content: " | ";
        padding: 0;
        position: relative; 
        top: -2px;
    }
user7149870
источник
2

Добавьте разделитель к liфону и убедитесь, что ссылка не расширяется, чтобы закрыть разделитель, что означает, что разделитель не будет доступен для нажатия.

Суфиан Хассу
источник
2

Для тех, кто использует Sass , я написал для этой цели миксин :

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

Пример:

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

Что даст вам это:

li+li:before {
  content: "|";
  padding: 0 1em;
}
d4nyll
источник
Это не показывает '|' по какой-то причине? Почему бы и нет?
James111
Не волнуйтесь, я понял, как это сделать. Мне также пришлось добавить: after к последнему ребенку, чтобы сделать содержимое дочернего элемента, которому не нужен seperator = content: ""
James111
2

Я считаю, что лучшее решение для этого - это то, что я использую, и это естественная граница css:

border-right:1px solid;

Возможно, вам придется позаботиться о заполнении, например:

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

Наконец, если вы не хотите, чтобы последний li имел эту разделяющую границу, присвойте last-child значение none в графе right, например:

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

Удачи :)

Ави
источник
1

Поместите его в качестве фона в элемент списка:

<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 */

Затем я рекомендую другую разметку для доступности:
вместо того, чтобы встраивать изображения в строку, поместите текст в виде текста, окружите каждое диапазоном, примените изображение в качестве фона, а затем скройте текст с помощью display: none - this дает гораздо больше гибкости стиля и позволяет использовать мозаику с изображением bg шириной 1 пиксель, экономит пропускную способность, и вы можете встраивать его в спрайт CSS, который сохраняет HTTP-вызовы:

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;}

ОБНОВЛЕНИЕ ОК, я вижу, что другие получили аналогичный ответ до меня - и я отмечаю, что Джон также включает средства для предотвращения появления разделителя перед первым элементом с помощью селектора li + li - что означает, что любой li идет после другого li.

Фауст
источник
Да, я только что посмотрел, и вы правы. Мой ответ отредактирован, и я даю вам +1, так как вы руководили.
Faust
Спасибо. +1 за отступы, которые я забыл добавить.
ajcw