Задать вопрос

Разделители между (возможно скрытими) span'ами

Имеется набор span'ов, образующих перечисление. Пункты разделены запятыми:
<span class="item">Value 1</span><span class="delim">, </span>
<span class="item">Value 2</span><span class="delim">, </span>
<span class="item">Value 3</span>

Когда у всех item стоит display:inline, всё прекрасно. Но иногда надо некоторые значения скрыть (добавить класс с display:none, например). Тут начинаются проблемы, потому что непонятно как скрывать запятые.
Например, при скрытии второго посередине образуются две последовательных запятых, что неправильно. Это легко решается применением соседского селектора, но остаются другие проблемы: что делать, если последний пункт скрыт (перечисление заканчивается запятой) или если скрыт только первый (в некоторых решениях список начинается с запятой).

Какие-нибудь соображения?

PS. Я знаю, что можно легко решить эту задачу на JS, но хочется найти решение на HTML/CSS.
  • Вопрос задан
  • 2909 просмотров
Подписаться 6 Оценить 1 комментарий
Решения вопроса 1
qrazydraqon
@qrazydraqon Автор вопроса
Решение, как обычно, нашлось там, где его никто не ждал. Надо использовать так называемый general sibling selector:

.item.active ~ .item.active:before {
    content: ', ';
}

В таком случае запятая вставляется только перед теми видимыми пунктами перечисления, до которых у того же родителя встречается другой видимый пункт.
Ответ написан
Пригласить эксперта
Ответы на вопрос 5
Shedal
@Shedal
Разделители можно вставлять средствами CSS: www.mojavelinux.com/blog/archives/2005/01/crossbrowser_list_delimiters/
Ответ написан
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
А поместить разделитель в span.item никак?
Ответ написан
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
jsfiddle.net/g3ZXA/ — увы фишка с first-of-type не сработала. Пример со структурой реализованной как у вас уже дали ранее.

Касательно «слишком много JS» — экономите на спичках. К сожалению у меня не вышло при помощи псевдо селекторов nth-of-type или first-of-type реализовать задуманное. Хотя я считаю что это странно. Если вариант с nth-of-type не катит только потому, что отсчет идет по дереву, то firt-of-type почему не работает, мне не ведомо. Если он аналогичен nth-of-type(1) то смысла в нем я не вижу.
Ответ написан
Seldon
@Seldon
Есть много способов эо сделать. зависит от требуемой кроссбраузерности и общей верстки данного блока. Уточните эти детали
Ответ написан
SerDIDG
@SerDIDG
Если пункты скрыты, для чего их рендерить? Пусть сервер строит только те которые нужно. Если пункты динамически отображаются, тогда не вижу проблем, чтобы решить проблему с помощью js. Можно скрывать следующий элемент вместе с item, то бишь скрывать item и его следующий элемент. В джаваскрипте следующий элемент можно получить так: node.nextSibling;
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы