Intereting Posts
Включить html-файл в html с помощью html5 Как перейти к другому разделу страницы? Перейдите в раздел, нажав на список Как связать сборку объектов с пользовательского интерфейса с помощью Thymeleaf и Spring Boot Угловой 4 – Как отобразить шаблон наследующего classа Элементы не находят достаточно места внутри тела – стиль JavaScript Как я могу получить возраст кэш Google любого URL-адреса или веб-страницы? Как центрировать два divs, плавающих рядом друг с другом почему использование трансформирования на значке google внутри кнопки заставляет его потерять эффект «push» при нажатии? (ie11) Вертикальное меню CSS UL LI Данные диаграммы, экспортированные в скрипт приложения, имеют значение null Фильтрация пользовательского ввода вызов Java-сервиса с html-страницы и javascript WPF WebBrowser (3.5 SP1) Всегда сверху – другое предложение отображать HTML в WPF Javascript получает текстовое значение столбца из определенной строки таблицы html

Выберите: first-child или: last-child, который не содержит определенного classа

Предположим, у нас есть список из 5 элементов, и мы хотим применить некоторые конкретные стили к первому или последнему ребенку. Но функциональность этого списка потребует скрыть некоторые его элементы, применив через jQuery class (назовем его .hide ), который установит display: none; на целевые предметы.

Конкретные стили, которые я говорил в начале, должны применяться только к элементам FIRST и LAST, которые видны, поэтому я пытаюсь как-то пропустить те, которые имеют class .hide применяемый к ним и находятся в в то же время первый или последний пункт.

Я уже пытался это сделать, объединив некоторые :not(.hide) и :first-child / :last-child pseudos, но это не сработает. Кроме того, попытка использования селекторов simbling будет работать максимум для первого ребенка, но сейчас нет выбора для выбора предыдущего sibling в css, чтобы это решение не охватывало последнюю проблему с дочерним элементом.

Вот jsfidle, где вы можете лучше понять, что я пытаюсь сделать:

http://jsfiddle.net/3wgxt1oL/

или

HTML

 
Item 1
Item 2
Item 3
Item 4
Item 5

CSS

 .hide {display: none;} div:not(.hide):first-child, div:not(.hide):last-child {color: red;} 

Как уже упоминалось, это невозможно с помощью CSS-селекторов. Причина двоякая:

  • :first-child и :last-child представляют первого и последнего детей своих родителей, период. Они не представляют собой первый и последний дочерние элементы, соответствующие остальной части селектора. Цепочка :not(.hide) просто указывает селектору игнорировать элемент, если он имеет class .hide ; это не изменяет смысл остальной части селектора.

  • В настоящее время нет другого псевдо-classа, доступного для первого или последнего (или n-го) элемента, соответствующего произвольному селектору.

Поскольку вы уже используете jQuery для применения classа .hide , вы можете использовать его для применения другого classа к первому и последнему элементам, которые соответствуют :not(.hide) , а затем предназначены для этих дополнительных classов в вашем CSS.

Вы имеете в виду что-то вроде этого?

 var notHidden = $('div').not('.hide'); notHidden.first().css('color', 'red'); notHidden.last().css('color', 'red'); 

Вы можете добавить определенный стиль для первого видимого дочернего элемента, например:

 .hide {display: none;} div:not(.hide){ color: red; } div:not(.hide) ~ div:not(.hide){ color: black; /*reset everything to normal*/ } 

Но нет выбора последнего видимого ребенка с css. Для этого вам нужно использовать javascript