Мне нужен селектор 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 тоже работал).
@annakata Я почти уверен, что nth-of-type не будет, поскольку оба элемента являются div. Смотрите это: jsfiddle.net/ShUHK/1 в современном браузере.






Селекторы можно комбинировать:
.bar:nth-child(2)
означает «вещь, имеющая класс бар», которая также является вторым потомком.
Чтобы было понятнее другим, это не сработает, потому что это не второй дочерний элемент, это просто второй элемент, который соответствует селектору .bar. Итак, в этом случае элемент .bar:nth-child(2) would actually select the 1st div.bar`, поскольку он принадлежит к классу bar и второму дочернему элементу его родителя.
Используйте nth:child для выбора элементов тот же родитель.
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). Данный ответ совершенно неверен
Какова именно структура вашего 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-й также последний.
ОБНОВИТЬ: Этот ответ был первоначально написан в 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 не делает то, что мы думаем. Ваш новый ответ, как и мой старый, неверен. Подробнее см. Мой отредактированный ответ ниже.
Этот псевдокласс идеально подходит для моего случая использования. Спасибо Stain G. за ответ и за обновление.
Есть ли причина, по которой вы не можете сделать это через 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.
Это сработало для меня, спасибо :)
Мой первоначальный ответ относительно :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
Это короче. Но мы, конечно, не любим дублировать код, правда? :-)
Было бы здорово, если бы он поддерживался :)
Селекторы CSS3 теперь работают в все основные браузеры. Какую поддержку вы ищете?
nth-of-type работает только с элементами, а не с классами. вы можете проверить это по ссылкам w3 выше.
@ PaulB.Hartzog: Хм. Ты прав. Не могу поверить, что я не тестировал это до того, как опубликовал его в 2012 году. (Или с тех пор спецификация изменилась?)
работает отлично! если вы используете внутренний загрузочный ящик, это было бы идеальным решением для свойства z-index modal-backdrop второго загрузочного ящика.
Разумеется, общий селектор братьев и сестер будет работать только в том случае, если элементы являются братьями и сестрами друг друга. Как насчет того, чтобы второй класс был где-то еще в документе? Я полагаю, это невозможно, верно?
Селектор братьев и сестер был именно тем, что мне было нужно. Спасибо!
Селектор братьев и сестер тоже работал у меня, 2021 год. Спасибо.
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/
Некоторые объяснения были бы в порядке
Сначала вы должны выбрать родительский элемент и установить :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>
строго говоря (раз уж вы упомянули CSS3): nth-of-type существует, но в основном не поддерживается. reference.sitepoint.com/css/pseudoclass-nthoftype