Eu não posso dizer a diferença entre element:first-child
eelement:first-of-type
Por exemplo, digamos, você teve um div
div:first-child
→ Todos os <div>
elementos que são os primeiros filhos de seus pais.
div:first-of-type
→ Todos os <div>
elementos que são o primeiro <div>
elemento de seu pai.
Parece exatamente a mesma coisa, mas funcionam de forma diferente.
Alguém poderia explicar?
css
css-selectors
BoltClock
fonte
fonte
Respostas:
Um elemento pai pode ter um ou mais elementos filho:
Entre essas crianças, apenas uma delas pode ser a primeira. Isso é correspondido por
:first-child
:A diferença entre
:first-child
e:first-of-type
é que:first-of-type
corresponderá ao primeiro elemento de seu tipo de elemento, que em HTML é representado por seu nome de tag, mesmo se esse elemento não for o primeiro filho do pai . Até agora, os elementos filhos que estamos vendo foram todosdiv
s, mas tenha paciência comigo, vou chegar lá em breve.Por enquanto, o inverso também é verdadeiro: qualquer
:first-child
um também é:first-of-type
por necessidade. Como o primeiro filho aqui também é o primeirodiv
, ele corresponderá a ambas as pseudo classes, bem como ao seletor de tipodiv
:Agora, se você mudar o tipo do primeiro filho
div
para outra coisa, comoh1
, ainda será o primeiro filho, mas não será mais o primeirodiv
obviamente; em vez disso, ele se torna o primeiro (e único)h1
. Se houver quaisquer outrosdiv
elementos seguindo este primeiro filho dentro do mesmo pai, o primeiro dessesdiv
elementos corresponderádiv:first-of-type
. No exemplo dado, o segundo filho se torna o primeirodiv
depois que o primeiro filho é alterado para umh1
:Observe que
:first-child
é equivalente a:nth-child(1)
.Isso também implica que, embora qualquer elemento possa ter apenas um único elemento filho correspondente
:first-child
por vez, ele pode e terá tantos filhos correspondendo à:first-of-type
pseudo classe quanto o número de tipos de filhos que ela possui. Em nosso exemplo, o seletor.parent > :first-of-type
(com uma*
qualificação implícita de:first-of-type
pseudo) corresponderá a dois elementos, não apenas a um:O mesmo é verdadeiro para
:last-child
e:last-of-type
: qualquer:last-child
é por necessidade também:last-of-type
, visto que absolutamente nenhum outro elemento o segue dentro de seu pai. Porém, como o últimodiv
é também o último filho,h1
não pode ser o último filho, apesar de ser o último de seu tipo.:nth-child()
e:nth-of-type()
funcionam de maneira muito semelhante em princípio quando usados com um argumento inteiro arbitrário (como no:nth-child(1)
exemplo mencionado acima), mas onde eles diferem é no número potencial de elementos correspondidos por:nth-of-type()
. Isso é abordado em detalhes em Qual é a diferença entre p: n-ésimo filho (2) e p: n-ésimo-do-tipo (2)?fonte
Criei um exemplo para demonstrar a diferença entre
first-child
efirst-of-type
aqui.HTML
CSS
Para ver o exemplo completo, visite https://jsfiddle.net/bwLvyf3k/1/
fonte
A diferença entre o tipo de primeiro filho e o primeiro filho pode ser entendida com o exemplo. Você precisa entender o exemplo a seguir criado por mim e ele realmente funciona, você pode colar os códigos em seu editor e entender o que são e como eles trabalham
Código # 1 para o primeiro do tipo:
resultado
.p1, .p2, .p3 serão estilizados e suas cores serão vermelhas. mesmo se colocarmos .p1 após o segundo div, ele será vermelho.
Código # 2 para o primeiro filho:
resultado:
se colocarmos o .p2 após o segundo div 2, ele não ficará vermelho, mas no primeiro caso estava funcionando.
fonte