Як вибрати перший, другий або третій елемент із заданою назвою класу?


79

Як я можу вибрати певний елемент у списку елементів? У мене є таке:

<div class="myclass">my text1</div>
<!-- some other code follows -->
<div>
    <p>stuff</p>
</div>
<div>
    <p>more stuff</p>
</div>
<p>
    <span>Hello World</span>
</p>
<div class="myclass">my text2</div>
<!-- some other code follows -->
<div>
    <p>stuff</p>
</div>
<p>
    <span>Hello World</span>
</p>
<input type=""/>
<div class="myclass">my text3</div>
<!-- some other code follows -->
<div>
    <p>stuff</p>
</div>
<footer>The end</footer>

У мене є клас CSS, div.myclass {doing things}який застосовується до всіх, очевидно, але я також хотів мати можливість вибрати перший, другий або третій div класу, .myclassяк це, незалежно від того, де вони розмічені :

div.myclass:first {color:#000;} 
div.myclass:second {color:#FFF;} 
div.myclass:third {color:#006;}

Майже як вибір індексу jQuery .eq( index ), який я зараз використовую, але мені потрібна альтернатива без сценарію.

Якщо бути конкретним, я шукаю псевдоселектори, а не такі речі, як додавання іншого класу або використання ідентифікаторів, щоб все працювало.


3
А як щодо n-ї дитини CSS , ви спробували це ....? Примітка: Це працює лише в сучасних браузерах
— Сарфраз,

4
Здається, ця примітка є синонімом слова "No IE".
— екстранеон

1
@extraneon: Так, ви правильно зрозуміли :)
— Сарфраз,

2
Це не буде працювати, оскільки немає єдиних батьківських контейнерів, саме тому я хотів вибрати, виходячи з входження імені класу. Мені довелося б переглянути кожен екземпляр і з’ясувати батьківський тег, ідентифікатор або клас, щоб вибрати дочірню дитину. Те, що не дає мені однорідності і важко читається, і його також потрібно буде оновити, якщо батьківські об'єкти / атрибути змінюються.
— Tumharyyaaden

1
Зараз nth-child підтримується IE 9+.
— awilkinson

Відповіді:


34

Ви, напевно, нарешті зрозуміли це між публікацією цього питання та сьогодні, але сама природа селекторів унеможливлює навігацію між ієрархічно не пов'язаними елементами HTML.

Або, простіше кажучи, оскільки ви сказали у своєму коментарі

немає єдиних батьківських контейнерів

... це просто неможливо лише з селекторами, не змінюючи розмітку якимось чином, як показано в інших відповідях.

Ви повинні використовувати .eq()рішення jQuery .


Так, я був в курсі ієрархічних проблем css, але, мабуть, це спонукало мене побажати, щоб я все-таки спонукав опублікувати цю чергу.
— Tumharyyaaden

5
Вам не потрібно використовувати .eq()функції jQuery , ви можете це зробити просто чудово, просто звичайний JavaScript: document.querySelector(".myclass")[n]де n - це число, яке ви хочете
— Зак Сосьє

6
@Zach Saucier: Це було 5 років тому. (... 4 з половиною.)
— BoltClock

5
@ZachSaucier * ahem * У вашому селекторі запитів вам не вистачає " Все " Ka
— KarelG

Приклад: document.querySelectorAll (". Class") [1]
— JohnP2

65

використовувати n-дитина (номер елемента) EX

<div class="parent_class">
    <div class="myclass">my text1</div>
    some other code+containers...

    <div class="myclass">my text2</div>
    some other code+containers...

    <div class="myclass">my text3</div>
    some other code+containers...
</div>
.parent_class:nth-child(1) { };
.parent_class:nth-child(2) { };
.parent_class:nth-child(3) { };

АБО

: n-го типу (номер товару) - це ваш код

.myclass:nth-of-type(1) { };
.myclass:nth-of-type(2) { };
.myclass:nth-of-type(3) { };

35
-1 Ви (і всі, хто підтримав цю відповідь) неправильно зрозуміли частину "якийсь інший код + контейнери". Це не буквально той текст. Це інші елементи . Якщо серед них є інші елементи div, ваші селектори припинять роботу взагалі.
— BoltClock

@BoltClock, ваш коментар спочатку здався мені помилковим ... поки я не розслідував далі. Подивіться мою "відповідь" на цій самій сторінці, яка демонструє проблему, на яку (я думаю) ви намагалися вказати. Дякуємо за Ваш досвід.
— Ендрю Віллемс,

15

Так, ти можеш це зробити. Наприклад, для стилізації тегів td, що складають різні стовпці таблиці, ви можете зробити щось подібне:

table.myClass tr > td:first-child /* First column */
{
  /* some style here */
}
table.myClass tr > td:first-child+td /* Second column */
{
  /* some style here */
}
table.myClass tr > td:first-child+td+td /* Third column */
{
  /* some style here */
}

4
можливо, найкращим рішенням буде n-та дитина: w3.org/TR/selectors/#nth-child-pseudo
— Девід

17
-1 Питання задає вибір n-го з набору не пов’язаних між собою елементів з іменами класів, а не n-го потомка.
— BoltClock

15

Це не стільки відповідь, скільки відповідь без відповіді, тобто приклад, який показує, чому одна з високо оцінених відповідей насправді є неправильною.

Я думав, що така відповідь виглядала добре. Насправді це дало мені те, що я шукав: :nth-of-typeщо, для моєї ситуації, спрацювало. (Отже, дякую за це, @Bdwey.)

Спочатку я прочитав коментар @BoltClock (який говорить, що відповідь по суті неправильна) і відхилив його, оскільки я перевірив свій варіант використання, і він спрацював. Тоді я зрозумів, що @BoltClock мав репутацію 300 000+ (!) І має профіль, де він заявляє, що є гуру CSS. Хм, я подумав, може, мені варто трохи придивитися.

Виявляється наступне: div.myclass:nth-of-type(2)НЕ означає "2-й екземпляр div.myclass". Швидше, це означає "2-й екземпляр div, і він також повинен мати клас" myclass ". Це важлива відмінність, коли divміж вашими div.myclassекземплярами є втручаються s .

Мені знадобився якийсь час, щоб розібратися з цим. Таким чином, щоб допомогти іншим зрозуміти це швидше, я написав приклад , який я вважаю демонструє концепцію більш чітко , ніж письмовий опис: я викрав h1, h2, h3і h4елементи , по суті , бути divs. Я поклав Aклас на деякі з них, згрупував їх у 3, а потім пофарбував 1-й, 2-й та 3-й екземпляри в синій, оранжевий та зелений кольори h?.A:nth-of-type(?). (Але, якщо ви уважно читаєте, вам слід запитати "1-й, 2-й і 3-й екземпляри чого?"). Я також вставив несхожий (тобто різний hрівень) або подібний (тобто той самий hрівень) некласифікований елемент в деякі групи.

Зверніть увагу, зокрема, на останню групу з 3. Тут h3між першим та другим h3.Aелементами вставляється некласифікований елемент . У цьому випадку ніякий другий колір (тобто помаранчевий) не відображається, а третій колір (тобто зелений) відображається на другому екземплярі h3.A. Це показує, що nin h3.A:nth-of-type(n)вважає h3s, а не h3.As.

Ну, сподіваюся, це допомагає. І дякую, @BoltClock.

div {
  margin-bottom: 2em;
  border: red solid 1px;
  background-color: lightyellow;
}

h1,
h2,
h3,
h4 {
  font-size: 12pt;
  margin: 5px;
}

h1.A:nth-of-type(1),
h2.A:nth-of-type(1),
h3.A:nth-of-type(1) {
  background-color: cyan;
}

h1.A:nth-of-type(2),
h2.A:nth-of-type(2),
h3.A:nth-of-type(2) {
  background-color: orange;
}

h1.A:nth-of-type(3),
h2.A:nth-of-type(3),
h3.A:nth-of-type(3) {
  background-color: lightgreen;
}
<div>
  <h1 class="A">h1.A #1</h1>
  <h1 class="A">h1.A #2</h1>
  <h1 class="A">h1.A #3</h1>
</div>

<div>
  <h2 class="A">h2.A #1</h2>
  <h4>this intervening element is a different type, i.e. h4 not h2</h4>
  <h2 class="A">h2.A #2</h2>
  <h2 class="A">h2.A #3</h2>
</div>

<div>
  <h3 class="A">h3.A #1</h3>
  <h3>this intervening element is the same type, i.e. h3, but has no class</h3>
  <h3 class="A">h3.A #2</h3>
  <h3 class="A">h3.A #3</h3>
</div>


1
Ха-ха, мій профіль - трохи язик, зізнаюся ... але це навіть не проблема відповіді, яку я прокоментував - проблема полягає в тому, що він повністю приймає текст "якийсь інший код + контейнери ..." буквально, коли це, очевидно, має на увазі інші фактичні втручаються елементи, які могли б заважати збігам: nth-child () (які, переглянувши це знову, всі написані помилково з різних причин). Але як ви виявили
— ,:

1
Крім того , більше: п-го дитини (): п-о-типу () і довільних селектор в цих інших відповідях моїх: stackoverflow.com/questions/5545649 / ... stackoverflow.com/questions/24657555 / ...
— BoltClock

9

Можливо, за допомогою селектора "~" CSS?

.myclass {
    background: red;
}

.myclass~.myclass {
    background: yellow;
}

.myclass~.myclass~.myclass {
    background: green;
}

Див. Мій приклад на jsfiddle


2
Це працює лише для елементів братів і сестер, а не того, про що вимагає ОП (незалежно від розмітки)
— Зак Сосьє

1
Але це було зручно при написанні модульного тесту React Jest, де псевдоселектори не працюють. Так, спасибі, Netsi1964
— еон

0

Використовуйте CSS nth-childіз назвою класу префікса

div.myclass:nth-child(1) {
  color: #000;
}

div.myclass:nth-child(2) {
  color: #FFF;
}

div.myclass:nth-child(3) {
  color: #006;
}

Це не працює і не відповідає на питання, як уже зазначалося в інших коментарях до іншої пропозиції відповіді :nth-child. Якщо між divs є якісь елементи, це порушує ваше рішення. Будь ласка, видаліть або оновіть свою відповідь.
— cela

0

У майбутньому (можливо) ви зможете використовувати :nth-child(an+b of s)

Насправді, підтримка фільтра “of” у браузері дуже обмежена. Здається, лише Safari підтримує синтаксис.

https://css-tricks.com/almanac/selectors/n/nth-child/

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.