:has() केस स्टडी

Swetha Gopalakrishnan
Swetha Gopalakrishnan
Saurabh Rajpal
Saurabh Rajpal

सीएसएस में, अपने चाइल्ड एलिमेंट के आधार पर सीधे पैरंट एलिमेंट चुनने का कोई तरीका नहीं है. डेवलपर ने कई सालों से इस सुविधा के लिए अनुरोध किया था. :has() सिलेक्टर, अब सभी मुख्य ब्राउज़र के साथ काम करता है. इससे यह समस्या हल हो जाती है. :has() से पहले, अक्सर लंबे सिलेक्टर को चेन किया जाता था या स्टाइल हुक के लिए क्लास जोड़ी जाती थी. अब किसी एलिमेंट को उसके वंशजों के साथ के संबंध के आधार पर स्टाइल किया जा सकता है. :has() सिलेक्टर के बारे में ज़्यादा जानने के लिए, CSS Wrapped 2023 और ऐसे पांच CSS स्निपेट जिनके बारे में हर फ़्रंट-एंड डेवलपर को पता होना चाहिए लेख पढ़ें.

यह सिलेक्टर छोटा लग सकता है, लेकिन इसका इस्तेमाल कई कामों के लिए किया जा सकता है. इस लेख में, इस्तेमाल के कुछ ऐसे उदाहरण दिए गए हैं जिन्हें ई-कॉमर्स कंपनियों ने :has() सिलेक्टर की मदद से अनलॉक किया है.

:has(), बेसलाइन के नए वर्शन का हिस्सा है.

ब्राउज़र सहायता

  • Chrome: 105.
  • Edge: 105.
  • Firefox: 121.
  • Safari: 15.4.

सोर्स

इस लेख में दी गई पूरी सीरीज़ देखें. इसमें बताया गया है कि ई-कॉमर्स कंपनियों ने सीएसएस और यूज़र इंटरफ़ेस (यूआई) की नई सुविधाओं का इस्तेमाल करके, अपनी वेबसाइट को कैसे बेहतर बनाया.

Policybazaar

:has() सिलेक्टर की मदद से, हम उपयोगकर्ता के चुने गए विकल्प की पुष्टि करने के लिए, JavaScript पर आधारित पुष्टि करने की सुविधा को हटा पाए. साथ ही, इसे सीएसएस के समाधान से बदल दिया, जो पहले की तरह ही हमारे लिए आसानी से काम कर रहा है.—अमन सोनी, टेक्नोलॉजी लीड, Policybazaar

प्लान की तुलना करने वाले उपयोगकर्ताओं को साफ़ तौर पर विज़ुअल जानकारी देने के लिए, Policybazaar की इन्वेस्टमेंट टीम ने :has() सिलेक्टर को चतुराई से लागू किया है. नीचे दी गई इमेज में, तुलना करने वाले यूज़र इंटरफ़ेस (यूआई) में दो तरह के प्लान (पीले और नीले) दिखाए गए हैं. हर प्लान की तुलना, सिर्फ़ उसी तरह के प्लान से की जा सकती है. :has() का इस्तेमाल करके, जब कोई उपयोगकर्ता एक तरह का प्लान चुनता है, तो दूसरा प्लान नहीं चुना जा सकता.

:has() को लागू करके पैरंट एलिमेंट और इसके चाइल्ड एलिमेंट को स्टाइल करना, ताकि कैटगरी के हिसाब से चुनने की सुविधा बनाई जा सके.

कोड

:has() की मदद से, पैरंट एलिमेंट और उनके चाइल्ड एलिमेंट को स्टाइल किया जा सकता है. नीचे दिया गया कोड यह जांच करता है कि पैरंट कंटेनर में .disabled-group क्लास सेट है या नहीं. अगर ऐसा होता है, तो कार्ड धूसर हो जाता है और pointer-events को none पर सेट करके, "जोड़ें" बटन को क्लिक करने से रोक दिया जाता है.

.plan-group-container:has(.disabled-group) {
  opacity: 0.5;
  filter: grayscale(100%);
}

.plan-group-container:has(.disabled-section) .button {
  pointer-events: none;
  border-color: #B5B5B5;
  color: var(--text-primary-38-color);
  background: var(--input-border-color);
}

पॉलिसीबाज़ार की स्वास्थ्य टीम ने इस्तेमाल के उदाहरण को थोड़ा अलग लागू किया है. उपयोगकर्ता के लिए इनलाइन क्विज़ है. साथ ही, सवाल के चेकबॉक्स की स्थिति देखने के लिए, :has() का इस्तेमाल किया जाता है, ताकि यह पता चल सके कि सवाल का जवाब दिया गया है या नहीं. अगर ऐसा है, तो अगले सवाल पर जाने के लिए एक ऐनिमेशन लागू किया जाता है.

health.policybazaar.com/

कोड

प्लान की तुलना करने के उदाहरण में, :has() का इस्तेमाल किसी क्लास की मौजूदगी की जांच करने के लिए किया गया था. :has(input:checked) का इस्तेमाल करके, इनपुट एलिमेंट की स्थिति भी देखी जा सकती है. जैसे, चेकबॉक्स. क्विज़ दिखाने वाले विज़ुअल में, बैंगनी रंग के बैनर में मौजूद हर सवाल एक चेकबॉक्स है. Policybazaar यह देखता है कि :has(input:checked) का इस्तेमाल करके सवाल का जवाब दिया गया है या नहीं. अगर जवाब दिया गया है, तो अगले सवाल पर जाने के लिए, animation: quesSlideOut 0.3s 0.3s linear forwards का इस्तेमाल करके ऐनिमेशन को ट्रिगर करें. यहां दिए गए कोड में देखें कि यह कैसे काम करता है.

.segment_banner__wrap__questions {
 position: relative;
 animation: quesSlideIn 0.3s linear forwards;
}

.segment_banner__wrap__questions:has(input:checked) {
 animation: quesSlideOut 0.3s 0.3s linear forwards;
}


@keyframes quesSlideIn {
 from {
   transform: translateX(50px);
   opacity: 0;
 }
 to {
   transform: translateX(0px);
   opacity: 1;
 }
}

@keyframes quesSlideOut {
 from {
   transform: translateX(0px);
   opacity: 1;
 }
 to {
   transform: translateX(-50px);
   opacity: 0;
 }
}

Tokopedia

अगर प्रॉडक्ट के थंबनेल में कोई वीडियो है, तो Tokopedia ने ओवरले इमेज बनाने के लिए :has() का इस्तेमाल किया. अगर प्रॉडक्ट के थंबनेल में .playIcon क्लास है, तो एक सीएसएस ओवरले जोड़ दिया जाता है. यहां, :has() सिलेक्टर की मदद से, बड़े .thumbnailWrapper क्लास में & को नेस्ट करने के सिलेक्टर के साथ-साथ, यह भी इस्तेमाल किया गया है कि यह सभी थंबनेल पर लागू होता है. इससे ज़्यादा मॉड्यूलर और पढ़ने में आसान सीएसएस बनती है.

'इसमें है' सिलेक्टर का इस्तेमाल करने से पहले और बाद में, Tokopedia पेज का स्क्रीनशॉट.
:has() का इस्तेमाल करने से पहले और बाद में.

कोड

यहां दिया गया कोड, सीएसएस सिलेक्टर और कॉम्बिनेटर (& और >) का इस्तेमाल करता है. साथ ही, थंबनेल को स्टाइल करने के लिए :has() के साथ नेस्टिंग करता है. साथ काम न करने वाले ब्राउज़र के लिए, सामान्य अतिरिक्त सीएसएस क्लास नियम का इस्तेमाल फ़ॉलबैक के तौर पर किया जाता है. @supports selector(:has(*)) नियम का इस्तेमाल, ब्राउज़र के साथ काम करने की सुविधा की जांच करने के लिए भी किया जाता है. इसलिए, सभी ब्राउज़र वर्शन पर अनुभव एक जैसा ही होता है.

export const thumbnailWrapper = css`
  padding: 0;
  margin-right: 7px;
  border: none;
  outline: none;
  background: transparent;

  > div {
    width: 64px;
    height: 64px;
    overflow: hidden;
    cursor: pointer;
    border-color: ;
    position: relative;
    border: 2px solid ${NN0};
    border-radius: 8px;
    transition: border-color 0.25s;

    &.active {
      border-color: ${GN500};
    }

    @supports selector(:has(*)) {
      &:has(.playIcon) {
        &::after {
          content: '';
          display: block;
          background: rgba(0, 0, 0, 0.2);
          position: absolute;
          top: 0;
          left: 0;
          right: 0;
          bottom: 0;
        }
      }
    }

    & > .playIcon {
      position: absolute;
      top: 25%;
      left: 25%;
      width: 50%;
      height: 50%;
      text-align: center;
      z-index: 1;
    }
  }
`;

:has() का इस्तेमाल करते समय ध्यान रखने वाली बातें

ज़्यादा जटिल शर्त बनाने के लिए, :has() को अन्य सिलेक्टर के साथ जोड़ें. has() फ़ैमिली सिलेक्टर में कुछ उदाहरण देखें.

रिसॉर्स:

इस सीरीज़ के अन्य लेख पढ़ें. इनमें बताया गया है कि ई-कॉमर्स कंपनियों को सीएसएस और यूज़र इंटरफ़ेस (यूआई) की नई सुविधाओं का इस्तेमाल करने से क्या फ़ायदे मिले. जैसे, स्क्रोल से चलने वाले ऐनिमेशन, व्यू ट्रांज़िशन, पॉपओवर, और कंटेनर क्वेरी.