Bu, nasıl :nth-child()
ve :nth-of-type()
çalıştığının yanlış anlaşılmasından kaynaklanan çok yaygın bir sorundur . Ne yazık ki, şu anda henüz seçici tabanlı bir çözüm yoktur, çünkü Seçiciler, tek sayılı, çift sayılı veya herhangi bir an+b
yerde a != 1
ve gibi bir modele dayalı olarak rastgele bir seçici ile eşleşen n'inci çocuğu eşleştirmenin bir yolunu sağlamamaktadır b != 0
. Bu, seçicileri, olumsuzlamaları ve basit seçicilerin daha karmaşık kombinasyonlarını ilişkilendirmek için yalnızca sınıf seçicilerinin ötesine geçer.
:nth-child()
Sözde sınıf arasında sayar tüm aynı ebeveyn altında kardeşlerinin. Yalnızca seçicinin geri kalanıyla eşleşen kardeşleri saymaz. Benzer şekilde, :nth-of-type()
sözde sınıf , seçicinin geri kalanına değil, HTML'deki etiket adına atıfta bulunan aynı öğe türünü paylaşan kardeşleri sayar.
Bu aynı zamanda, aynı ebeveynin tüm eğer çocukların sadece çocuklardır bir tablo vücutta durumunda örneğin, aynı eleman türünden olduğu anlamına gelir tr
unsurları veya sadece çocuklar edilir bir liste elemanı li
elemanları, daha sonra :nth-child()
ve :nth-of-type()
aynı şekilde davranacaktır, yani her değeri için an+b
, :nth-child(an+b)
ve :nth-of-type(an+b)
elementlerin aynı seti eşleşir.
Aslında, örneğin sözde sınıflar da dahil olmak üzere, belirli bir bileşiğin seçici tüm basit seçiciler, :nth-child()
ve :not()
iş bağımsız olarak birbirlerinden çok bakarak daha alt- seçici geri kalanı ile eşleşen elementlerin.
Bu aynı zamanda, her bir tek tek bileşik seçici 1 içindeki basit seçiciler arasında bir düzen kavramı olmadığı anlamına gelir; bu, örneğin aşağıdaki iki seçicinin eşdeğer olduğu anlamına gelir:
table.myClass tr.row:nth-child(odd)
table.myClass tr:nth-child(odd).row
İngilizceye çevrildiğinde her ikisi de şu anlama gelir:
tr
Aşağıdaki bağımsız koşulların tümü ile eşleşen herhangi bir öğeyi seçin :
- ebeveyninin tek sayılı bir çocuğu;
- "row" sınıfına sahiptir; ve
table
"myClass" sınıfına sahip bir elemanın soyundan gelir.
(Burada sırasız bir liste kullandığımı fark edeceksiniz, sadece eve götürmek için)
Şu anda saf bir CSS çözümü olmadığından, öğeleri filtrelemek ve buna göre stilleri veya ekstra sınıf adlarını uygulamak için bir komut dosyası kullanmanız gerekecektir. Örneğin, aşağıdaki jQuery kullanan yaygın bir çözümdür ( tr
tablo içindeki öğelerle doldurulmuş yalnızca bir satır grubu olduğu varsayılırsa ):
$('table.myClass').each(function() {
// Note that, confusingly, jQuery's filter pseudos are 0-indexed
// while CSS :nth-child() is 1-indexed
$('tr.row:even').addClass('odd');
});
İlgili CSS ile:
table.myClass tr.row.odd {
...
}
Selenium gibi otomatik test araçlarını kullanıyorsanız veya lxml gibi araçlarla HTML'yi işliyorsanız, bu araçların birçoğu alternatif olarak XPath'e izin verir:
//table[contains(concat(' ', @class, ' '), ' myClass ')]//tr[contains(concat(' ', @class, ' '), ' row ')][position() mod 2)=1]
Farklı teknolojileri kullanan diğer çözümler okuyucuya alıştırma olarak bırakılır; bu sadece açıklama için kısa, uydurma bir örnektir.
Değeri ne olursa olsun, belirli bir seçiciyle eşleşen her n'inci çocuğu seçmenin özel amacı için Seçiciler düzey 4'e eklenecek gösterime bir genişletme:nth-child()
önerisi vardır . 2
Eşleşmelerin filtreleneceği seçici :nth-child()
, yine mevcut seçici sözdizimi tarafından dikte edilen bir sırayla seçicilerin birbirinden bağımsız olarak nasıl çalıştığına bağlı olarak bir argüman olarak sağlanır . Yani sizin durumunuzda şöyle görünecektir:
table.myClass tr:nth-child(odd of .row)
(Zeki bir okuyucu :nth-child(odd of tr.row)
, basit seçiciler tr
ve :nth-child()
birbirlerinden bağımsız olarak çalıştıkları için, bunun yerine olması gerektiğini hemen fark edecektir . Bu, seçicileri kabul eden işlevsel sözde sınıflarla ilgili sorunlardan biridir, bir kutu solucan bu cevabın ortasında açık değil. Bunun yerine, çoğu sitenin şu varsayımla devam edeceğim:tr
bir masa gövdesinde birbirinin kardeşleri gibi öğelerden varsayacağım, bu her iki seçeneği de işlevsel olarak eşdeğer kılacaktır.)
Tabii ki, yepyeni bir spesifikasyonda yepyeni bir teklif olduğu için, bu muhtemelen yolda birkaç yıla kadar uygulanmayacaktır. Bu arada, yukarıdaki gibi bir komut dosyası kullanmak zorunda kalacaksınız.
1 Bir tür veya evrensel seçici belirtirseniz, önce gelmelidir. Ancak bu, seçicilerin temelde çalışma şeklini değiştirmez; sözdizimsel bir tuhaflıktan başka bir şey değil.
2 Bu başlangıçta önerildi :nth-match()
, ancak yine de yalnızca kardeşlerine göre bir öğeyi saydığından ve verilen seçiciyle eşleşen diğer tüm öğelere göre sayılmadığından, 2014'ten beri :nth-child()
bunun yerine var olanın bir uzantısı olarak yeniden tasarlandı .