इनहेरिटेंस

The CSS Podcast - 005: Inheritance

मान लें कि आपने एलिमेंट को बटन जैसा दिखाने के लिए, अभी-अभी कुछ सीएसएस लिखी है.

<a href="http://example.com" class="my-button">I am a button link</a>
.my-button {
  display: inline-block;
  padding: 1rem 2rem;
  text-decoration: none;
  background: pink;
  font: inherit;
  text-align: center;
}

इसके बाद, कॉन्टेंट के किसी लेख में लिंक एलिमेंट जोड़ें. इसकी class वैल्यू .my-button होनी चाहिए. हालांकि, इसमें एक समस्या है. टेक्स्ट का रंग आपकी उम्मीद के मुताबिक नहीं है. ऐसा क्यों हुआ?

अगर सीएसएस की कुछ प्रॉपर्टी के लिए वैल्यू तय नहीं की जाती है, तो वे इनहेरिट हो जाती हैं. इस बटन के मामले में, इसे इस सीएसएस से color विरासत में मिला है:

article a {
  color: maroon;
}

इस लेसन में आपको यह जानकारी मिलेगी कि ऐसा क्यों होता है. साथ ही, यह भी बताया जाएगा कि इनहेरिटेंस, सीएसएस को कम लिखने में आपकी कैसे मदद करता है.

इनहेरिटेंस फ़्लो

एचटीएमएल के इस स्निपेट का इस्तेमाल करके, देखें कि इनहेरिटेंस कैसे काम करता है:

<html>
  <body>
    <article>
      <p>Lorem ipsum dolor sit amet.</p>
    </article>
  </body>
</html>

रूट एलिमेंट (<html>) को कोई भी स्टाइल नहीं मिलेगी, क्योंकि यह दस्तावेज़ का पहला एलिमेंट है. एचटीएमएल एलिमेंट में कुछ सीएसएस जोड़ें. इसके बाद, यह दस्तावेज़ में नीचे की ओर कैस्केड होना शुरू हो जाती है.

html {
  color: lightslategray;
}

color प्रॉपर्टी, डिफ़ॉल्ट रूप से अन्य एलिमेंट से इनहेरिट की जाती है. html एलिमेंट में color: lightslategray है. इसलिए, रंग इनहेरिट करने वाले सभी एलिमेंट का रंग अब lightslategray होगा.

body {
  font-size: 1.2em;
}
p {
  font-style: italic;
}

सिर्फ़ <p> में इटैलिक टेक्स्ट होगा, क्योंकि यह सबसे ज़्यादा नेस्ट किया गया एलिमेंट है. इनहेरिटेंस सिर्फ़ नीचे की ओर होता है, पैरंट एलिमेंट की ओर वापस नहीं होता.

कौनसी प्रॉपर्टी डिफ़ॉल्ट रूप से इनहेरिट की जाती हैं?

सभी सीएसएस प्रॉपर्टी, डिफ़ॉल्ट रूप से इनहेरिट नहीं की जाती हैं. हालांकि, कई प्रॉपर्टी इनहेरिट की जाती हैं. रेफ़रंस के लिए, यहां उन सभी प्रॉपर्टी की पूरी सूची दी गई है जो डिफ़ॉल्ट रूप से इनहेरिट की जाती हैं. यह सूची, सभी सीएसएस प्रॉपर्टी के W3 रेफ़रंस से ली गई है:

इनहेरिटेंस कैसे काम करता है

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

इनहेरिट की जा सकने वाली प्रॉपर्टी, नीचे की ओर कैस्केड होती हैं. साथ ही, चाइल्ड एलिमेंट को एक कंप्यूटेड वैल्यू मिलती है, जो पैरंट की वैल्यू को दिखाती है. इसका मतलब है कि अगर किसी पैरंट एलिमेंट के लिए font-weight को bold पर सेट किया गया है, तो सभी चाइल्ड एलिमेंट बोल्ड होंगे. हालांकि, ऐसा तब तक होगा, जब तक उनके लिए font-weight को किसी दूसरी वैल्यू पर सेट न किया गया हो या उपयोगकर्ता एजेंट स्टाइलशीट में उस एलिमेंट के लिए font-weight की वैल्यू मौजूद न हो.

इनहेरिटेंस को साफ़ तौर पर लागू करने और उसे कंट्रोल करने का तरीका

इनहेरिटेंस से, एलिमेंट पर अनचाहे तरीके से असर पड़ सकता है. इसलिए, सीएसएस में इससे जुड़ी समस्याओं को ठीक करने के लिए टूल मौजूद हैं.

inherit कीवर्ड

inherit कीवर्ड का इस्तेमाल करके, किसी भी प्रॉपर्टी के लिए पैरंट प्रॉपर्टी की कैलकुलेट की गई वैल्यू को इनहेरिट किया जा सकता है. इस कीवर्ड का इस्तेमाल, अपवाद बनाने के लिए किया जा सकता है.

strong {
  font-weight: 900;
}

इस सीएसएस स्निपेट से, सभी <strong> एलिमेंट के लिए font-weight की वैल्यू 900 सेट हो जाती है. ऐसा डिफ़ॉल्ट bold वैल्यू के बजाय होता है, जो font-weight: 700 के बराबर होती है.

.my-component {
  font-weight: 500;
}

.my-component क्लास, font-weight को 500 पर सेट करती है. .my-component के अंदर मौजूद <strong> एलिमेंट को भी font-weight: 500 बनाने के लिए, यह जोड़ें:

.my-component strong {
  font-weight: inherit;
}

अब .my-component के अंदर मौजूद <strong> एलिमेंट का font-weight 500 होगा.

इस वैल्यू को साफ़ तौर पर सेट किया जा सकता है. हालांकि, अगर आपने inherit का इस्तेमाल किया है और आने वाले समय में .my-component की सीएसएस में बदलाव होता है, तो इस बात की गारंटी दी जा सकती है कि आपका <strong> अपने-आप अपडेट हो जाएगा.

initial कीवर्ड

इनहेरिटेंस की वजह से, आपके एलिमेंट में समस्याएं आ सकती हैं. initial आपको रीसेट करने का एक बेहतरीन विकल्प देता है.

आपने पहले सीखा था कि सीएसएस में हर प्रॉपर्टी की डिफ़ॉल्ट वैल्यू होती है. initial कीवर्ड, किसी प्रॉपर्टी को उसकी शुरुआती डिफ़ॉल्ट वैल्यू पर वापस सेट करता है.

aside strong {
  font-weight: initial;
}

यह स्निपेट, <strong> एलिमेंट के अंदर मौजूद सभी <strong> एलिमेंट से बोल्ड फ़ॉन्ट हटा देगा. इसके बजाय, उन्हें सामान्य फ़ॉन्ट में बदल देगा, जो कि शुरुआती वैल्यू है.<aside>

unset कीवर्ड

अगर कोई प्रॉपर्टी डिफ़ॉल्ट रूप से इनहेरिट की जाती है, तो unset प्रॉपर्टी अलग तरीके से काम करती है. अगर कोई प्रॉपर्टी डिफ़ॉल्ट रूप से इनहेरिट की जाती है, तो unset कीवर्ड, inherit कीवर्ड के जैसा ही होगा. अगर प्रॉपर्टी डिफ़ॉल्ट रूप से इनहेरिट नहीं की जाती है, तो unset कीवर्ड, initial के बराबर होता है.

यह याद रखना मुश्किल हो सकता है कि कौनसी सीएसएस प्रॉपर्टी डिफ़ॉल्ट रूप से इनहेरिट की जाती हैं. ऐसे में, unset आपकी मदद कर सकता है. उदाहरण के लिए, color डिफ़ॉल्ट रूप से इनहेरिट किया जाता है, लेकिन margin नहीं. इसलिए, यह लिखा जा सकता है:

/* Global color styles for paragraph in authored CSS */
p {
  margin-top: 2em;
  color: goldenrod;
}

/* The p needs to be reset in asides, so you can use unset */
aside p {
  margin: unset;
  color: unset;
}

अब margin को हटा दिया गया है और color, इनहेरिट की गई वैल्यू पर वापस आ गया है.

all प्रॉपर्टी के साथ भी unset वैल्यू का इस्तेमाल किया जा सकता है. पिछले उदाहरण पर वापस जाएं. अगर ग्लोबल p स्टाइल में कुछ और प्रॉपर्टी जोड़ दी जाती हैं, तो क्या होगा? सिर्फ़ margin और color के लिए सेट किया गया नियम लागू होगा.

/* Global color styles for paragraph in authored CSS */
p {
    margin-top: 2em;
    color: goldenrod;
    padding: 2em;
    border: 1px solid;
}

/* Not all properties are accounted for anymore */
aside p {
    margin: unset;
    color: unset;
}

अगर आपने aside p नियम को बदलकर all: unset कर दिया है, तो इससे कोई फ़र्क़ नहीं पड़ता कि आने वाले समय में p पर कौनसी ग्लोबल स्टाइल लागू की जाती हैं. वे हमेशा अनसेट रहेंगी.

aside p {
    margin: unset;
    color: unset;
    all: unset;
}

revert कीवर्ड

कैस्केड के बारे में बताए गए सबक में आपने सीखा था कि स्टाइल अलग-अलग सोर्स से मिलती हैं. जैसे, उपयोगकर्ता एजेंट की बुनियादी स्टाइल, उपयोगकर्ता की पसंद के हिसाब से स्टाइल, और आपकी बनाई गई स्टाइल. revert कीवर्ड, उसी ऑरिजिन में सेट की गई स्टाइल को पहले जैसा कर देता है जिसमें revert कीवर्ड का इस्तेमाल किया गया है.

यह तब काम आता है, जब आपने कोई स्टाइल सेट की हो, लेकिन आपको उसे कुछ उदाहरणों में लागू नहीं करना हो. inherit, initial, और unset से यह पता चलता है कि किसी स्टाइल की वैल्यू कैसे कैलकुलेट की जाती है. वहीं, revert से सिर्फ़ यह पता चलता है कि आपने जो अन्य स्टाइल लिखे हैं वे लागू नहीं होते.

p {
  padding: 2em;
}

aside p {
  padding: revert;
}

इस स्निपेट में, <p> एलिमेंट को पैडिंग दी गई है. हालांकि, जब <p> एलिमेंट किसी <aside> के अंदर होता है, तब यह padding के बारे में कोई जानकारी नहीं देता. इसके बजाय, यह उपयोगकर्ता की पसंद के हिसाब से तय की गई स्टाइल (अगर कोई सेट है) या उपयोगकर्ता एजेंट की बुनियादी स्टाइल पर वापस आ जाती है.

revert-layer कीवर्ड

कैस्केड लेयर, स्टाइल को व्यवस्थित करने का एक उपयोगी तरीका है. साथ ही, यह कैस्केड के ऑथर ओरिजिन में स्टाइल को प्राथमिकता देने का भी एक तरीका है. revert-layer कीवर्ड, revert की तरह ही होता है. हालांकि, यह किसी प्रॉपर्टी के लिए, लेखक की कोई भी स्टाइल लागू न करने के बजाय, सिर्फ़ मौजूदा लेयर में मौजूद स्टाइल को पहले जैसा करता है.

अगर तीसरे पक्ष की यूज़र इंटरफ़ेस (यूआई) लाइब्रेरी का इस्तेमाल किया जा रहा है, तो उसे किसी लेयर में इंपोर्ट करना एक अच्छा तरीका है. साथ ही, किसी भी तरह के बदलाव को ज़्यादा प्राथमिकता वाली लेयर में जोड़ना चाहिए. इसके बाद, revert-layer का इस्तेमाल करके, किसी भी बदलाव को हटाया जा सकता है. ऐसा करने पर, यूज़र इंटरफ़ेस (यूआई) लाइब्रेरी के डिफ़ॉल्ट सेटिंग का इस्तेमाल किया जाएगा.

अगर कोई अन्य लेयर, प्रॉपर्टी के लिए वैल्यू तय नहीं करती है, तो यह revert की तरह काम करेगी. साथ ही, पहले के ऑरिजिन से वैल्यू का इस्तेमाल करेगी.

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

इनहेरिटेंस के बारे में अपनी जानकारी को परखें

इनमें से कौनसी प्रॉपर्टी डिफ़ॉल्ट रूप से इनहेरिट की जाती हैं?

animation
ऐनिमेशन, बच्चों के लिए उपलब्ध नहीं होते.
font-size
🎉
color
🎉
text-align
🎉
line-height
🎉

कौनसी वैल्यू inherit की तरह काम करती है, जब तक कि इनहेरिट करने के लिए कुछ न हो. इसके बाद, यह initial की तरह काम करती है?

reset
मान्य वैल्यू नहीं है, फिर से कोशिश करें!
unset
🎉
superset
मान्य वैल्यू नहीं है, फिर से कोशिश करें!

संसाधन