Какая разница между:Во-первых-ребенок и:во-первых-из-тип?
Я не могу сказать разницу между element:first-child и element:first-of-type
например, скажем, у вас был div
div:first-child
→ Все <div> элементы, которые являются первыми детьми своих родителей.
div:first-of-type
→ Все <div> элементы, которые являются первыми <div> элемент их родителей.
это кажется, то же самое, но они работают по-разному.
кто-нибудь может объяснить?
2 ответа:
родительский элемент может иметь один или несколько дочерних элементов:
<div class="parent"> <div>Child</div> <div>Child</div> <div>Child</div> <div>Child</div> </div>среди этих детей, только один из них может быть первым. Это соответствует
:first-child:<div class="parent"> <div>Child</div> <!-- :first-child --> <div>Child</div> <div>Child</div> <div>Child</div> </div>разницу между
:first-childи:first-of-typeэто:first-of-typeбудет соответствовать первому элементу его типа элемента, который в HTML представлен его именем тега,даже если этот элемент не является первым ребенком родителя. До сих пор дочерние элементы, на которые мы смотрим, имеют все былdivs, но потерпите, я доберусь до этого немного.на данный момент верно и обратное: любой
:first-childтоже:first-of-typeпо необходимости. Так как первый ребенок здесь тоже первыйdiv, оно будет соответствовать и псевдоклассы, а также селектор типовdiv:<div class="parent"> <div>Child</div> <!-- div:first-child, div:first-of-type --> <div>Child</div> <div>Child</div> <div>Child</div> </div>теперь, если вы измените тип первого ребенка от
divк чему-то еще, напримерh1, он по-прежнему будет первым ребенком, но он больше не будет первыйdivочевидно; вместо этого, он становится первым (и единственным)h1. Если есть какие-либо другиеdivэлементы, следующие за этим первым дочерним элементом в том же родителе, первый из нихdivэлементы будут соответствоватьdiv:first-of-type. В данном примере, второй ребенок становится первымdivпосле первого ребенка изменяется наh1:<div class="parent"> <h1>Child</h1> <!-- h1:first-child, h1:first-of-type --> <div>Child</div> <!-- div:nth-child(2), div:first-of-type --> <div>Child</div> <div>Child</div> </div>отметим, что
:first-childэквивалентно:nth-child(1).это также означает, что в то время как любой элемент может только есть один дочерний элемент, соответствующий
:first-childв то время, он может и будет иметь столько детей, соответствующие:first-of-typeпсевдо-класс как количество видов детей. В нашем примере селектор.parent > :first-of-type(с неявной*квалификация:first-of-typeпсевдо) будет соответствовать два элементы, а не только один:<div class="parent"> <h1>Child</h1> <!-- .parent > :first-of-type --> <div>Child</div> <!-- .parent > :first-of-type --> <div>Child</div> <div>Child</div> </div>то же самое справедливо и для
:last-childи:last-of-type: все:last-childпо необходимости тоже:last-of-type, так как абсолютно никакой другой элемент следует за ним внутри своего родителя. Еще бы, ведь последнееdivэто также последний ребенок,h1не может быть последним ребенком, несмотря на то, что последние в своем роде.
:nth-child()и:nth-of-type()функция очень похожа в принципе при использовании с произвольным целочисленным аргументом (как в:nth-child(1)пример, упомянутый выше), но где они отличаются, это потенциальное количество элементов, сопоставляемых:nth-of-type(). Это подробно описано в в чем разница между p:nth-child(2) и p: nth-of-type(2)?
Я создал пример, чтобы продемонстрировать разницу между
first-childиfirst-of-typeздесь.HTML
<div class="parent"> <p>Child</p> <div>Child</div> <div>Child</div> <div>Child</div> </div>CSS
.parent :first-child { color: red; } .parent :first-of-type { background: yellow; } .parent p:first-child { text-decoration: line-through; } // Does not work .parent div:first-child { font-size: 20px; } // Use this instead .parent div:first-of-type { text-decoration: underline; } // This is second child regardless of its type .parent div:nth-child(2) { border: 1px black solid; }чтобы увидеть полный пример, пожалуйста, посетите https://jsfiddle.net/bwLvyf3k/1/