यह लेखकों के सबसे प्रसिद्ध उदाहरणों में से एक है कि गलतफहमी कैसे :first-childकाम करती है। CSS2 में पेश किया गया , :first-childछद्म वर्ग अपने माता-पिता के पहले बच्चे का प्रतिनिधित्व करता है । बस। वहाँ एक बहुत ही गलत धारणा है कि यह जो भी बाल तत्व उठाता है, वह सभी यौगिक यौगिक के बाकी हिस्सों द्वारा निर्दिष्ट शर्तों से मेल खाता है। जिस तरह से चयनकर्ता काम करते हैं ( स्पष्टीकरण के लिए यहां देखें ), यह केवल सच नहीं है।
चयनकर्ता स्तर 3 एक :first-of-typeछद्म वर्ग का परिचय देता है , जो अपने तत्व प्रकार के भाई-बहनों के बीच पहले तत्व का प्रतिनिधित्व करता है। यह उत्तर व्याख्याओं के साथ व्याख्या करता है, :first-childऔर दोनों के बीच का अंतर :first-of-type। हालाँकि, जैसा कि :first-child, यह किसी भी अन्य स्थितियों या विशेषताओं को नहीं देखता है। HTML में, तत्व प्रकार को टैग नाम द्वारा दर्शाया गया है। प्रश्न में, वह प्रकार है p।
दुर्भाग्य से, :first-of-classकिसी दिए गए वर्ग के पहले बाल तत्व के मिलान के लिए समान छद्म वर्ग नहीं है। एक वर्कअराउंड कि ले वेरू और मैं इसके लिए आए (हालांकि पूरी तरह से स्वतंत्र रूप से) पहले उस वर्ग के साथ अपने सभी तत्वों के लिए अपनी वांछित शैलियों को लागू करना है :
/*
* Select all .red children of .home, including the first one,
* and give them a border.
*/
.home > .red {
border: 1px solid red;
}
... तब वर्ग के साथ तत्वों के लिए शैलियों को "पूर्ववत करें" जो पहले एक के बाद आते हैं , एक सामान्य~ नियम में सामान्य सिबलिंग कॉम्बिनेटर का उपयोग करते हैं :
/*
* Select all but the first .red child of .home,
* and remove the border from the previous rule.
*/
.home > .red ~ .red {
border: none;
}
अब केवल पहले तत्व के साथ class="red"एक सीमा होगी।
नियम कैसे लागू होते हैं, इसका एक उदाहरण यहां दिया गया है:
<div class="home">
<span>blah</span> <!-- [1] -->
<p class="red">first</p> <!-- [2] -->
<p class="red">second</p> <!-- [3] -->
<p class="red">third</p> <!-- [3] -->
<p class="red">fourth</p> <!-- [3] -->
</div>
कोई नियम लागू नहीं किया जाता है; कोई सीमा नहीं है।
इस तत्व में वर्ग नहीं है red, इसलिए इसे छोड़ दिया गया है।
केवल पहला नियम लागू किया जाता है; लाल सीमा प्रदान की गई है।
इस तत्व में वर्ग है red, लेकिन यह redअपने मूल में वर्ग के साथ किसी भी तत्व से पहले नहीं है । इस प्रकार दूसरा नियम लागू नहीं होता है, केवल पहला और तत्व अपनी सीमा रखता है।
दोनों नियम लागू होते हैं; कोई सीमा नहीं है।
इस तत्व की कक्षा है red। यह वर्ग के साथ कम से कम एक अन्य तत्व से पहले भी है red। इस प्रकार दोनों नियमों को लागू किया जाता है, और दूसरी borderघोषणा पहले ओवरराइड करती है, जिससे यह "पूर्ववत" होता है, इसलिए बोलने के लिए।
एक बोनस के रूप में, हालांकि इसे चयनकर्ताओं 3 में पेश किया गया था, सामान्य भाई-बहन के कॉम्बिनेटर वास्तव में IE7 द्वारा बहुत अच्छी तरह से समर्थित हैं, :first-of-typeऔर इसके विपरीत और :nth-of-type()जो केवल IE9 द्वारा समर्थित हैं। यदि आपको अच्छे ब्राउज़र समर्थन की आवश्यकता है, तो आप भाग्य में हैं।
वास्तव में, तथ्य यह है कि सिबलिंग कॉम्बिनेटर इस तकनीक का एकमात्र महत्वपूर्ण घटक है, और इसमें इस तरह के अद्भुत ब्राउज़र का समर्थन है, इस तकनीक को बहुत बहुमुखी बनाता है - आप वर्ग चयनकर्ताओं के अलावा, अन्य चीजों द्वारा तत्वों को छानने के लिए इसे अनुकूलित कर सकते हैं:
आप इसका उपयोग :first-of-typeIE7 और IE8 के आसपास काम करने के लिए कर सकते हैं , बस एक वर्ग चयनकर्ता के बजाय एक प्रकार के चयनकर्ता की आपूर्ति करके (फिर, बाद के अनुभाग में इसके गलत उपयोग पर अधिक):
article > p {
/* Apply styles to article > p:first-of-type, which may or may not be :first-child */
}
article > p ~ p {
/* Undo the above styles for every subsequent article > p */
}
आप कक्षाओं के बजाय विशेषता चयनकर्ताओं या किसी अन्य सरल चयनकर्ताओं द्वारा फ़िल्टर कर सकते हैं।
आप इस अतिव्यापी तकनीक को छद्म तत्वों के साथ भी जोड़ सकते हैं, जबकि छद्म तत्व तकनीकी रूप से सरल चयनकर्ता नहीं हैं।
ध्यान दें कि इसके लिए काम करने के लिए, आपको पहले से जानना होगा कि आपके अन्य भाई-बहनों के लिए डिफ़ॉल्ट शैलियाँ क्या होंगी ताकि आप पहले नियम को ओवरराइड कर सकें। इसके अतिरिक्त, चूंकि सीएसएस में नियमों को ओवरराइड करना शामिल है, इसलिए आप चयनकर्ता एपीआई , या सेलेनियम के सीएसएस लोकेटर के साथ उपयोग के लिए एक ही चयनकर्ता के साथ एक ही चीज प्राप्त नहीं कर सकते हैं ।
यह ध्यान देने योग्य है कि चयनकर्ता 4 अंकन (मूल रूप से एक पूरी तरह से नया छद्म वर्ग कहा जाता है ) के लिए एक विस्तार का:nth-child() परिचय :nth-match()देता है, जो आपको :nth-child(1 of .red)एक काल्पनिक के बदले में कुछ का उपयोग करने की अनुमति देगा .red:first-of-class। एक अपेक्षाकृत हालिया प्रस्ताव होने के नाते, अभी तक उत्पादन साइटों में प्रयोग करने योग्य होने के लिए पर्याप्त अंतर कार्यान्वयन नहीं हैं। उम्मीद है कि यह जल्द ही बदल जाएगा। इस बीच, मैंने जो वर्कअराउंड सुझाया है, उसे ज्यादातर मामलों के लिए काम करना चाहिए।
ध्यान रखें कि यह उत्तर मानता है कि प्रश्न प्रत्येक पहले बच्चे तत्व की तलाश में है जिसमें एक दिया गया वर्ग है। पूरे दस्तावेज़ में एक जटिल चयनकर्ता के nth मैच के लिए न तो कोई छद्म वर्ग है और न ही कोई सामान्य सीएसएस समाधान - चाहे कोई समाधान मौजूद हो दस्तावेज़ संरचना पर बहुत अधिक निर्भर करता है। jQuery प्रदान करता है :eq(), :first, :lastऔर इस उद्देश्य के लिए और अधिक है, लेकिन टिप्पणी फिर से है कि वे से बहुत अलग ढंग से काम :nth-child()एट अल । चयनकर्ता एपीआई का उपयोग करके, आप या तो document.querySelector()पहले मैच को प्राप्त करने के लिए उपयोग कर सकते हैं :
var first = document.querySelector('.home > .red');
या document.querySelectorAll()किसी विशिष्ट मैच को चुनने के लिए एक अनुक्रमणिका के साथ उपयोग करें :
var redElements = document.querySelectorAll('.home > .red');
var first = redElements[0];
var second = redElements[1];
// etc
हालांकि फिलिप ड्युबेयर.red:nth-of-type(1) द्वारा मूल स्वीकार किए गए उत्तर में समाधान (जो मूल रूप से मार्टिन द्वारा लिखा गया था , लेकिन तब से हटा दिया गया है), यह उस तरीके का व्यवहार नहीं करता है जिससे आप इसकी उम्मीद करेंगे।
उदाहरण के लिए, यदि आप केवल pअपने मूल मार्कअप का चयन करना चाहते हैं :
<p class="red"></p>
<div class="red"></div>
... तब आप .red:first-of-type(समतुल्य .red:nth-of-type(1)) का उपयोग नहीं कर सकते , क्योंकि प्रत्येक तत्व अपने प्रकार ( pऔर divक्रमशः) में से पहला (और केवल ) है, इसलिए दोनों का चयनकर्ता द्वारा मिलान किया जाएगा।
जब एक निश्चित वर्ग का पहला तत्व भी अपने प्रकार का पहला होता है , तो छद्म वर्ग काम करेगा, लेकिन यह केवल संयोग से होता है । फिलिप के उत्तर में इस व्यवहार का प्रदर्शन किया गया है। जिस क्षण आप इस तत्व से पहले उसी प्रकार के एक तत्व में चिपके रहते हैं, चयनकर्ता विफल हो जाएगा। अद्यतन मार्कअप लेना:
<div class="home">
<span>blah</span>
<p class="red">first</p>
<p class="red">second</p>
<p class="red">third</p>
<p class="red">fourth</p>
</div>
एक नियम लागू करने .red:first-of-typeसे काम चल जाएगा, लेकिन एक बार जब आप pकक्षा के बिना एक और जोड़ते हैं :
<div class="home">
<span>blah</span>
<p>dummy</p>
<p class="red">first</p>
<p class="red">second</p>
<p class="red">third</p>
<p class="red">fourth</p>
</div>
... चयनकर्ता तुरंत विफल हो जाएगा, क्योंकि पहला .redतत्व अब दूसरा p तत्व है।