Роздільники навігації


107

Мені потрібно додати роздільники між елементами навігації. Роздільники - зображення.

Роздільники між елементами.

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

Тут я приходжу до двох можливих рішень:

  1. Щоб додати більше liтегів для розділення (boo!),
  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 (із умовною таблицею стилів) і, можливо, застосувати негативне поле до одного з ребер.


2
Використання :beforeпсевдоселектора запобігає появі після останнього елемента.
jrue

3
Приємне рішення - працює на зразок чарівності -IE6 підтримка? Кого хвилює! :) Якщо ми всі перестанемо підтримувати застарілі браузери, ніж можливо, ми змусимо людей припинити їх використовувати.
Йордан

Працює як храм з a, border-leftщоб намалювати вертикальну лінію між елементами.
Річард-Дегенне

132

Якщо немає необхідності використовувати зображення для роздільників, ви можете зробити це за допомогою чистого CSS.

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

Це ставить смугу між кожним елементом списку, як і зображення, описане в оригінальному запитанні. Але оскільки ми використовуємо сусідні селектори , він не ставить смужку перед першим елементом. А оскільки ми використовуємо :beforeселектор псевдо, він не ставить його в кінці.


Оце Так! Це саме те, що мені потрібно для мого нижнього колонтитулу. Звичайно, з деякими додатковими CSS.
Володимир

Технічно ви все ще можете використовувати зображення, але base64 кодує його і зберігає зображення в рядку. css-tricks.com/data-uris
comadelimited

@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: Ми можемо додати get Nth Element і додати до нього дільник.
Раджив Пінгале

1
Драт, якийсь безлад я потрапив у себе. Я щойно провів 30 хвилин, вкорінюючись у документах зі стандартними документами, пам’ятках із RWD, і навіть спробував різні читачі екранів, щоб довести свою думку. Однак принаймні читачі екрану є досить розумними, щоб НЕ ЧИТАТИ ЗАРУДУ пусті кулі (а також не перераховувати відсутні параметри при використанні @ ol @ замість @ ul @). Тож я можу лише зазначити, що використання @ li @ тут знаходиться в тій же категорії, що і використання таблиці для досягнення компонування стовпців.
Волкер Столц

3

Інше рішення в порядку, але немає потреби додавати роздільник в останню чергу, якщо використовується : після або на самому початку, якщо використовується : раніше .

ТАК:

випадок: після

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

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

випадок: раніше

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

.link:first-child:before {
  content: '';
}

3

Щоб роздільник був розташований вертикально по центру відносно тексту меню,

.menustyle li + li:before

    {
        content: " | ";
        padding: 0;
        position: relative; 
        top: -2px;
    }

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

Це не відображається "|" з якоїсь причини? Будь-яка причина, чому ні?
James111

Не хвилюйтесь, я зрозумів, як це зробити. Я також повинен був додати: after до останньої дитини, щоб зробити вміст дитини, яка не потребує seperator = content: ""
James111

2

Я вважаю, що найкращим рішенням для цього є те, що я використовую, і це природний кордон css:

border-right:1px solid;

Можливо, вам доведеться подбати про підкладці, як:

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

Нарешті, якщо ви не хочете, щоб у останнього лі була така межа, яка відокремлюється, вкажіть "останнє дочірнє" "жодне" у "правій межі", як це:

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

Далі я рекомендую іншу розмітку для доступності:
Замість того, щоб вставляти зображення в рядки, вводити текст у вигляді тексту, оточувати кожен з прольотом, застосовувати зображення як фон фоном, а потім приховати текст із відображенням: немає - це надає набагато більше гнучкості в стилі та дозволяє використовувати плитку із зображенням широкого формату 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 приходить після іншого лі.


Так - я просто так подивився, і ти маєш рацію. Моя відповідь відредагована, і я givnig твій +1 відтоді, як ти вела.
Фауст

Дякую. +1 для прокладки, яку я забув додати.
ajcw
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.