В чем разница между p: nth-child (2) и p: nth-of-type (2)? - PullRequest
0 голосов
/ 25 сентября 2018

В чем разница между p:nth-child(2) и p:nth-of-type(2)?

Согласно Справочнику по выбору CSS для W3Schools :

  • p:nth-child(2): выбирается каждый<p> элемент, который является вторым дочерним элементом его родителя.
  • p:nth-of-type(2): Выбирает каждый <p> элемент, который является вторым <p> элементом его родителя.

Разница, по-видимому, заключается в том, что является дочерним по отношению к его родительскому элементу и <p> является элементом его родительского элемента .

Если мы уже упоминаем тип элемента как <p> в обоихпадеж и ключевое слово parent устанавливают отношение parent-child , так в чем же разница?

Ответы [ 8 ]

0 голосов
/ 04 октября 2018

Как MDN говорит:

Псевдокласс : nth-child () CSS сопоставляет элементы на основе их положения в группе братьев и сестер.


Это означает, что p:nth-child(2) будет захватывать только <p> элементы, являющиеся вторым дочерним элементом их родителя.

Однако p:nth-of-type(2) будет захватывать <p> элементы, являющиеся вторым элементом их родителя, независимо от индекса элемента .Это означает, что элемент может иметь 100 дочерних элементов, и если последний дочерний элемент является вторым элементом абзаца среди его родных элементов, на него будут влиять перечисленные стили.

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

элемент nth-child(1) и nth-of-type(1)

Это всегда верно .


элемент имеет значение nth-child(2) и nth-of-type(2)

Это верно, если первые 2 дочерних элемента одного типа.


элемент имеет вид nth-child(3) и nth-of-type(2)

Это верно, когда 1-й и 3-й дочерние элементы одного типа, а 2-й дочерний - нет.


элемент nth-child(2) и nth-of-type(3)

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


Пример:

p:nth-child(2)   { color: red; }
p:nth-of-type(2) { background-color: yellow; }
<div>
  <p>Paragraph 1</p> <!-- p:nth-child(1), p:nth-of-type(1) -->
  <p>Paragraph 2</p> <!-- p:nth-child(2), p:nth-of-type(2) -->
  <span></span>
</div>

<hr />

<div>
  <p>Paragraph 1</p> <!-- p:nth-child(1), p:nth-of-type(1) -->
  <span></span>
  <p>Paragraph 2</p> <!-- p:nth-child(3), p:nth-of-type(2) -->
</div>
0 голосов
/ 02 октября 2018

p:nth-child(2): при этом будут выбраны все элементы <p>, которые являются вторым элементом внутри их родительского элемента.Первый элемент может быть любым другим элементом.например,

<div>
    <h1>Title</h1>
    <p>Paragraph</p> ** p:nth-child(2)
    <p>Paragraph</p>
</div>

<div>
    <p>Paragraph</p>
    <p>Paragraph</p> ** p:nth-child(2)
    <p>Paragraph</p>
</div>

<div>
    <p>Paragraph</p>
    <h1>Text</h1>
    <p>Paragraph</p> ** None are selected
</div>

p:nth-of-type(2): при этом будут выбраны все элементы <p>, являющиеся вторым вхождением элемента <p> внутри их родительского элемента.

<div>
    <h1>Title</h1>
    <p>Paragraph</p>
    <p>Paragraph</p> ** p:nth-of-type(2)
</div>

<div>
    <h1>Title</h1>
    <h2>Subtitle</h2>
    <p>Paragraph</p>
    <h2>Subtitle</h2>
    <h2>Subtitle</h2>
    <h2>Subtitle</h2>
    <p>Paragraph</p> ** p:nth-of-type(2)
</div>

<div>
    <h1>Title</h1>
    <p>Paragraph</p> ** None are selected
</div>
0 голосов
/ 03 октября 2018

Этот вопрос может напомнить вам о В чем разница между: first-child и: first-of-type? - и на самом деле, можно провести множество параллелей * между двумя.Где этот вопрос сильно отличается от другого - это произвольный целочисленный аргумент X, как в :nth-child(X) и :nth-of-type(X).Они в принципе похожи на свои «первый» и «последний» аналоги, но потенциально совпадающие элементы различаются очень в зависимости от того, что на самом деле находится на странице.

Но сначала немного теории.Помните, что простые селекторы являются независимыми условиями .Они остаются независимыми даже при объединении в составные селекторы.Это означает, что p не зависит и не влияет на соответствие :nth-child() или :nth-of-type().Комбинирование их таким способом просто означает, что элементы должны соответствовать всем их условиям одновременно , чтобы соответствовать.

Здесь все становится интереснее.Это независимое сопоставление означает, что я могу проявить изобретательность в том, как я выражаю составные (и сложные) селекторы в терминах простого английского языка, , не меняя значения селекторов .На самом деле, я могу сделать это прямо сейчас так, чтобы различия между :nth-child(2) и :nth-of-type(2) казались настолько значительными, что псевдоклассы также могли быть совершенно не связаны друг с другом (в любом случае, за исключением части «братьев и сестер»)):

  • p:nth-child(2): выберите второго потомка среди своих братьев и сестер, если и только если это элемент p.

  • p:nth-of-type(2): выберите второй элемент p среди его братьев и сестер.

Внезапно они звучат по-другому!И здесь немного пояснений.

Любой элемент может иметь только один дочерний элемент, соответствующий :nth-child(X) для любого целого числа X за раз.Вот почему я решил подчеркнуть «второго ребенка», упомянув его первым.Кроме того, этот дочерний элемент будет соответствовать p:nth-child(X), только если он имеет тип p (помните, что «тип» относится к тэгу).Это очень согласуется с :first-child и :last-child (и, аналогично, p:first-child и p:last-child).

С другой стороны, у :nth-of-type(X) есть два аспекта:

  1. Поскольку «тип» в :nth-of-type() является тем же понятием, что и «тип» в селекторе типов, это семейство псевдоклассов предназначено для использования в сочетании с селекторами типов (хотя они все еще работают независимо).Вот почему p:nth-of-type(2) можно выразить так же кратко, как «Выберите второй элемент p среди его братьев и сестер».Это просто работает!

  2. Однако, в отличие от :first-of-type и :last-of-type, X требует, чтобы в их родительском элементе действительно было столько дочерних элементов одного типа.Например, если в родительском элементе есть только один элемент p, p:nth-of-type(2) не будет ничего совпадать с этим родительским элементом, даже если этот элемент p гарантированно будет соответствовать p:first-of-type и p:last-of-type (а также расширением)., p:only-of-type).

Иллюстрация:

<div class="parent">
  <p>Paragraph</p>
  <p>Paragraph</p>          <!-- [1] p:nth-child(2), p:nth-of-type(2) -->
  <p>Paragraph</p>
  <footer>Footer</footer>
</div>

<div class="parent">
  <header>Header</header>
  <p>Paragraph</p>          <!-- [2] p:nth-child(2) -->
  <p>Paragraph</p>          <!-- [3] p:nth-of-type(2) -->
  <footer>Footer</footer>
</div>

<div class="parent">
  <header>Header</header>
  <figure>Figure 1</figure>
  <p>Paragraph</p>          <!-- [4] -->
  <footer>Footer</footer>
</div>

<div class="parent">
  <header>Header</header>
  <p>Paragraph</p>          <!-- [2] p:nth-child(2) -->
  <figure>Figure 1</figure>
  <hr>
  <figure>Figure 2</figure> <!-- [5] .parent > :nth-of-type(2) -->
  <p>Paragraph</p>          <!-- [5] .parent > :nth-of-type(2) -->
  <p>Paragraph</p>
  <footer>Footer</footer>
</div>

Что выбрано, что нет и почему?

  1. Выбирается как p:nth-child(2), так и p:nth-of-type(2)
    Первые два потомка этого элемента являются элементами p, что позволяет этому элементу одновременно сопоставлять оба псевдокласса для одного и того же целочисленного аргумента Xпотому что все эти независимые условия выполняются:

    • это второй дочерний элемент его родителя;
    • это элемент p
    • это второй p элемент в его родительском элементе.
  2. Выбирается только p:nth-child(2)
    ЭтоВторой дочерний элемент p, поэтому он соответствует p:nth-child(2).

    Но это первый p элемент (первый дочерний элемент header), поэтомуне соответствует p:nth-of-type(2).

  3. Выбирается только p:nth-of-type(2)
    This p element является вторым p элементом после указанного выше, но это третий дочерний элемент, позволяющий ему соответствовать p:nth-of-type(2), но не p:nth-child(2).Помните, опять же, что родительский элемент может иметь только один дочерний элемент, соответствующий :nth-child(X) для определенного X за раз - предыдущий p уже занимает слот :nth-child(2) в контексте этого конкретного родительского элемента.

  4. Не выбран
    Этот элемент p является единственным в своем родительском элементе и не является его вторым дочерним элементом.Поэтому он не соответствует ни :nth-child(2), ни :nth-of-type(2) (даже если он не квалифицирован селектором типа; см. Ниже).

  5. Выбранный .parent > :nth-of-type(2)
    Этот элемент является вторым по своему типу в родительском элементе.Подобно :first-of-type и :last-of-type, исключение селектора типа позволяет псевдоклассу потенциально соответствовать более чем одному элементу в пределах одного и того же родителя.В отличие от них, * сколько на самом деле совпадает, зависит от того, сколько на самом деле элементов каждого типа.

    Здесь есть два элемента figure и три элемента p, позволяющие :nth-of-type(2), чтобы соответствовать figure и p.Но есть только один header, один hr и один footer, поэтому он не будет совпадать с элементами любого из этих типов.

В заключение :nth-child()и :nth-of-type(), с целочисленным аргументом X (то есть не в форме An + B с коэффициентом A, равным n), функционируют почти так же, как :first-child / :last-child и :first-of-type / :last-of-type, с основнымиРазница в том, что аргумент, наряду с самой страницей, влияет на то, сколько различных элементов может быть сопоставлено с :nth-of-type().

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

0 голосов
/ 29 сентября 2018

p:nth-child селектор в «Простом английском» означает выбрать элемент, если:

  • Это элемент абзаца
  • Это второй дочерний элемент родителя (есливторой потомок родителя не <p> css не влияет)

p:nth-of-type селектор, на «простом английском» означает:

  • Выбрать второй абзац<p> ребенок родителя (позаботьтесь о <p>, просто перечислите всех детей <p> и возьмите)

.first p:nth-child(2) {
  background: blue // this css not effect
}

.first p:nth-of-type(2) {
  background: red
}
<div class="first">
  <p>This is 1st paragraph</p>
  <div>This is a div</div>
  <p>This is 2nd paragraph</p>
</div>
0 голосов
/ 28 сентября 2018

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

Запись псевдокласса :nth-child(an+b) представляет элемент с + b-1 родственными элементами перед нимв дереве документов ref

Запись псевдокласса :nth-of-type(an+b) представляет элемент, имеющий + b-1 родственных элементов с то же самое расширенное имя элемента перед ним в дереве документов ref

Из этого мы можем добавить еще важный разница между обоими селекторами заключается в том, что nth-of-type обычно используется с селектором тегов, тогда как nth-child не нуждается в селекторе тегов.Другими словами, nth-of-type может выбрать более одного элемента , но nth-child может выбрать только один элемент .Добавление селектора тега с помощью nth-of-type ограничит выбор одним элементом, а добавление селектора тега к nth-child просто добавит больше ограничений к одному элементу , на который мы нацеливаемся. 1


nth-child ()

Этот селектор выберет 2-го дочернего элемента .container.

.container :nth-child(2) {
  border:1px solid red;
}
<div class="container">
  <p>aaa</p>
  <p>aaa</p>
  <h1>title</h1>
  <p>aaa</p>
  <p>aaa</p>
  <p>aaa</p>
  <h1>title</h1>
</div>

Это тот же селектор, что и выше, но мы добавляем ограничение тега: найдите второго потомка .container, если это тег p, затем выберитеит.

.container p:nth-child(2) {
  border:1px solid red;
}
<div class="container">
  <p>aaa</p>
  <p>aaa</p>
  <h1>title</h1>
  <p>aaa</p>
  <p>aaa</p>
  <p>aaa</p>
  <h1>title</h1>
</div>

Если мы изменим p на h1, ничего не будет выбрано, потому что второй ребенок не является h1:

.container h1:nth-child(2) {
  border:1px solid red;
}
<div class="container">
  <p>aaa</p>
  <p>aaa</p>
  <h1>title</h1>
  <p>aaa</p>
  <p>aaa</p>
  <p>aaa</p>
  <h1>title</h1>
</div>

nth-of-type ()

Этот селектор выберет 2-й p и 2-й h1.nth-of-type будет вести себя как nth-child после группировки элементов по одному типу.

.container :nth-of-type(2) {
  border:1px solid red;
}
<div class="container">
  <p>aaa</p>
  <p>aaa</p>
  <h1>title</h1>
  <p>aaa</p>
  <p>aaa</p>
  <p>aaa</p>
  <h1>title</h1>
</div>

Итак, мы выбираем второго потомка внутри:

<div class="container">
  <p>aaa</p>
  <p>aaa</p> <-- this one -->
  <p>aaa</p>
  <p>aaa</p>
  <p>aaa</p>
</div>

Затем второго потомка внутри этого:

<div class="container">
  <h1>title</h1>
  <h1>title</h1> <-- this one -->
</div>

Добавление селектора тега просто ограничит выбор только одной группой элементов:

.container p:nth-of-type(2) {
  border:1px solid red;
}
.container h1:nth-of-type(2) {
  border:1px solid green;
}
<div class="container">
  <p>aaa</p>
  <p>aaa</p>
  <h1>title</h1>
  <p>aaa</p>
  <p>aaa</p>
  <p>aaa</p>
  <h1>title</h1>
</div>

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

.container :nth-of-type(2) {
  border:1px solid red;
}
.container :nth-child(2) {
  color:red;
}

/* The below will also select the same
  .container p:nth-child(2)
  .container p:nth-of-type(2)
  .container *:nth-child(2)
  .container *:nth-of-type(2)
*/
<div class="container">
  <p>aaa</p>
  <p>aaa</p>
  <p>aaa</p>
  <p>aaa</p>
  <p>aaa</p>
</div>

Другим отличием (это личная мысль) может быть исполнение обоих.nth-child может быть быстрее, так как он учитывает все элементы одного уровня, так что у нас будет один цикл для проверки всех элементов.nth-of-type нужно рассматривать элементы разных типов не одновременно, поэтому, вероятно, у нас будет больше обработки, поэтому она будет медленнее (Это мой собственный вывод, основанный на том, как работают оба. У меня нет формальных доказательств этого) .


1: я рассматриваю выделение внутри одного контейнера, используя целое число в nth-child / nth-of-type.

0 голосов
/ 27 сентября 2018
  • p: nth-child (1): означает, что является первым дочерним элементом любого родителя и имеет тип абзаца.
  • p: nth-of-type (1): означает, чтопервое появление абзаца типа внутри любого родителя

p:nth-child(2){background:#f00;}
p:nth-of-type(2){background:#0f0;}
<div>
   <div>first child</div>
   <p>second child and first element of class "p"</p>
   <p>third child and second element of class "p"</p>
   <p>fourth child and third element of class "p"</p>
</div>
0 голосов
/ 25 сентября 2018

Для p:nth-child(2) он выбирает второй элемент своего родительского элемента, если это абзац, тогда как p:nth-of-type(2) выберет второй абзац своего родительского элемента.Если вы все еще в замешательстве, позвольте мне уточнить это для вас.Рассмотрим фрагмент кода ниже:

<section>
   <h1>Words</h1>
   <p>Little</p>
   <p>Piggy</p>    <!-- Want this one -->
</section>

Здесь p:nth-child(2) выберет <p>Little</p>, потому что это второй дочерний элемент своего родительского элемента и элемент абзаца.

Но, здесь,p:nth-of-type(2) выберет <p>Piggy</p>, потому что выберет второй абзац среди всех абзацев своего родителя.

Справка из: https://css -tricks.com / the-разностное-между-го-ребенка-и-п-о-типа /

0 голосов
/ 25 сентября 2018

Предположим, у нас есть следующий HTML:

<div id="content">
    <p>a1</p>
    <span>a2</span>
    <p>a3</p>
    <span>a4</span>
</div>

1) #content p:nth-child(2) - применяется к 0 элементам
, потому что p:nth-child(2) требует, чтобы он был вторым дочерним элементом и чтобы тег был p, но на самом деле тег является <span>.

2) #content *:nth-child(2) - яблоки для <span>a2</span>
, потому что *:nth-child(2) требует только, чтобы он был вторым дочерним элементом, но не требовал имени тега.* может быть любым именем тега.

3) #content p:nth-of-type(2).- применяется к <p>a3</p>
, поскольку p:nth-of-type(2) означает второе в списке узлов <p>.

4) #content *:nth-of-type(2).- применяется к <p>a3</p> и <span>a4</span>
, поскольку для *:nth-of-type(2) требуется только второй из того же списка узлов тегов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...