यह एक बहुत ही आम समस्या है जो कैसे :nth-child()
और :nth-of-type()
काम की गलतफहमी के कारण उत्पन्न होती है । दुर्भाग्य से, वर्तमान में कोई चयनकर्ता-आधारित समाधान नहीं है क्योंकि चयनकर्ता एनटीटी बच्चे से मेल खाने का एक तरीका प्रदान नहीं करते हैं जो एक मनमाने ढंग से चयनकर्ता से मेल खाता है जैसे कि विषम-संख्या वाले, समान-संख्या वाले या an+b
जहां a != 1
और जहां b != 0
। यह चयनकर्ताओं, नकारों, और सरल चयनकर्ताओं के अधिक जटिल संयोजनों को विशेषता देने के लिए, सिर्फ कक्षा चयनकर्ताओं से आगे निकलता है।
:nth-child()
छद्म वर्ग के बीच तत्वों में गिना जाता है सब एक ही मूल के तहत अपने भाई-बहनों में। यह केवल उन भाई-बहनों की गिनती नहीं है जो बाकी चयनकर्ता से मेल खाते हैं। इसी तरह, :nth-of-type()
छद्म वर्ग समान तत्व प्रकार साझा करने वाले भाई - बहनों को गिनता है, जो HTML में टैग नाम को संदर्भित करता है, और बाकी चयनकर्ता को नहीं।
इसका अर्थ यह भी है कि यदि एक ही माता-पिता के सभी बच्चे एक ही तत्व प्रकार के हैं, उदाहरण के लिए एक टेबल बॉडी के मामले में जिनके केवल बच्चे tr
तत्व हैं या एक सूची तत्व जिनके एकमात्र बच्चे li
तत्व हैं, तो :nth-child()
और पहचान :nth-of-type()
का व्यवहार करेंगे, अर्थात के हर मूल्य के लिए an+b
, :nth-child(an+b)
और :nth-of-type(an+b)
तत्वों के एक ही सेट से मेल खाएगा।
वास्तव में, किसी दिए गए मिश्रित चयनकर्ता में सभी सरल चयनकर्ता, जैसे कि छद्म वर्ग जैसे :nth-child()
और :not()
, एक-दूसरे से स्वतंत्र रूप से काम करते हैं , बजाए कि उन तत्वों के सबसेट को देखते हुए जो बाकी चयनकर्ता द्वारा मेल खाते हैं।
इसका अर्थ यह भी है कि प्रत्येक व्यक्ति यौगिक चयनकर्ता 1 के भीतर सरल चयनकर्ताओं के बीच आदेश की कोई धारणा नहीं है , उदाहरण के लिए निम्नलिखित दो चयनकर्ता समकक्ष हैं:
table.myClass tr.row:nth-child(odd)
table.myClass tr:nth-child(odd).row
अंग्रेजी में अनुवादित, वे दोनों का मतलब है:
tr
निम्नलिखित स्वतंत्र स्थितियों में से मेल खाने वाले किसी भी तत्व का चयन करें :
- यह अपने माता-पिता की एक विषम संख्या वाला बच्चा है;
- इसमें कक्षा "पंक्ति" है; तथा
- यह एक
table
तत्व का वंशज है जिसका वर्ग "मायक्लास" है।
(आप यहाँ एक अव्यवस्थित सूची के मेरे उपयोग पर ध्यान देंगे, बस बिंदु घर चलाने के लिए)
क्योंकि वर्तमान में कोई शुद्ध सीएसएस समाधान नहीं है, इसलिए आपको तत्वों को फ़िल्टर करने और तदनुसार शैलियों या अतिरिक्त वर्ग नामों को लागू करने के लिए एक स्क्रिप्ट का उपयोग करना होगा। उदाहरण के लिए, jQuery का उपयोग करते हुए निम्नलिखित एक आम समाधान है (यह मानते हुए tr
कि तालिका के भीतर तत्वों के साथ आबादी वाला केवल एक पंक्ति समूह है ):
$('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');
});
इसी सीएसएस के साथ:
table.myClass tr.row.odd {
...
}
यदि आप स्वचालित परीक्षण उपकरण जैसे सेलेनियम या प्रसंस्करण HTML का उपयोग lxml जैसे उपकरणों के साथ कर रहे हैं, तो इनमें से कई उपकरण XPath को विकल्प के रूप में अनुमति देते हैं:
//table[contains(concat(' ', @class, ' '), ' myClass ')]//tr[contains(concat(' ', @class, ' '), ' row ')][position() mod 2)=1]
विभिन्न तकनीकों का उपयोग करने वाले अन्य समाधान पाठक के लिए एक अभ्यास के रूप में छोड़ दिए जाते हैं; यह सिर्फ एक संक्षिप्त, उदाहरण के लिए दृष्टांत है।
जो इसके लायक है, उसके लिए दिए गए चयनकर्ता से मेल खाने वाले प्रत्येक nth बच्चे के चयन के विशिष्ट उद्देश्य के लिए चयनकर्ताओं के स्तर 4 में जोड़े जाने वाले अंकन के विस्तार के:nth-child()
लिए एक प्रस्ताव है । 2
चयनकर्ता जिसके द्वारा मैचों को फ़िल्टर करने के लिए एक तर्क के रूप में प्रदान किया जाता है :nth-child()
, फिर से कैसे चयनकर्ता एक क्रम में एक दूसरे से स्वतंत्र रूप से संचालित होते हैं जैसा कि मौजूदा चयनकर्ता सिंटैक्स द्वारा निर्देशित किया जाता है। तो आपके मामले में, यह इस तरह दिखेगा:
table.myClass tr:nth-child(odd of .row)
(एक अचूक पाठक इस बात पर ध्यान देगा कि यह :nth-child(odd of tr.row)
सरल चयनकर्ताओं के बजाय होना चाहिए , tr
और :nth-child()
स्वतंत्र रूप से एक दूसरे के रूप में अच्छी तरह से काम करेगा। यह कार्यात्मक छद्म वर्गों के साथ समस्याओं में से एक है जो चयनकर्ताओं को स्वीकार करते हैं, कीड़े का एक कर सकते हैं। इस उत्तर के बीच में नहीं खुला। इसके बजाय मैं इस धारणा के साथ जाने वाला हूं कि अधिकांश साइटों में तत्वों के अलावा अन्य तत्व नहीं होंगे जैसे कि tr
टेबल बॉडी में एक दूसरे के भाई-बहन होते हैं, जो या तो विकल्प को कार्यात्मक रूप से समकक्ष बना देगा। '
बेशक, एक ब्रांड के नए विनिर्देश में एक नया प्रस्ताव होने के नाते, यह शायद सड़क पर कुछ वर्षों तक कार्यान्वयन को नहीं देखेगा। इस बीच, आपको ऊपर के रूप में एक स्क्रिप्ट का उपयोग करने के साथ रहना होगा।
1 यदि आप एक प्रकार या सार्वभौमिक चयनकर्ता निर्दिष्ट करते हैं, तो इसे पहले आना चाहिए। यह नहीं बदलता है कि चयनकर्ता मूल रूप से कैसे काम करते हैं; यह एक सिंटैक्टिक क्विक से ज्यादा कुछ नहीं है।
2 यह मूल रूप से प्रस्तावित किया गया था :nth-match()
, हालांकि, क्योंकि यह अभी भी केवल अपने भाई-बहनों के सापेक्ष एक तत्व को गिनता है, और किसी अन्य तत्व को जो दिए गए चयनकर्ता से मेल नहीं खाता है, यह 2014 के बाद से मौजूदा के :nth-child()
बजाय एक विस्तार के रूप में पुनर्निर्मित किया गया है ।