У меня есть набор элементов с именем класса red
, но я не могу выбрать первый элемент с class="red"
использованием следующего правила CSS:
.red:first-child {
border: 5px solid red;
}
<p class="red"></p>
<div class="red"></div>
Что не так в этом селекторе и как мне его исправить?
Благодаря комментариям я понял, что элемент должен быть первым потомком своего родителя, чтобы быть выбранным, что не так, как у меня. У меня есть следующая структура, и это правило не выполняется, как указано в комментариях:
.home .red:first-child {
border: 1px solid red;
}
<div class="home">
<span>blah</span>
<p class="red">first</p>
<p class="red">second</p>
<p class="red">third</p>
<p class="red">fourth</p>
</div>
Как я могу нацелиться на первого ребенка в классе red
?
css
css-selectors
Раджу
источник
источник
:first-of-type
это работает.Ответы:
Это один из самых известных примеров недопонимания авторами того, как
:first-child
работает. Представленный в CSS2 ,:first-child
псевдокласс представляет самого первого потомка своего родителя . Вот и все. Существует очень распространенное заблуждение, что он выбирает тот дочерний элемент, который первым соответствует условиям, заданным остальной частью составного селектора. Из - за способа селекторов работы (см здесь для объяснения), что просто не соответствует действительности.Селектор 3-го уровня представляет
:first-of-type
псевдокласс , который представляет первый элемент среди братьев и сестер своего типа. Этот ответ с иллюстрациями объясняет разницу между:first-child
и:first-of-type
. Однако, как и в случае:first-child
, он не смотрит на какие-либо другие условия или атрибуты. В HTML тип элемента представлен именем тега. В вопросе этот тип естьp
.К сожалению, не существует аналогичного
:first-of-class
псевдокласса для сопоставления первого дочернего элемента данного класса. Один из обходных путей, который мы с Леа Вероу придумали для этого (хотя и совершенно независимо), заключается в том, чтобы сначала применить желаемые стили ко всем элементам этого класса:... затем "отменим" стили для элементов с классом, которые идут после первого , используя общий братский комбинатор
~
в главном правиле:Теперь только первый элемент с
class="red"
будет иметь границу.Вот иллюстрация того, как применяются правила:
Правила не применяются; Граница не отображается
Этот элемент не имеет класса
red
, поэтому он пропущен.Применяется только первое правило; красная граница отображается.
Этот элемент имеет класс
red
, но ему не предшествуют элементы с классомred
в родительском элементе . Таким образом, второе правило не применяется, только первое, и элемент сохраняет свою границу.Оба правила применяются; Граница не отображается
Этот элемент имеет класс
red
. Ему также предшествует хотя бы еще один элемент классаred
. Таким образом, оба правила применяются, и второеborder
объявление отменяет первое, тем самым «отменяя» его, так сказать.В качестве бонуса, хотя она была введена в селекторов 3, общий родственный комбинатор на самом деле очень хорошо поддерживается IE7 и выше, в отличие
:first-of-type
и:nth-of-type()
которые поддерживаются только IE9 вперед. Если вам нужна хорошая поддержка браузера, вам повезло.Фактически, тот факт, что родственный комбинатор является единственным важным компонентом в этой технике, и он имеет такую удивительную поддержку браузера, делает эту технику очень универсальной - вы можете адаптировать ее для фильтрации элементов другими вещами, кроме селекторов классов:
Вы можете использовать это для обхода
:first-of-type
в IE7 и IE8, просто предоставив селектор типа вместо селектора класса (опять же, больше о его неправильном использовании здесь в следующем разделе):Вы можете фильтровать по селекторам атрибутов или любым другим простым селекторам вместо классов.
Вы также можете комбинировать эту переопределяющую технику с псевдоэлементами, даже если технически псевдоэлементы не являются простыми селекторами.
Обратите внимание, что для того, чтобы это работало, вам нужно заранее знать, какими будут стили по умолчанию для других элементов вашего брата, чтобы вы могли переопределить первое правило. Кроме того, так как это включает в себя переопределение правил в CSS, вы не можете добиться того же с помощью одного селектора для использования с API селекторов или CSS-локаторами Selenium .
Стоит отметить, что в Selectors 4 введено расширение для
:nth-child()
обозначения (изначально это был совершенно новый псевдокласс:nth-match()
), которое позволит вам использовать что-то вроде:nth-child(1 of .red)
гипотетического.red:first-of-class
. Это сравнительно недавнее предложение, поэтому недостаточно совместимых реализаций, чтобы его можно было использовать на производственных площадках. Надеюсь, это скоро изменится. В то же время предложенный мной обходной путь должен работать в большинстве случаев.Имейте в виду, что этот ответ предполагает, что вопрос ищет каждый первый дочерний элемент, который имеет данный класс. Не существует ни псевдокласса, ни даже общего CSS-решения для n-го совпадения сложного селектора по всему документу - вопрос о том, существует ли решение, сильно зависит от структуры документа. JQuery предоставляет
:eq()
,:first
,:last
и многое другое для этой цели, но еще раз отметить , что они работают очень по- разному с:nth-child()
соавт . Используя API селекторов, вы можете использоватьdocument.querySelector()
для получения самого первого соответствия:Или используйте
document.querySelectorAll()
с индексатором, чтобы выбрать любое конкретное совпадение:Хотя
.red:nth-of-type(1)
решение в первоначальном принятом ответе Филиппа Добмайера работает (которое изначально было написано Мартином, но с тех пор удалено), оно не ведет себя так, как вы ожидаете.Например, если вы хотите выбрать только
p
исходную разметку:... тогда вы не можете использовать
.red:first-of-type
(эквивалентно.red:nth-of-type(1)
), потому что каждый элемент является первым (и единственным) одним из его типов (p
иdiv
соответственно), поэтому селектор будет сопоставлять оба элемента .Когда первый элемент определенного класса также является первым его типом , псевдокласс будет работать, но это происходит только по совпадению . Такое поведение продемонстрировано в ответе Филиппа. В тот момент, когда вы вставляете элемент того же типа перед этим элементом, селектор потерпит неудачу. Принимая обновленную разметку:
Применение правила с помощью
.red:first-of-type
будет работать, но как только вы добавите другоеp
без класса:... селектор немедленно потерпит неудачу, потому что первый
.red
элемент теперь является вторымp
элементом.источник
:last-of-class
? Выберите последний элемент класса.general sibling selector ~
работает как a:not(:first-of-*)
для определенного типа, я предполагаю, что оно должно применять правило для каждого соответствующего элемента, но оно применяется только для первого соответствия, даже когда есть 3 или более возможных совпадений.:nth-child(1 of .foo)
расширение уже был реализован на Safari 9.1+. (Я не проверял, хотя):first-child
Селектор предназначен, как говорит название, чтобы выбрать первый ребенок родительского тега. Дочерние элементы должны быть встроены в один родительский тег. Ваш точный пример будет работать (только что попробовал здесь ):Может быть, вы вложили свои теги в разные родительские теги? Ваши теги класса
red
действительно первые теги под родителем?Также обратите внимание, что это не относится только к первому такому тегу во всем документе, но каждый раз, когда вокруг него оборачивается новый родитель, например:
first
иthird
будет красным тогда.Обновить:
Я не знаю, почему Мартин удалил свой ответ, но у него было решение,
:nth-of-type
селектор:Кредиты Мартыну . Больше информации, например, здесь . Имейте в виду, что это селектор CSS 3, поэтому не все браузеры распознают его (например, IE8 или старше).
источник
:nth-of-type
сталкивается с небольшой проблемой - он вообще не работает ни в одной текущей версии IE..red:nth-of-type(1)
выберет любой элемент, который (а) является первым потомком своего типа элемента, а (б) имеет класс «красный». Так что, если в примере первый <p> не имеет класса «красный», он не будет выбран. В качестве альтернативы, если <span> и первый <p> оба имеют класс «красный», они оба будут выбраны. jsfiddle.net/fvAxn:first-of-type
эквивалентно:nth-of-type(1)
, так что, конечно, это тоже работает. Он также может потерпеть неудачу также, по той же причине, которая указана в моем ответе.:nth-of-type
означает «элемент / тег», когда он говорит «тип». Таким образом, он рассматривает только элемент, а не такие вещи, как классы.Правильный ответ:
Часть I: Если элемент является первым по отношению к своему родителю и имеет класс «красный», он получает границу.
Часть II: Если элемент «.red» не является первым по отношению к своему родительскому элементу, но сразу же следует за элементом без класса «.red», он также должен заслужить честь упомянутой границы.
Скрипка или этого не случилось.
Ответ Филиппа Добмайера, хотя и принят, неверен - см. Прилагаемую скрипку.
Ответ BoltClock будет работать, но излишне определяет и перезаписывает стили
(особенно проблема, когда в противном случае он наследовал бы другую границу - вы не хотите объявлять другую границу: нет)
РЕДАКТИРОВАТЬ: В случае, если у вас есть «красный» после не красный несколько раз, каждый «первый» красный получит границу. Чтобы предотвратить это, нужно будет использовать ответ BoltClock. Смотри скрипку
источник
.red
следует:not(.red)
не всегда делает его первым.red
среди своих братьев и сестер. И если граница должна быть унаследована, это просто вопрос объявления,border: inherit
а неborder: none
правила переопределения.first-child
наlast-child
, но после тестирования я вижу, что это не всегда помогает.Вы могли бы использовать
first-of-type
илиnth-of-type(1)
источник
<p></p>
междуspan
и ваш первыйp
элемент сred
классом. Посмотрите на это JSFiddle .Приведенные выше ответы слишком сложны.
Это выберет первый тип класса. MDN Source
источник
first-type
был переименован вfirst-of-type
<span>
, и у нескольких есть классhighlight
..highlight:first-of-type
Селектор будет выбрать первый экземпляр «типа» с выбранным классом, в этом примере первый<span>
и не первый экземпляр классаhighlight
. Стиль будет реализован только в том случае, если этот первый экземпляр span также будет выделен классом. ( codepen.io/andrewRmillar/pen/poJKJdJ )Чтобы соответствовать вашему селектору, элемент должен иметь имя класса
red
и должен быть первым потомком своего родителя.источник
Поскольку другие ответы охватывают то , что не так с этим, я попытаюсь вторую половину, как это исправить. К сожалению, я не знаю, что у вас есть решение только для CSS , по крайней мере , я не могу придумать . Есть и другие варианты, хотя ....
Присвойте
first
класс элементу при его создании, например так:CSS:
Этот CSS соответствует только элементы с обоих
first
иred
классами.В качестве альтернативы, сделайте то же самое в JavaScript, например, вот какой jQuery вы бы использовали для этого, используя тот же CSS, что и выше:
источник
:first-of-class
, я бы также предложил добавить дополнительный класс к первому элементу. Кажется, самое простое решение на данный момент.Я получил это в моем проекте.
источник
Согласно вашей обновленной проблеме
как насчет
Это выберет класс home , затем span span и, наконец, все .red элементы , которые размещаются сразу после элементов span.
Ссылка: http://www.w3schools.com/cssref/css_selectors.asp
источник
Вы можете использовать nth-of-type (1), но убедитесь, что сайту не требуется поддержка IE7 и т. Д. В этом случае используйте jQuery для добавления класса тела, затем найдите элемент через класс тела IE7, затем имя элемента, затем добавьте в стиле nth-child к нему.
источник
Вы можете изменить свой код на что-то вроде этого, чтобы заставить его работать
Это делает работу за вас
Вот ссылка CSS от SnoopCode об этом.
источник
Я использую ниже CSS, чтобы иметь фоновое изображение для списка ul li
источник
Попробуй это :
источник
По какой-то причине ни один из приведенных выше ответов, по-видимому, не рассматривал случай реального первого и единственного первого потомка родителя.
Все приведенные выше ответы потерпят неудачу, если вы захотите применить стиль только к первому дочернему классу в этом коде.
источник
:first-child
псевдокласса вводит в заблуждение, поскольку он добавляет,.class_name
прежде чем он не изменит способ его работы, а просто заставит его действовать как фильтр. Если у вас есть div раньше,<div class="class_name">First content that need to be styled</div>
ваш селектор не будет совпадать, поскольку он не является первым дочерним элементом.Попробуйте это просто и эффективно
источник
Я считаю, что с помощью относительного селектора
+
для выбора элементов, размещенных сразу после, работает здесь лучше всего (как предлагалось ранее).В этом случае также возможно использовать этот селектор
но это селектор элемента, а не класс.
Вот хороший список селекторов CSS: https://kolosek.com/css-selectors/
источник
Попробуйте это решение:
CodePen ссылка
источник