इनहेरिटेंस

सीएसएस पॉडकास्ट - 005: इनहेरिटेंस

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

<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> एलिमेंट के लिए डिफ़ॉल्ट bold वैल्यू के बजाय, 900 की font-weight वैल्यू सेट करता है. यह वैल्यू 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> एलिमेंट में 500 का font-weight होगा.

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

initial कीवर्ड

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

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

aside strong {
  font-weight: initial;
}

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

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, इनहेरिट की गई कैलकुलेट की गई वैल्यू पर वापस आ जाता है.

unset वैल्यू का इस्तेमाल all प्रॉपर्टी के साथ भी किया जा सकता है. ऊपर दिए गए उदाहरण पर वापस आकर, अगर ग्लोबल 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;
}

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

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

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

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

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

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

संसाधन