सीएसएस नेस्टिंग के लिए सिंटैक्स चुनने में मदद करें

दो मिलते-जुलते सिंटैक्स में से, यह तय करने में आपकी मदद चाहिए कि किस सिंटैक्स को स्पेसिफ़िकेशन कैंडिडेट के तौर पर चुना जाना चाहिए.

सीएसएस नेस्टिंग, सिंटैक्स को आसानी से जोड़ने की सुविधा है. इसकी मदद से, सीएसएस को किसी नियम के सेट में जोड़ा जा सकता है. अगर आपने SCSS, Less या Stylus का इस्तेमाल किया है, तो आपने इस तरह के कुछ फ़्लेवर ज़रूर देखे होंगे:

.nesting {
  color: hotpink;

  > .is {
    color: rebeccapurple;

    > .awesome {
      color: deeppink;
    }
  }
}

प्रीप्रोसेसर से कंपाइल होने के बाद, यह रेगुलर सीएसएस में बदल जाता है. जैसे:

.nesting {
  color: hotpink;
}

.nesting > .is {
  color: rebeccapurple;
}

.nesting > .is > .awesome {
  color: deeppink;
}

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

ऊपर दिखाया गया नेस्टिंग का उदाहरण, सीएसएस नेस्टिंग के लिए सिंटैक्स क्यों नहीं हो सकता?

सबसे ज़्यादा इस्तेमाल किए जाने वाले नेस्टिंग सिंटैक्स को, यहां दी गई वजहों से इस्तेमाल नहीं किया जा सकता:

  1. पार्सिंग में अस्पष्टता
    कुछ नेस्ट किए गए सिलेक्टर, प्रॉपर्टी और प्रीप्रोसेसर की तरह दिख सकते हैं. इन्हें बिल्ड टाइम पर हल किया जा सकता है और मैनेज किया जा सकता है. ब्राउज़र इंजन में एक जैसी सुविधाएं नहीं होंगी. इसलिए, सिलेक्टर को कभी भी गलत तरीके से नहीं समझना चाहिए.

  2. प्रीप्रोसेसर पार्सिंग से जुड़ी समस्याएं
    सीएसएस में नेस्टिंग करने के तरीके से, प्रीप्रोसेसर या डेवलपर के मौजूदा नेस्टिंग वर्कफ़्लो में कोई समस्या नहीं आनी चाहिए. इससे उन कम्यूनिटी और इकोसिस्टम को परेशानी होगी.

  3. :is() का इंतज़ार किया जा रहा है
    बेसिक नेस्टिंग के लिए :is() की ज़रूरत नहीं होती, लेकिन ज़्यादा मुश्किल नेस्टिंग के लिए इसकी ज़रूरत होती है. चुनने वालों की सूचियों और नेस्टिंग के बारे में सामान्य जानकारी के लिए, उदाहरण #3 देखें. मान लें कि सिलेक्टर की सूची, सिलेक्टर की शुरुआत में होने के बजाय बीच में है. ऐसे मामलों में, सिलेक्टर को किसी दूसरे सिलेक्टर के बीच में ग्रुप करने के लिए :is() की ज़रूरत होती है.:is()

हम किस चीज़ की तुलना कर रहे हैं, इसकी खास जानकारी

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

पहला विकल्प: @nest

सीएसएस नेस्टिंग 1 में, फ़िलहाल यही सिंटैक्स इस्तेमाल किया जाता है. यह & से नए नेस्ट किए गए सिलेक्टर शुरू करके, स्टाइल को नेस्ट करने का एक आसान तरीका उपलब्ध कराता है. यह @nest को नए सिलेक्टर में कहीं भी रखने का तरीका भी उपलब्ध कराता है. जैसे, जब सिर्फ़ विषयों को नहीं जोड़ा जा रहा हो.& यह तरीका आसान और कम समय लेने वाला है. हालांकि, आपको अपने इस्तेमाल के उदाहरण के हिसाब से @nest या & याद रखना होगा.

दूसरा विकल्प: @nest restricted

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

तीसरा विकल्प: ब्रैकेट

@nest के साथ डबल-सिंटैक्स या अतिरिक्त क्लटर से बचने के लिए, Miriam Suzanne और Elika Etemad ने वैकल्पिक सिंटैक्स का सुझाव दिया. यह अतिरिक्त कर्ली-ब्रैकेट पर निर्भर करता है. इससे सिंटैक्स के बारे में साफ़ तौर पर पता चलता है. इसमें सिर्फ़ दो अतिरिक्त वर्ण होते हैं और कोई नया ऐट-रूल नहीं होता. इससे नेस्ट किए गए नियमों को, नेस्टिंग के टाइप के हिसाब से ग्रुप करने की अनुमति भी मिलती है. इससे एक जैसे कई नेस्ट किए गए सिलेक्टर को आसान बनाया जा सकता है.

पहला उदाहरण - डायरेक्ट नेस्टिंग

@nest

.foo {
  color: #111;

  & .bar {
    color: #eee;
  }
}

@nest always

.foo {
  color: #111;

  @nest & .bar {
    color: #eee;
  }
}

ब्रैकेट

.foo {
  color: #111;

  {
    & .bar {
      color: #eee;
    }
  }
}

मिलती-जुलती सीएसएस

.foo {
  color: #111;
}

.foo .bar {
  color: #eee;
}

उदाहरण 2 - कंपाउंड नेस्टिंग

@nest

.foo {
  color: blue;

  &.bar {
    color: red;
  }
}

@nest always

.foo {
  color: blue;

  @nest &.bar {
    color: red;
  }
}

ब्रैकेट

.foo {
  color: blue;

  {
    &.bar {
      color: red;
    }
  }
}

मिलती-जुलती सीएसएस

.foo {
  color: blue;
}

.foo.bar {
  color: red;
}

उदाहरण 3 - सिलेक्टर की सूचियां और नेस्टिंग

@nest

.foo, .bar {
  color: blue;

  & + .baz,
  &.qux {
    color: red;
  }
}

@nest always

.foo, .bar {
  color: blue;

  @nest & + .baz,
  &.qux {
    color: red;
  }
}

ब्रैकेट

.foo, .bar {
  color: blue;

  {
    & + .baz,
    &.qux {
      color: red;
    }
  }
}

मिलती-जुलती सीएसएस

.foo, .bar {
  color: blue;
}

:is(.foo, .bar) + .baz,
:is(.foo, .bar).qux {
  color: red;
}

उदाहरण 4 - एक से ज़्यादा लेवल

@nest

figure {
  margin: 0;

  & > figcaption {
    background: lightgray;

    & > p {
      font-size: .9rem;
    }
  }
}

@nest always

figure {
  margin: 0;

  @nest & > figcaption {
    background: lightgray;

    @nest & > p {
      font-size: .9rem;
    }
  }
}

ब्रैकेट

figure {
  margin: 0;

  {
    & > figcaption {
      background: lightgray;

      {
        & > p {
          font-size: .9rem;
        }
      }
    }
  }
}

मिलती-जुलती सीएसएस

figure {
  margin: 0;
}

figure > figcaption {
  background: hsl(0 0% 0% / 50%);
}

figure > figcaption > p {
  font-size: .9rem;
}

पांचवां उदाहरण - पैरंट नेस्टिंग या विषय में बदलाव

@nest

.foo {
  color: red;

  @nest .parent & {
    color: blue;
  }
}

@nest always

.foo {
  color: red;

  @nest .parent & {
    color: blue;
  }
}

ब्रैकेट

.foo {
  color: red;

  {
    .parent & {
      color: blue;
    }
  }
}

मिलती-जुलती सीएसएस

.foo {
  color: red;
}

.parent .foo {
  color: blue;
}

उदाहरण 6 - डायरेक्ट और पैरंट नेस्टिंग को एक साथ इस्तेमाल करना

@nest

.foo {
  color: blue;

  @nest .bar & {
    color: red;

    &.baz {
      color: green;
    }
  }
}

@nest always

.foo {
  color: blue;

  @nest .bar & {
    color: red;

    @nest &.baz {
      color: green;
    }
  }
}

ब्रैकेट

.foo {
  color: blue;

  {
    .bar & {
      color: red;

      {
        &.baz {
          color: green;
        }
      }
    }
  }
}

मिलती-जुलती सीएसएस

.foo {
  color: blue;
}

.bar .foo {
  color: red;
}

.bar .foo.baz {
  color: green;
}

उदाहरण 7 - मीडिया क्वेरी नेस्टिंग

@nest

.foo {
  display: grid;

  @media (width => 30em) {
    grid-auto-flow: column;
  }
}

या साफ़ तौर पर / ज़्यादा

.foo {
  display: grid;

  @media (width => 30em) {
    & {
      grid-auto-flow: column;
    }
  }
}

@nest always (is always explicit)

.foo {
  display: grid;

  @media (width => 30em) {
    @nest & {
      grid-auto-flow: column;
    }
  }
}

ब्रैकेट

.foo {
  display: grid;

  @media (width => 30em) {
    grid-auto-flow: column;
  }
}

या साफ़ तौर पर / ज़्यादा

.foo {
  display: grid;

  @media (width => 30em) {
    & {
      grid-auto-flow: column;
    }
  }
}

मिलती-जुलती सीएसएस

.foo {
  display: grid;
}

@media (width => 30em) {
  .foo {
    grid-auto-flow: column;
  }
}

उदाहरण 8 - नेस्टिंग ग्रुप

@nest

fieldset {
  border-radius: 10px;

  &:focus-within {
    border-color: hotpink;
  }

  & > legend {
    font-size: .9em;
  }

  & > div {
    & + div {
      margin-block-start: 2ch;
    }

    & > label {
      line-height: 1.5;
    }
  }
}

@nest always

fieldset {
  border-radius: 10px;

  @nest &:focus-within {
    border-color: hotpink;
  }

  @nest & > legend {
    font-size: .9em;
  }

  @nest & > div {
    @nest & + div {
      margin-block-start: 2ch;
    }

    @nest & > label {
      line-height: 1.5;
    }
  }
}

ब्रैकेट

fieldset {
  border-radius: 10px;

  {
    &:focus-within {
      border-color: hotpink;
    }
  }

  > {
    legend {
      font-size: .9em;
    }

    div {
      + div {
        margin-block-start: 2ch;
      }

      > label {
        line-height: 1.5;
      }
    }}
  }
}

मिलती-जुलती सीएसएस

fieldset {
  border-radius: 10px;
}

fieldset:focus-within {
  border-color: hotpink;
}

fieldset > legend {
  font-size: .9em;
}

fieldset > div + div {
  margin-block-start: 2ch;
}

fieldset > div > label {
  line-height: 1.5;
}

उदाहरण 9 - "किचन सिंक" के लिए नेस्टिंग ग्रुप

@nest

dialog {
  border: none;

  &::backdrop {
    backdrop-filter: blur(25px);
  }

  & > form {
    display: grid;

    & > :is(header, footer) {
      align-items: flex-start;
    }
  }

  @nest html:has(&[open]) {
    overflow: hidden;
  }
}

@nest always

dialog {
  border: none;

  @nest &::backdrop {
    backdrop-filter: blur(25px);
  }

  @nest & > form {
    display: grid;

    @nest & > :is(header, footer) {
      align-items: flex-start;
    }
  }

  @nest html:has(&[open]) {
    overflow: hidden;
  }
}

ब्रैकेट

dialog {
  border: none;

  {
    &::backdrop {
      backdrop-filter: blur(25px);
    }

    & > form {
      display: grid;

      {
        & > :is(header, footer) {
          align-items: flex-start;
        }
      }
    }
  }

  {
    html:has(&[open]) {
      overflow: hidden;
    }
  }
}

मिलती-जुलती सीएसएस

dialog {
  border: none;
}

dialog::backdrop {
  backdrop-filter: blur(25px);
}

dialog > form {
  display: grid;
}

dialog > form > :is(header, footer) {
  align-items: flex-start;
}

html:has(dialog[open]) {
  overflow: hidden;
}

वोट डालने का समय

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

सर्वे में हिस्सा लें!