खासियत

The CSS Podcast - 003: Specificity

मान लें कि आपको इस एचटीएमएल और सीएसएस के साथ काम करना है:

<button class="branding">Hello, Specificity!</button>
.branding {
  color: blue;
}

button {
  color: red;
}

यहां एक ही एलिमेंट को टारगेट करने वाले दो नियम हैं. हर नियम में एक ऐसा एलान होता है जिससे बटन का रंग सेट किया जाता है: एक नियम में बटन का रंग लाल सेट करने की कोशिश की जाती है, जबकि दूसरे नियम में बटन का रंग नीला सेट करने की कोशिश की जाती है. इस एलिमेंट पर कौनसा एलान लागू होता है?

सीएसएस स्पेसिफ़िसिटी एल्गोरिदम को समझना, यह समझने के लिए ज़रूरी है कि सीएसएस, एक जैसे कई नियमों में से किसी एक को कैसे चुनती है.

खासियत, कैस्केड के अलग-अलग चरणों में से एक है. इसके बारे में पिछले मॉड्यूल, कैस्केड में बताया गया था.

खासियत के आधार पर स्कोरिंग

ओरिजन में मौजूद हर सिलेक्टर नियम को स्कोर मिलता है. खासियत को कुल स्कोर के तौर पर देखा जा सकता है. साथ ही, हर सिलेक्टर टाइप को उस स्कोर के लिए पॉइंट मिलते हैं. सबसे ज़्यादा सटीक नियमों के एलान मान्य होते हैं.

किसी असली प्रोजेक्ट में, खास तौर पर सीएसएस नियमों को लागू करने के लिए, यह पक्का करना ज़रूरी है कि वे लागू हों. साथ ही, जटिलता से बचने के लिए, स्कोर को कम रखना ज़रूरी है. सटीकता उतनी ही होनी चाहिए जितनी हमें चाहिए, न कि ज़्यादा से ज़्यादा सटीक होने का लक्ष्य रखना चाहिए. आने वाले समय में, कुछ ऐसी सीएसएस लागू करनी पड़ सकती है जो वाकई में ज़्यादा ज़रूरी हो. अगर आपने सबसे ज़्यादा जानकारी देने वाला प्रॉम्प्ट लिखा, तो आपको जवाब पाने में मुश्किल होगी.

खासियत, दशमलव संख्या नहीं होती, बल्कि तीन अंकों की संख्या होती है. इसमें तीन कॉम्पोनेंट होते हैं: A, B, और C.

  • A: आईडी से मिलती-जुलती जानकारी
  • B: क्लास के हिसाब से खास जानकारी
  • C: एलिमेंट की तरह खास जानकारी

इसे अक्सर (A,B,C) नोटेशन का इस्तेमाल करके दिखाया जाता है. उदाहरण के लिए: (1,0,2). A-B-C नोटेशन का भी आम तौर पर इस्तेमाल किया जाता है.

इस डायग्राम में, खास जानकारी के तीन कॉम्पोनेंट (A,B,C) दिखाए गए हैं. हर कॉम्पोनेंट के लिए, डायग्राम में यह दिखाया गया है कि वह क्या दिखाता है. साथ ही, कुछ ऐसे उदाहरण दिए गए हैं जो उस पर असर डालते हैं.
इस डायग्राम में दिखाया गया है कि अलग-अलग सिलेक्टर, स्पेसिफ़िसिटी के किस कॉम्पोनेंट पर असर डालते हैं.

खास जानकारी की तुलना करने का तरीका

सटीकता की तुलना करने के लिए, तीन कॉम्पोनेंट की तुलना इस क्रम में की जाती है: जिसकी A वैल्यू ज़्यादा होती है वह ज़्यादा सटीक होती है; अगर दो A वैल्यू बराबर होती हैं, तो जिसकी B वैल्यू ज़्यादा होती है वह ज़्यादा सटीक होती है; अगर दो B वैल्यू भी बराबर होती हैं, तो जिसकी C वैल्यू ज़्यादा होती है वह ज़्यादा सटीक होती है; अगर सभी वैल्यू बराबर होती हैं, तो दोनों सटीकताओं की वैल्यू बराबर होती है.

उदाहरण के लिए, (0,4,3) की तुलना में (1,0,0) को ज़्यादा सटीक माना जाता है, क्योंकि (1,0,0) में A एट्रिब्यूट की वैल्यू (1) (0,4,3) में A एट्रिब्यूट की वैल्यू (0) से ज़्यादा है.

सिलेक्टर से प्राथमिकता तय होती है

विशिष्टता के ट्राइड में हर हिस्से की वैल्यू 0 से शुरू होती है. इसलिए, डिफ़ॉल्ट विशिष्टता (0,0,0) होती है. किसी सिलेक्टर का हर हिस्सा, खास जानकारी को बढ़ाता है. सिलेक्टर के टाइप के आधार पर, यह A, B या C की वैल्यू को बढ़ाता है.

यूनिवर्सल सिलेक्टर

यूनिवर्सल सिलेक्टर (*) कोई खास जानकारी नहीं जोड़ता है. इससे इसकी वैल्यू, (0,0,0) की शुरुआती खास जानकारी पर बनी रहती है.

* {
  color: red;
}

एलिमेंट या स्यूडो-एलिमेंट सिलेक्टर

एलिमेंट (टाइप) या स्यूडो-एलिमेंट सिलेक्टर, एलिमेंट जैसी खास जानकारी जोड़ता है. इससे C कॉम्पोनेंट में 1 की बढ़ोतरी होती है.

यहां दिए गए उदाहरणों में, कुल मिलाकर (0,0,1) की विशेषता है.

टाइप सिलेक्टर

div {
  color: red;
}

स्यूडो-एलिमेंट सिलेक्टर

::selection {
  color: red;
}

क्लास, सूडो-क्लास या एट्रिब्यूट सिलेक्टर

क्लास, स्यूडो-क्लास या एट्रिब्यूट सिलेक्टर, क्लास जैसी खास जानकारी जोड़ता है. इससे B कॉम्पोनेंट में 1 की बढ़ोतरी होती है.

नीचे दिए गए उदाहरणों की विशेषता (0,1,0) है.

क्लास सिलेक्टर

.my-class {
  color: red;
}

स्यूडो-क्लास सिलेक्टर

:hover {
  color: red;
}

एट्रिब्यूट सिलेक्टर

[href='#'] {
  color: red;
}

आईडी सिलेक्टर

आईडी चुनने वाले टूल से, आईडी जैसी खास जानकारी मिलती है. इससे A कॉम्पोनेंट में 1 की बढ़ोतरी होती है. हालांकि, ऐसा तब तक होता है, जब तक आईडी चुनने वाले टूल (#myID) का इस्तेमाल किया जाता है, न कि एट्रिब्यूट चुनने वाले टूल ([id="myID"]) का.

यहां दिए गए उदाहरण में, खास जानकारी (1,0,0) है

#myID {
  color: red;
}

अन्य सिलेक्टर

सीएसएस में कई सिलेक्टर होते हैं. इनमें से कुछ ही सुझाव सटीक होते हैं. उदाहरण के लिए, :not() छद्म क्लास, खास तौर पर कैलकुलेशन में कुछ भी नहीं जोड़ती है.

:not() स्यूडो-क्लास की स्पेसिफ़िसिटी को, सिलेक्टर के कॉमा लगाकर अलग किए गए तर्क में सबसे खास सिलेक्टर की स्पेसिफ़िसिटी से बदल दिया जाता है. इससे स्पेसिफ़िसिटी उतनी ही हो जाती है जितनी :not(:is(argument)) लिखने पर होती.

div:not(.my-class) {
  color: red;
}

:is() सूडो-क्लास भी, खास जानकारी के हिसाब से स्कोर तय करने में कोई भूमिका नहीं निभाता. :not() की तरह, यह भी अपने सबसे खास आर्ग्युमेंट की खास जानकारी लेता है.

:is(h1, h2, h3) {
  color: blue;
}

इस सैंपल की स्पेसिफ़िसिटी (0,0,1) है, क्योंकि इसमें सिर्फ़ एक तरह का सिलेक्टर (type) है.

id जोड़ने पर, स्पेसिफ़िसिटी (1,0,0) तक बढ़ जाती है.

:is(h1, h2, h3, #my-heading) {
  color: blue;
}

:where() स्यूडो-क्लास अलग है. इसके किसी भी तर्क की स्पेसिफ़िसिटी चाहे जो भी हो, इसकी स्पेसिफ़िसिटी हमेशा (0,0,0) होती है.

:where(h1, h2, h3, #my-heading) {
  color: blue;
}

:where() का इस्तेमाल करके लागू की गई कम स्पेसिफ़िसिटी वाली स्टाइल की मदद से, इन स्टाइल को बाद में अपनी स्टाइल शीट में बुनियादी सिलेक्टर के साथ ओवरराइड किया जा सकता है:

:where(#my-content) {
   color: red;
}

p {
   color: blue;
}

हालांकि, :where() की आर्ग्युमेंट सूची में id है, लेकिन इसकी खास जानकारी अब भी सिर्फ़ (0, 0, 0) है. इसलिए, बुनियादी p सिलेक्टर इसे बदल देता है और टेक्स्ट blue हो जाएगा.

देखें कि आपको कितना समझ आया

स्पेसफ़िसिटी स्कोरिंग के बारे में अपनी जानकारी की जांच करना

a[href=/learn/css/%22#%22%5D%3C%2Fcode> की खास जानकारी क्या है?

(0,0,1)
a की वैल्यू (0,0,1) है, लेकिन [href=/learn/css/%22#%22%5D%3C%2Fcode> की वैल्यू (0,1,0) है.
(0,1,0)
फिर से कोशिश करें! a की वैल्यू (0,0,1) है, लेकिन [href=/learn/css/%22#%22%5D%3C%2Fcode> की वैल्यू (0,1,0) है.
(0,1,1)
a की वैल्यू (0,0,1) है और [href=/learn/css/%22#%22%5D%3C%2Fcode> की वैल्यू (0,1,0) है. इसलिए, कुल वैल्यू (0,1,1) है.

वे फ़ैक्टर जिनसे किसी क्वेरी के लिए ज़्यादा से ज़्यादा सटीक नतीजे पाने पर कोई असर नहीं पड़ता

यहां कुछ ऐसे सामान्य फ़ैक्टर दिए गए हैं जिनके बारे में लोगों को अक्सर गलतफ़हमियां होती हैं.

इनलाइन स्टाइल एट्रिब्यूट

किसी एलिमेंट के style एट्रिब्यूट पर सीधे तौर पर लागू की गई सीएसएस, स्पेसिफ़िसिटी पर असर नहीं डालती. ऐसा इसलिए, क्योंकि यह कैस्केड में एक अलग चरण है. इसका आकलन स्पेसिफ़िसिटी से पहले किया जाता है.

<div style="color: red"></div>

स्टाइल शीट में इस एलान को बदलने के लिए, आपको कैस्केड के पिछले चरण में एलान को जीतना होगा.

उदाहरण के लिए, इसमें !important जोड़ा जा सकता है, ताकि यह Authored !important ऑरिजिन का हिस्सा बन जाए.

!important एलान

सीएसएस डिक्लेरेशन के आखिर में मौजूद !important से, स्पेसिफ़िसिटी पर कोई असर नहीं पड़ता. हालांकि, इससे डिक्लेरेशन को किसी दूसरे ओरिजन में रखा जाता है. जैसे, ऑथर्ड !important.

यहां दिए गए उदाहरण में, .my-class की खास जानकारी, !important के एलान के लिए ज़रूरी नहीं है.

.my-class {
  color: red !important;
  color: white;
}

जब दो एलान !important होते हैं, तो फिर से खास जानकारी काम आती है, क्योंकि कैस्केड के ऑरिजिन चरण से अब तक यह तय नहीं किया जा सका है कि विजेता कौन है.

.branding {
  color: blue !important;
}

button {
  color: red !important;
}

कॉन्टेक्स्ट के हिसाब से जानकारी देना

जब किसी कॉम्प्लेक्स या कंपाउंड सिलेक्टर का इस्तेमाल किया जाता है, तो उस सिलेक्टर का हर हिस्सा, स्पेसिफ़िसिटी में जुड़ जाता है. इस उदाहरण एचटीएमएल को देखें:

<a class="my-class another-class" href="#">A link</a>

इस लिंक में दो क्लास हैं. नीचे दी गई सीएसएस में मौजूद नियम की स्पेसफ़िसिटी (0,0,1) है:

a {
  color: red;
}

अगर आपने सिलेक्टर में किसी क्लास का रेफ़रंस दिया है, तो अब इसकी स्पेसफ़िसिटी (0,1,1) है:

a.my-class {
  color: green;
}

चुनने वाले टूल में दूसरी क्लास जोड़ें. अब इसमें (0,2,1) की खास जानकारी है:

a.my-class.another-class {
  color: rebeccapurple;
}

href एट्रिब्यूट को सिलेक्टर में जोड़ें. अब इसकी खासियत (0,3,1) है:

a.my-class.another-class[href] {
  color: goldenrod;
}

आखिर में, इन सभी में :hover सूडो-क्लास जोड़ें. इससे सिलेक्टर (0,4,1) के खास तौर पर काम करता है:

a.my-class.another-class[href]:hover {
  color: lightgrey;
}

देखें कि आपको कितना समझ आया

स्पेसफ़िसिटी स्कोरिंग के बारे में अपनी जानकारी की जांच करना

इनमें से किस सिलेक्टर की स्पेसिफ़िसिटी (0,2,1) है?

article > section
Elements, एलिमेंट की तरह काम करते हैं (`C` कॉम्पोनेंट). इस सिलेक्टर में दो एलिमेंट हैं. इसलिए, इसकी विशेषता (0,0,2) है.
article.card.dark
एलिमेंट, एलिमेंट की तरह खास जानकारी (`C` कॉम्पोनेंट) जोड़ते हैं और क्लास, क्लास की तरह खास जानकारी (`B` कॉम्पोनेंट) जोड़ती हैं. इसमें दो क्लास और एक एलिमेंट है. इसलिए, इस सिलेक्टर की खासियत (0,2,1) है.
article:hover a[href]
एलिमेंट, एलिमेंट की तरह खास जानकारी (`C` कॉम्पोनेंट) जोड़ते हैं. वहीं, सूडो-क्लास और एट्रिब्यूट, क्लास की तरह खास जानकारी (`B` कॉम्पोनेंट) जोड़ते हैं. इसमें दो एलिमेंट सिलेक्टर (2 × (0,0,1)), एक एट्रिब्यूट सिलेक्टर ((0,1,0)), और एक क्लास सिलेक्टर ((0,1,0)) है. इसलिए, इस सिलेक्टर की कुल स्पेसिफ़िसिटी (0,2,2) है.

प्रैग्मैटिक तरीके से स्पेसिफ़िसिटी बढ़ाना

मान लें कि आपके पास कुछ ऐसी सीएसएस है:

.my-button {
  background: blue;
}

button[onclick] {
  background: grey;
}

एचटीएमएल ऐसा दिखता है:

<button class="my-button" onclick="alert('hello')">Click me</button>

बटन का बैकग्राउंड ग्रे है, क्योंकि दूसरे सिलेक्टर की स्पेसफ़िसिटी (0,1,1) है. ऐसा इसलिए है, क्योंकि इसमें एक टाइप सिलेक्टर (button) है, जो (0,0,1) है. साथ ही, इसमें एक एट्रिब्यूट सिलेक्टर ([onclick]) है, जो (0,1,0) है.

पिछला नियम—.my-button(0,1,0) के बराबर है, क्योंकि इसमें एक क्लास सिलेक्टर है. यह (0,1,1) से कम स्पेसिफ़िसिटी वाला है.

अगर आपको इस नियम को बढ़ावा देना है, तो क्लास सिलेक्टर को इस तरह दोहराया जा सकता है:

.my-button.my-button {
  background: blue;
}

button[onclick] {
  background: grey;
}

अब बटन का बैकग्राउंड नीला हो जाएगा, क्योंकि नए सिलेक्टर को (0,2,0) की खास जानकारी मिलती है

अगर किसी नियम की खासियत समान है, तो कैस्केड में अगले नियम को लागू किया जाता है

अभी के लिए, बटन के उदाहरण का इस्तेमाल जारी रखें. सीएसएस को इस तरह बदलें:

.my-button {
  background: blue;
}

[onclick] {
  background: grey;
}

बटन का बैकग्राउंड ग्रे है, क्योंकि दोनों सिलेक्टर की खासियत एक जैसी है, यानी कि (0,1,0).

अगर सोर्स के क्रम में नियमों को स्विच किया जाता है, तो बटन नीले रंग का हो जाएगा.

[onclick] {
  background: grey;
}

.my-button {
  background: blue;
}

ऐसा इसलिए है, क्योंकि दोनों सिलेक्टर की खासियत एक जैसी है. इस मामले में, कैस्केड दिखने के क्रम वाले चरण पर वापस चला जाता है.

संसाधन