Селектор CSS3 для поиска второго div того же класса

Мне нужен селектор CSS, который может найти второй div из 2, который имеет тот же класс. Я посмотрел на nth-child(), но это не то, что мне нужно, так как я не вижу способа уточнить, какой класс мне нужен. Если это поможет, эти 2 div будут братьями и сестрами в документе.

Мой HTML выглядит примерно так:

<div class = "foo">...</div>
<div class = "bar">...</div>
<div class = "baz">...</div>
<div class = "bar">...</div>

И я хочу, чтобы второй div.bar (или последний div.bar тоже работал).

строго говоря (раз уж вы упомянули CSS3): nth-of-type существует, но в основном не поддерживается. reference.sitepoint.com/css/pseudoclass-nthoftype

annakata 12.01.2009 19:41

@annakata Я почти уверен, что nth-of-type не будет, поскольку оба элемента являются div. Смотрите это: jsfiddle.net/ShUHK/1 в современном браузере.

fncomp 10.07.2011 01:25
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
CSS: FlexBox
CSS: FlexBox
Ранее разработчики использовали макеты с помощью Position и Float. После появления flexbox сценарий полностью изменился.
42
2
138 477
9
Перейти к ответу Данный вопрос помечен как решенный

Ответы 9

Селекторы можно комбинировать:

.bar:nth-child(2)

означает «вещь, имеющая класс бар», которая также является вторым потомком.

Чтобы было понятнее другим, это не сработает, потому что это не второй дочерний элемент, это просто второй элемент, который соответствует селектору .bar. Итак, в этом случае элемент .bar:nth-child(2) would actually select the 1st div.bar`, поскольку он принадлежит к классу bar и второму дочернему элементу его родителя.

mpeters 11.04.2014 22:16

Используйте nth:child для выбора элементов тот же родитель.

mcometa 14.11.2015 10:11

Nth-child относится к каждому элементу, присутствующему в домене html. Так же, как этот <div class = "foo"> 1 </div> <h1> 2 </h1> <p> 3 </p> <div class = "foo"> 4> </div>. Если вы выберете nth-child (2), то будет выбран тег заголовка <h1>, а не 4-й элемент. Вы можете использовать nth-of-type для решения этой проблемы. Например: .foo: nth-of-type (2). Данный ответ совершенно неверен

Surya R Praveen 14.03.2016 10:50

Какова именно структура вашего HTML?

Предыдущий CSS будет работать, если HTML такой:

CSS

.foo:nth-child(2)

HTML

<div>
 <div class = "foo"></div>
 <div class = "foo">Find me</div>
...
</div>

Но если у вас есть следующий HTML-код, это не сработает.

<div>
 <div class = "other"></div>
 <div class = "foo"></div>
 <div class = "foo">Find me</div>
 ...
</div>

Проще говоря, нет селектора для получения индекса совпадений от остальной части селектора перед ним.

Если я не могу сделать это по индексу, есть ли способ получить последний элемент в совпавшей группе? Так как в этом случае их всего 2, я знаю, что 2-й также последний.

mpeters 20.11.2008 20:32
Ответ принят как подходящий

ОБНОВИТЬ: Этот ответ был первоначально написан в 2008 году, когда поддержка nth-of-type была в лучшем случае ненадежной. Сегодня я бы сказал, что вы можете безопасно использовать что-то вроде .bar:nth-of-type(2), если вам не нужно поддерживать IE8 и старше.


Исходный ответ от 2008 года следует (обратите внимание, что я бы больше не рекомендовал это!):

Если вы можете использовать Прототип JS, вы можете использовать этот код для установки некоторых значений стиля или добавить другое имя класса:

// set style:
$$('div.theclassname')[1].setStyle({ backgroundColor: '#900', fontSize: '1.2em' });
// OR add class name:
$$('div.theclassname')[1].addClassName('secondclass'); // pun intentded...

(Я не тестировал этот код, и он не проверяет, присутствует ли на самом деле второй div, но что-то вроде этого должно работать.)

Но если вы создаете html-сервер, вы можете просто добавить дополнительный класс для второго элемента ...

+ Штейн: Оказывается, nth-of-type не делает то, что мы думаем. Ваш новый ответ, как и мой старый, неверен. Подробнее см. Мой отредактированный ответ ниже.

mhelvens 16.05.2017 02:16

Этот псевдокласс идеально подходит для моего случая использования. Спасибо Stain G. за ответ и за обновление.

Lyserty 17.06.2019 21:40

Есть ли причина, по которой вы не можете сделать это через Javascript? Я бы посоветовал нацелить селекторы с помощью универсального правила (.foo), а затем выполнить синтаксический анализ, чтобы получить последний foo с помощью Javascript и установить любые дополнительные стили, которые вам понадобятся.

Или, как предлагает Штейн, просто добавьте два класса, если можете:

<div class = "foo"></div>
<div class = "foo last"></div>

.foo {}
.foo.last {}

И для людей, которые ищут ответ, совместимый с jQuery:

$('.foo:eq(1)').css('color', 'red');

HTML:

<div>
  <div class = "other"></div>
  <div class = "foo"></div>
  <div class = "foo">Find me</div>
  ...    
.parent_class div:first-child + div

Я просто использовал приведенное выше, чтобы найти второй div, связав первого потомка с селектором +.

Это работает, только если два div являются братьями и сестрами непосредственный. См. Мой ответ для более общего решения. Конечно, ваш ответ дает преимущество работы в CSS2.

mhelvens 29.09.2012 14:42

Это сработало для меня, спасибо :)

Arslan Ramay 27.12.2020 11:27

Мой первоначальный ответ относительно :nth-of-type просто неверен. Спасибо Полу за указание на это.

Слово «тип» здесь относится только к «типу элемента» (например, div). Оказывается, селекторы div.bar:nth-of-type(2) и div:nth-of-type(2).bar означают одно и то же. Оба элемента select, которые [a] являются вторыми div своего родителя, а [b] имеют класс bar.

Итак, единственное решение на чистом CSS, о котором я знаю, если вы хотите выбрать все элементы определенного селектора, кроме первого, - это общий селектор-брат:

.bar ~ .bar

http://www.w3schools.com/cssref/sel_gen_sibling.asp


Мой первоначальный (неправильный) ответ следующий:

С появлением CSS3 появился еще один вариант. Возможно, он не был доступен, когда вопрос был задан впервые:

.bar:nth-of-type(2)

http://www.w3schools.com/cssref/sel_nth-of-type.asp

Это выбирает второй элемент, который удовлетворяет селектору .bar.

Если вам нужен второй и последний определенного типа элемента (или всех из них, кроме первого), общий родственный селектор также будет работать нормально:

.bar ~ .bar

http://www.w3schools.com/cssref/sel_gen_sibling.asp

Это короче. Но мы, конечно, не любим дублировать код, правда? :-)

Было бы здорово, если бы он поддерживался :)

mpeters 11.04.2014 22:14

Селекторы CSS3 теперь работают в все основные браузеры. Какую поддержку вы ищете?

mhelvens 11.04.2014 23:52

nth-of-type работает только с элементами, а не с классами. вы можете проверить это по ссылкам w3 выше.

Paul B. Hartzog 12.05.2017 20:54

@ PaulB.Hartzog: Хм. Ты прав. Не могу поверить, что я не тестировал это до того, как опубликовал его в 2012 году. (Или с тех пор спецификация изменилась?)

mhelvens 13.05.2017 16:38

работает отлично! если вы используете внутренний загрузочный ящик, это было бы идеальным решением для свойства z-index modal-backdrop второго загрузочного ящика.

Abdullah Ilgaz 04.09.2018 09:27

Разумеется, общий селектор братьев и сестер будет работать только в том случае, если элементы являются братьями и сестрами друг друга. Как насчет того, чтобы второй класс был где-то еще в документе? Я полагаю, это невозможно, верно?

Mike 11.09.2018 17:45

Селектор братьев и сестер был именно тем, что мне было нужно. Спасибо!

mckenna 26.07.2019 19:26

Селектор братьев и сестер тоже работал у меня, 2021 год. Спасибо.

anthonyCam 20.02.2021 02:21

HTML

<h1> Target Bar Elements </h1>

<div class = "foo">Foo Element</div>
<div class = "bar">Bar Element</div>
<div class = "baz">Baz Element</div>
<div class = "bar">Bar Second Element</div>
<div class = "jar">Jar Element</div>
<div class = "kar">Kar Element</div>
<div class = "bar">Bar Third Element</div>

CSS

.bar {background:red;}
.bar~.bar {background:green;}
.bar~.bar~.bar {background:yellow;}

ДЕМОhttps://jsfiddle.net/ssuryar/6ka13xve/

Некоторые объяснения были бы в порядке

avalanche1 25.02.2021 16:16

Сначала вы должны выбрать родительский элемент и установить :nth-of-type(n) для родительского, а затем выбрать нужный элемент. что-то вроде этого :

#topmenu li:nth-of-type(2) ul.childUl {

Это выберет второе подменю из верхнего меню. #topmenu li - родительский элемент.

HTML:

<ul id = "topmenu">
    <li>
        <ul class = "childUl">
            <li></li>
            <li></li>
            <li></li>
        </ul>
    </li>
    <li>
        <ul class = "childUl">
            <li></li>
            <li></li>
            <li></li>
        </ul>
    </li>
    <li>
        <ul class = "childUl">
            <li></li>
            <li></li>
            <li></li>
        </ul>
    </li>

Другие вопросы по теме