Селектор CSS3: первый тип с именем класса?

230

Можно ли использовать селектор CSS3 :first-of-typeдля выбора первого элемента с заданным именем класса? У меня не получилось пройти тест, так что я думаю, что нет?

Кодекс ( http://jsfiddle.net/YWY4L/ ):

p:first-of-type {color:blue}
p.myclass1:first-of-type {color:red}
.myclass2:first-of-type {color:green}
<div>
  <div>This text should appear as normal</div>
  <p>This text should be blue.</p>
  <p class="myclass1">This text should appear red.</p>
  <p class="myclass2">This text should appear green.</p>
</div>

Адам Янгерс
источник

Ответы:

336

Нет, невозможно использовать только один селектор. :first-of-typeПсевдо-класс выбирает первый элемент его типа ( div, pи т.д.). Использование селектора класса (или селектора типа) с этим псевдоклассом означает выбрать элемент, если он имеет заданный класс (или имеет заданный тип) и является первым среди его типов среди своих братьев и сестер.

К сожалению, CSS не предоставляет :first-of-classселектор, который выбирает только первое вхождение класса. В качестве обходного пути вы можете использовать что-то вроде этого:

.myclass1 { color: red; }
.myclass1 ~ .myclass1 { color: /* default, or inherited from parent div */; }

Пояснения и иллюстрации для обходного пути приведены здесь и здесь .

BoltClock
источник
7
Нет @justNik, это работает для нескольких элементов. .myclass1Селектор будет выбирать каждый элемент .myclass1. Селектор .myclass1 ~ .myclass1использует общий комбинатор одноуровневых элементов для выбора каждого элемента с классом, .myclass1который является последующим одноуровневым элементом элемента с классом .myclass1. Это объясняется удивительно подробно здесь .
WebWanderer
отличный обходной путь! это хорошо сработало для той реализации scroll-spy, в которой использовался наблюдатель пересечения, где некоторые разделы могли быть видны на странице, но мы хотим выделить жирным шрифтом только первый активный.
Завр
45

В проекте CSS Selectors Level 4 предлагается добавить of <other-selector>грамматику в :nth-childселектор . Это позволит вам выбрать n- го потомка, соответствующего данному другому селектору:

:nth-child(1 of p.myclass) 

В предыдущих черновиках использовался новый псевдокласс, :nth-match()так что вы можете увидеть этот синтаксис в некоторых обсуждениях этой функции:

:nth-match(1 of p.myclass)

Теперь это реализовано в WebKit и, следовательно, доступно в Safari, но, похоже, это единственный браузер, который его поддерживает . Имеются заявки на его реализацию Blink (Chrome) , Gecko (Firefox) и запрос на его реализацию в Edge , но нет видимого прогресса по любому из них.

Брайан Кэмпбелл
источник
102
Всего 10 лет, и я могу этим пользоваться. Хотя проект, который я бы использовал, должен быть сделан завтра.
Лайош Месарос
1
: nth-match () отброшен в пользу новых функций для nth-child (), которые пока не очень хорошо поддерживаются: caniuse.com/#feat=css-nth-child-of
nabrown
@ nabrown78 Спасибо за новость, обновил ответ, чтобы быть актуальным.
Брайан Кэмпбелл
19

Это не позволяет использовать селектор CSS3 : first-of-type для выбора первого элемента с заданным именем класса.

Однако, если у целевого элемента есть предыдущий одноуровневый элемент, можно объединить псевдокласс CSS отрицания и соседние селекторы одноуровневого элемента, чтобы сопоставить элемент, который не сразу имеет предыдущий элемент с тем же именем класса:

:not(.myclass1) + .myclass1

Пример полного рабочего кода:

p:first-of-type {color:blue}
p:not(.myclass1) + .myclass1 { color: red }
p:not(.myclass2) + .myclass2 { color: green }
<div>
  <div>This text should appear as normal</div>
  <p>This text should be blue.</p>
  <p class="myclass1">This text should appear red.</p>
  <p class="myclass2">This text should appear green.</p>
</div>

Lodz
источник
9

Я нашел решение для вашей справки. из некоторой группы div выберите из группы двух одинаковых div первого класса

p[class*="myclass"]:not(:last-of-type) {color:red}
p[class*="myclass"]:last-of-type {color:green}

Кстати, я не знаю, почему :last-of-typeработает, но :first-of-typeне работает.

Мои эксперименты на jsfiddle ... https://jsfiddle.net/aspanoz/m1sg4496/

Константин
источник
Это не работает должным образом, как уже видно из скрипки. Единственное, что он делает, это не выбирает последний div, если у него нет класса.
Мартен Коецер
6

Это старая ветка, но я отвечаю, потому что она по-прежнему отображается в списке результатов поиска. Теперь, когда будущее наступило, вы можете использовать псевдоселектор: nth-child.

p:nth-child(1) { color: blue; }
p.myclass1:nth-child(1) { color: red; }
p.myclass2:nth-child(1) { color: green; }

Псевдоселектор: nth-child является мощным - круглые скобки принимают формулы, а также числа.

Подробнее здесь: https://developer.mozilla.org/en-US/docs/Web/CSS/:nth-child

TDavison
источник
6
Да, я не думаю, что это работает, по крайней мере, не в Chrome ... jsfiddle.net/YWY4L/91
Адам
2
Что вы имеете в виду под «теперь, когда будущее наступило»? Это работает только в Safari на момент написания.
Алехандро Гарсия Иглесиас
4

В качестве резервного решения вы можете обернуть ваши классы в родительский элемент следующим образом:

<div>
    <div>This text should appear as normal</div>
    <p>This text should be blue.</p>
    <div>
        <!-- first-child / first-of-type starts from here -->
        <p class="myclass1">This text should appear red.</p>
        <p class="myclass2">This text should appear green.</p>
    </div>
</div>
Гедиминас Бивайнис
источник
1

Не знаю, как это объяснить, но я столкнулся с чем-то похожим сегодня. Не в состоянии установить, .user:first-of-type{}пока .user:last-of-type{}работал нормально. Это было исправлено после того, как я поместил их в div без какого-либо класса или стиля:

https://codepen.io/adrianTNT/pen/WgEpbE

<style>
.user{
  display:block;
  background-color:#FFCC00;
}

.user:first-of-type{
  background-color:#FF0000;
}
</style>

<p>Not working while this P additional tag exists</p>

<p class="user">A</p>
<p class="user">B</p>
<p class="user">C</p>

<p>Working while inside a div:</p>

<div>
<p class="user">A</p>
<p class="user">B</p>
<p class="user">C</p>
</div>
adrianTNT
источник
0

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

например:

<style>
    :not(.bar ~ .bar).bar {
        color: red;
    }
<div>
    <div class="foo"></div>
    <div class="bar"></div> <!-- Only this will be selected -->
    <div class="foo"></div>
    <div class="bar"></div>
    <div class="foo"></div>
    <div class="bar"></div>
</div>
Джонатан.
источник
-5

Просто :firstработает для меня, почему это еще не упомянуто?

Эдуард Ге
источник
3
:firstэто псевдокласс, связанный с печатью.
user247702