सीएसएस की स्थिति 2022

Google I/O 2022 में दिखाई गई, वेब स्टाइलिंग की आज और आने वाले कल की सुविधाएँ. साथ ही, कुछ अतिरिक्त सुविधाएँ.

साल 2022, CSS के लिए सबसे अहम सालों में से एक होने वाला है. इस साल, CSS और ब्राउज़र के साथ मिलकर काम करने वाली सुविधाओं को लॉन्च किया जाएगा. साथ ही, 14 सुविधाओं को लागू करने का लक्ष्य रखा गया है!

खास जानकारी

यह पोस्ट, Google I/O 2022 में दिए गए भाषण का लेख वाला वर्शन है. यह हर सुविधा के बारे में पूरी जानकारी देने वाली गाइड नहीं है. इसके बजाय, यह एक सामान्य जानकारी है, ताकि आपकी दिलचस्पी बढ़ाई जा सके. इसमें हर सुविधा के बारे में कम शब्दों में जानकारी दी गई है. अगर आपको इसमें दिलचस्पी है, तो ज़्यादा जानकारी के लिए, किसी सेक्शन के आखिर में दिए गए संसाधन लिंक देखें.

कॉन्टेंट का टेबल

अपनी पसंद के विषयों पर जाने के लिए, यहां दी गई सूची का इस्तेमाल करें:

ब्राउज़र के साथ काम करना

सीएसएस की कई सुविधाओं को एक साथ रिलीज़ करने की मुख्य वजह, Interop 2022 के प्रयासों की वजह से है. इंटरऑप के प्रयासों के बारे में जानने से पहले, Compat 2021 के प्रयासों के बारे में जानना ज़रूरी है.

Compat 2021

साल 2021 के लिए तय किए गए लक्ष्यों को पूरा करने के लिए, सर्वे के ज़रिए डेवलपर से मिले सुझावों को ध्यान में रखा गया. इन लक्ष्यों में, मौजूदा सुविधाओं को बेहतर बनाना, टेस्ट सुइट को बेहतर बनाना, और पांच सुविधाओं के लिए ब्राउज़र के पासिंग स्कोर को बढ़ाना शामिल था:

  1. sticky पोज़िशनिंग
  2. aspect-ratio साइज़ बदलने की सुविधा
  3. flex लेआउट
  4. grid लेआउट
  5. transform पोज़िशनिंग और ऐनिमेशन

सभी टेस्ट में स्कोर बेहतर हुए हैं. इससे पता चलता है कि Gemini Pro, अब ज़्यादा भरोसेमंद और स्थिर है. इन टीमों को हमारी ओर से ढेर सारी बधाई!

Interop 2022

इस साल, ब्राउज़र बनाने वाली कंपनियों ने मिलकर, उन सुविधाओं और प्राथमिकताओं पर चर्चा की जिन पर उन्हें काम करना था. उन्होंने डेवलपर के लिए, वेब की ये सुविधाएं उपलब्ध कराने का प्लान बनाया है:

  1. @layer
  2. कलर स्पेस और फ़ंक्शन
  3. कंटेनमेंट
  4. <dialog>
  5. फ़ॉर्म के साथ काम करने की सुविधा
  6. स्क्रोल करना
  7. सबग्रिड
  8. मुद्रण कला
  9. व्यूपोर्ट यूनिट
  10. वेब कंपैट

यह एक दिलचस्प और महत्वाकांक्षी सूची है. मैं इसे देखने के लिए बेताब हूं.

साल 2022 के नए गाने

इसमें कोई हैरानी की बात नहीं है कि सीएसएस 2022 की स्थिति पर, Interop 2022 के काम का काफ़ी असर पड़ा है.

कैस्केड लेयर

Browser Support

  • Chrome: 99.
  • Edge: 99.
  • Firefox: 97.
  • Safari: 15.4.

Source

@layer से पहले, लोड की गई स्टाइलशीट का क्रम बहुत अहम होता था, क्योंकि आखिर में लोड की गई स्टाइल, पहले लोड की गई स्टाइल को बदल सकती हैं. इस वजह से, एंट्री स्टाइलशीट को मैनेज करना मुश्किल हो गया. इसमें डेवलपर को कम ज़रूरी स्टाइल पहले और ज़्यादा ज़रूरी स्टाइल बाद में लोड करनी पड़ती थीं. इस अहमियत को मैनेज करने में डेवलपर की मदद करने के लिए, पूरी-पूरी कार्यप्रणालियां मौजूद हैं. जैसे, ITCSS.

@layer की मदद से, एंट्री फ़ाइल में लेयर और उनके क्रम को पहले से तय किया जा सकता है. इसके बाद, स्टाइल लोड होने, लोड होने या तय होने पर, उन्हें लेयर में रखा जा सकता है. इससे स्टाइल ओवरराइड की अहमियत को बनाए रखने में मदद मिलती है. हालांकि, इसमें लोड करने के लिए सावधानीपूर्वक मैनेज की गई ऑर्केस्ट्रेशन की ज़रूरत नहीं होती.

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

Chrome DevTools की मदद से यह देखा जा सकता है कि कौनसी स्टाइल किस लेयर से आ रही हैं:

Chrome DevTools के स्टाइल साइडबार का स्क्रीनशॉट. इसमें हाइलाइट किया गया है कि नई लेयर ग्रुप में स्टाइल कैसे दिखती हैं.

संसाधन

सबग्रिड

Browser Support

  • Chrome: 117.
  • Edge: 117.
  • Firefox: 71.
  • Safari: 16.

Source

subgrid से पहले, किसी अन्य ग्रिड के अंदर मौजूद ग्रिड, अपने पैरंट सेल या ग्रिड लाइनों के साथ अलाइन नहीं हो पाता था. हर ग्रिड लेआउट यूनीक था. कई डिज़ाइनर, अपने पूरे डिज़ाइन पर एक ही ग्रिड रखते हैं और उसमें मौजूद आइटम को लगातार अलाइन करते हैं. ऐसा CSS में नहीं किया जा सकता.

subgrid के बाद, ग्रिड में मौजूद कोई बच्चा अपने माता-पिता के कॉलम या लाइनों को अपना सकता है. साथ ही, खुद को या बच्चों को उनके साथ अलाइन कर सकता है!

इस डेमो में, बॉडी एलिमेंट तीन कॉलम वाली क्लासिक ग्रिड बनाता है: बीच वाले कॉलम को main कहा जाता है. साथ ही, बाएं और दाएं कॉलम अपनी लाइनों के नाम रखते हैं fullbleed. इसके बाद, बॉडी में मौजूद हर एलिमेंट, <nav> और <main>, grid-template-columns: subgrid सेट करके बॉडी से नाम वाली लाइनों को अपनाता है.

​​body {
  display: grid;
  grid-template-columns:
    [fullbleed-start]
    auto [main-start] min(90%, 60ch) [main-end] auto
    [fullbleed-end]
  ;
}

body > * {
  display: grid;
  grid-template-columns: subgrid;
}

आखिर में, <nav> या <main> साल के बच्चे, fullbleed और main कॉलम और लाइनों का इस्तेमाल करके, खुद को अलाइन या साइज़ कर सकते हैं.

.main-content {
  grid-column: main;
}

.fullbleed {
  grid-column: fullbleed;
}

Devtools की मदद से, लाइनों और सबग्रिड को देखा जा सकता है. फ़िलहाल, यह सुविधा सिर्फ़ Firefox में उपलब्ध है. यहां दी गई इमेज में, पैरंट ग्रिड और सबग्रिड को ओवरले किया गया है. अब यह लेआउट, डिज़ाइनर की सोच के मुताबिक है.

सबग्रिड डेमो का स्क्रीनशॉट. इसमें Chrome Devtools के ग्रिड ओवरले टूल का इस्तेमाल करके, सीएसएस से तय की गई लाइनों को दिखाया गया है.

DevTools के एलिमेंट पैनल में, यह देखा जा सकता है कि कौनसे एलिमेंट ग्रिड और सबग्रिड हैं. यह लेआउट को डीबग करने या उसकी पुष्टि करने के लिए बहुत मददगार होता है.

Chrome Devtools के एलिमेंट पैनल का स्क्रीनशॉट. इसमें उन एलिमेंट को लेबल किया गया है जिनमें ग्रिड या सबग्रिड लेआउट हैं.
Firefox Devtools से लिया गया स्क्रीनशॉट

संसाधन

कंटेनर क्वेरी

Browser Support

  • Chrome: 105.
  • Edge: 105.
  • Firefox: 110.
  • Safari: 16.

Source

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

@container के बाद, एलिमेंट पैरंट कंटेनर के साइज़ या स्टाइल के हिसाब से काम कर सकते हैं! हालांकि, कंटेनर को खुद को क्वेरी के संभावित टारगेट के तौर पर घोषित करना होगा. यह एक छोटी सी ज़रूरी शर्त है, लेकिन इससे बहुत फ़ायदा मिलता है.

/* establish a container */
.day {
  container-type: inline-size;
  container-name: calendar-day;
}

इन स्टाइल की वजह से, इवेंट एलिमेंट के ज़रिए इस वीडियो में मौजूद सोमवार, मंगलवार, बुधवार, गुरुवार, और शुक्रवार वाले कॉलम के बारे में क्वेरी की जा सकती है.

डेमो उना क्रावेट्स ने बनाया है

यहां calendar-day कंटेनर के साइज़ के बारे में क्वेरी करने के लिए सीएसएस दी गई है. इसके बाद, लेआउट और फ़ॉन्ट के साइज़ में बदलाव किया जा सकता है:

@container calendar-day (max-width: 200px) {
  .date {
    display: block;
  }

  .date-num {
    font-size: 2.5rem;
    display: block;
  }
}

यहां एक और उदाहरण दिया गया है: एक बुक कॉम्पोनेंट, उस कॉलम में मौजूद जगह के हिसाब से अपने-आप अडजस्ट हो जाता है जिसमें उसे ड्रैग किया गया है:

डेमो Max Böck का

उना ने स्थिति का आकलन सही तरीके से किया है. यह नया रिस्पॉन्सिव लेआउट है. @container का इस्तेमाल करते समय, डिज़ाइन से जुड़े कई दिलचस्प और अहम फ़ैसले लिए जा सकते हैं.

संसाधन

accent-color

Browser Support

  • Chrome: 93.
  • Edge: 93.
  • Firefox: 92.
  • Safari: 15.4.

Source

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

accent-color के बाद, सीएसएस की एक लाइन से, बिल्ट-इन कॉम्पोनेंट में ब्रैंड का रंग आ जाता है. ब्राउज़र, कॉम्पोनेंट के अन्य हिस्सों के लिए सही कंट्रास्ट वाले रंगों को चुनता है. साथ ही, सिस्टम की कलर स्कीम (हल्के या गहरे रंग वाली) के हिसाब से अपने-आप अडजस्ट हो जाता है.

/* tint everything */
:root {
  accent-color: hotpink;
}

/* tint one element */
progress {
  accent-color: indigo;
}

तुलना करने के लिए, अगल-बगल में रखे गए हल्के और गहरे रंग के एचटीएमएल एलिमेंट.

accent-color के बारे में ज़्यादा जानने के लिए, web.dev पर मेरी पोस्ट पढ़ें. इसमें मैंने इस काम की CSS प्रॉपर्टी के बारे में कई और पहलुओं पर बात की है.

संसाधन

कलर लेवल 4 और 5

पिछले कई दशकों से, वेब पर sRGB का इस्तेमाल किया जा रहा है. हालांकि, डिजिटल दुनिया में हाई-डेफ़िनिशन डिसप्ले और OLED या QLED स्क्रीन वाले मोबाइल डिवाइसों का इस्तेमाल बढ़ रहा है. इसलिए, sRGB का इस्तेमाल करना काफ़ी नहीं है. इसके अलावा, उपयोगकर्ताओं की प्राथमिकताओं के हिसाब से ढलने वाले डाइनैमिक पेजों की उम्मीद की जाती है. साथ ही, डिज़ाइनर, डिज़ाइन सिस्टम, और कोड को बनाए रखने वाले लोगों के लिए, कलर मैनेजमेंट एक बड़ी समस्या बन गई है.

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

रंग से जुड़ी इन सभी सुविधाओं से पहले, डिज़ाइन सिस्टम को सही कॉन्ट्रास्ट वाले रंगों का पहले से हिसाब लगाना पड़ता था. साथ ही, यह पक्का करना पड़ता था कि पैलेट सही तरीके से वाइब्रेंट हों. इन सभी कामों को प्रीप्रोसेसर या JavaScript की मदद से किया जाता था.

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

@media (dynamic-range: high) {
  .neon-pink {
    --neon-glow: color(display-p3 1 0 1);
  }
}

@supports (color: lab(0% 0 0)) {
  .neon-pink {
    --neon-glow: lab(150% 160 0);
  }
}

hwb()

Browser Support

  • Chrome: 101.
  • Edge: 101.
  • Firefox: 96.
  • Safari: 15.

Source

एचडब्ल्यूबी का मतलब रंग, सफ़ेदी, और कालापन होता है. यह रंग को समझने का आसान तरीका है, क्योंकि इसमें सिर्फ़ रंग और सफ़ेद या काले रंग की मात्रा होती है, जिससे रंग को हल्का या गहरा किया जा सकता है. जो कलाकार रंगों को सफ़ेद या काले रंग के साथ मिक्स करते हैं उन्हें इस रंग के सिंटैक्स को जोड़ने में आसानी हो सकती है.

इस कलर फ़ंक्शन का इस्तेमाल करने पर, sRGB कलर स्पेस के रंग मिलते हैं. ये रंग, एचएसएल और आरजीबी के रंगों जैसे ही होते हैं. साल 2022 के लिए, इसमें कोई नया रंग नहीं जोड़ा गया है. हालांकि, सिंटैक्स और मेंटल मॉडल के फ़ॉलोअर के लिए, इससे कुछ टास्क आसान हो सकते हैं.

संसाधन

कलर स्पेस

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

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

color-mix()

Browser Support

  • Chrome: 111.
  • Edge: 111.
  • Firefox: 113.
  • Safari: 16.2.

Source

color-mix() से पहले, डेवलपर और डिज़ाइनर को ब्राउज़र में रंग दिखाने से पहले, उन्हें मिक्स करने के लिए Sass जैसे प्रीप्रोसेसर की ज़रूरत होती थी. ज़्यादातर कलर-मिक्सिंग फ़ंक्शन में, यह तय करने का विकल्प भी नहीं होता था कि किस कलर स्पेस में मिक्सिंग करनी है. इस वजह से, कभी-कभी नतीजे समझ में नहीं आते थे.

color-mix() के बाद, डेवलपर और डिज़ाइनर ब्राउज़र में रंगों को मिक्स कर सकते हैं. साथ ही, वे अपनी अन्य सभी स्टाइल का इस्तेमाल कर सकते हैं. इसके लिए, उन्हें बिल्ड प्रोसेस चलाने या JavaScript शामिल करने की ज़रूरत नहीं होती. इसके अलावा, वे यह तय कर सकते हैं कि किस कलर स्पेस में मिक्सिंग करनी है या LCH के डिफ़ॉल्ट मिक्सिंग कलर स्पेस का इस्तेमाल करना है.

अक्सर, ब्रैंड के रंग को बेस के तौर पर इस्तेमाल किया जाता है और इससे अलग-अलग रंग बनाए जाते हैं. जैसे, होवर स्टाइल के लिए हल्के या गहरे रंग. color-mix() के साथ यह इस तरह दिखेगा:

.color-mix-example {
  --brand: #0af;

  --darker: color-mix(var(--brand) 25%, black);
  --lighter: color-mix(var(--brand) 25%, white);
}

अगर आपको उन रंगों को किसी दूसरे कलर स्पेस, जैसे कि srgb में मिक्स करना है, तो इसे बदलें:

.color-mix-example {
  --brand: #0af;

  --darker: color-mix(in srgb, var(--brand) 25%, black);
  --lighter: color-mix(in srgb, var(--brand) 25%, white);
}

यहां color-mix() का इस्तेमाल करके, थीमिंग का डेमो दिया गया है. ब्रैंड का रंग बदलकर देखें और थीम को अपडेट करें:

साल 2022 में, अपनी स्टाइलशीट में अलग-अलग कलर स्पेस में रंगों को मिक्स करने का आनंद लें!

संसाधन

color-contrast()

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

मटीरियल पैलेट के तीन स्क्रीनशॉट. इनमें 14 रंग और टेक्स्ट के लिए, उनके हिसाब से सफ़ेद या काले रंग के कंट्रास्ट वाले रंग दिखाए गए हैं.
2014 के मटीरियल डिज़ाइन कलर पैलेट का उदाहरण

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

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

एचडब्ल्यूबी डेमो का स्क्रीनशॉट. इसमें हर पैलेट में, ब्राउज़र के हिसाब से हल्के या गहरे रंग के टेक्स्ट की अलग-अलग जोड़ी दिखाई गई है.
डेमो आज़माएं

सिंटैक्स का बुनियादी स्ट्रक्चर इस तरह दिखता है. इसमें फ़ंक्शन को ग्रे रंग दिया जाता है और ब्राउज़र यह तय करता है कि ब्लैक या व्हाइट में सबसे ज़्यादा कॉन्ट्रास्ट है या नहीं:

color: color-contrast(gray);

इस फ़ंक्शन को रंगों की सूची के हिसाब से भी पसंद के मुताबिक बनाया जा सकता है. इससे यह फ़ंक्शन, चुने गए रंगों में से सबसे अलग रंग को चुन पाएगा:

color: color-contrast(gray vs indigo, rebeccapurple, hotpink);

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

color: color-contrast(
  var(--bg-blue-1)
  vs
  var(--text-lightest), var(--text-light), var(--text-subdued)
  to AA /* 4.5 could also be passed */
);

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

संसाधन

रिलेटिव कलर सिंटैक्स

Browser Support

  • Chrome: 111.
  • Edge: 111.
  • Firefox: 113.
  • Safari: 15.

Source

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

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

सिंटैक्स के इस उदाहरण में, एक बेस हेक्स दिया गया है और इसके हिसाब से दो नए रंग बनाए गए हैं. पहला रंग --absolute-change, बेस कलर से एलसीएच में एक नया रंग बनाता है. इसके बाद, बेस कलर की चमक को 75% से बदल देता है. हालांकि, क्रोमा (c) और रंगत (h) को बनाए रखता है. दूसरा रंग --relative-change, बेस कलर से एलसीएच में एक नया रंग बनाता है. हालांकि, इस बार क्रोमा (c) को 20% कम कर देता है.

.relative-color-syntax {
  --color: #0af;
  --absolute-change: lch(from var(--color) 75% c h);
  --relative-change: lch(from var(--color) l calc(c-20%) h);
}

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

नीचे दिए गए डेमो में, मैंने किसी रंग के हल्के और गहरे वैरिएंट बनाने के लिए, रिलेटिव कलर सिंटैक्स का इस्तेमाल किया है. साथ ही, यह पक्का करने के लिए color-contrast() का इस्तेमाल किया है कि लेबल में सही कंट्रास्ट हो:

तीन कॉलम वाला स्क्रीनशॉट. हर कॉलम, बीच वाले कॉलम से ज़्यादा गहरा या हल्का है.
डेमो आज़माएं

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

:root {
  --_color-base: #339af0;

  --color-0:  lch(from var(--_color-base) 98% 10 h);
  --color-1:  lch(from var(--_color-base) 93% 20 h);
  --color-2:  lch(from var(--_color-base) 85% 40 h);
  --color-3:  lch(from var(--_color-base) 75% 46 h);
  --color-4:  lch(from var(--_color-base) 66% 51 h);
  --color-5:  lch(from var(--_color-base) 61% 52 h);
  --color-6:  lch(from var(--_color-base) 55% 57 h);
  --color-7:  lch(from var(--_color-base) 49% 58 h);
  --color-8:  lch(from var(--_color-base) 43% 55 h);
  --color-9:  lch(from var(--_color-base) 39% 52 h);
  --color-10: lch(from var(--_color-base) 32% 48 h);
  --color-11: lch(from var(--_color-base) 25% 45 h);
  --color-12: lch(from var(--_color-base) 17% 40 h);
  --color-13: lch(from var(--_color-base) 10% 30 h);
  --color-14: lch(from var(--_color-base) 5% 20 h);
  --color-15: lch(from var(--_color-base) 1% 5 h);
}
सीएसएस की मदद से डाइनैमिक तरीके से जनरेट की गई 15 पैलेट का स्क्रीनशॉट.
डेमो आज़माएं

हमें उम्मीद है कि अब आपको समझ आ गया होगा कि कलर स्पेस और अलग-अलग कलर फ़ंक्शन का इस्तेमाल, अलग-अलग मकसद से कैसे किया जा सकता है. यह इस बात पर निर्भर करता है कि उनकी खूबियां और कमियां क्या हैं.

संसाधन

ग्रेडिएंट कलर स्पेस

ग्रेडिएंट कलर स्पेस से पहले, sRGB का इस्तेमाल डिफ़ॉल्ट कलर स्पेस के तौर पर किया जाता था. sRGB आम तौर पर भरोसेमंद होता है, लेकिन इसमें कुछ कमियां भी हैं. जैसे, ग्रे डेड ज़ोन.

ग्रिड में चार ग्रेडिएंट हैं. सभी सियान से डीपपिंक तक हैं. एलसीएच और एलएबी में रंग ज़्यादा चटख होते हैं, जबकि sRGB में बीच का रंग थोड़ा हल्का हो जाता है.

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

सिंटैक्स को ग्रेडिएंट की दिशा के बाद जोड़ा जाता है. इसमें नए in सिंटैक्स का इस्तेमाल किया जाता है. हालांकि, इसे जोड़ना ज़रूरी नहीं है:

background-image: linear-gradient(
  to right in hsl,
  black, white
);

background-image: linear-gradient(
  to right in lch,
  black, white
);

यहां काले से सफ़ेद रंग में बदलने वाला एक बुनियादी और ज़रूरी ग्रेडिएंट दिया गया है. हर कलर स्पेस में नतीजों की रेंज देखें. कुछ का रंग दूसरों की तुलना में पहले ही गहरा काला हो जाता है, जबकि कुछ का रंग बहुत देर बाद सफ़ेद होता है.

इस इमेज में, काले और सफ़ेद रंग की तुलना करते हुए 11 कलर स्पेस दिखाए गए हैं.

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

नीले रंग की तुलना काले रंग से करते हुए, 11 कलर स्पेस दिखाए गए हैं.

ज़्यादा जानकारी, उदाहरण, और टिप्पणियों के लिए, यह Twitter थ्रेड पढ़ें.

संसाधन

inert

Browser Support

  • Chrome: 102.
  • Edge: 102.
  • Firefox: 112.
  • Safari: 15.5.

Source

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

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

इसका एक अच्छा उदाहरण, JavaScript का alert() फ़ंक्शन है:

वेबसाइट को इंटरैक्टिव के तौर पर दिखाया जाता है. इसके बाद, alert() को कॉल किया जाता है और पेज अब सक्रिय नहीं रहता.

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

यहां एक छोटा कोड सैंपल दिया गया है, ताकि आपको पता चल सके कि यह कैसे काम करता है:

<body>
  <div class="modal">
    <h2>Modal Title</h2>
    <p>...<p>
    <button>Save</button>
    <button>Discard</button>
  </div>
  <main inert>
    <!-- cannot be keyboard focused or clicked -->
  </main>
</body>

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

संसाधन

COLRv1 फ़ॉन्ट

COLRv1 फ़ॉन्ट से पहले, वेब पर OT-SVG फ़ॉन्ट उपलब्ध थे. यह फ़ॉन्ट भी एक ओपन फ़ॉर्मैट है. इसमें ग्रेडिएंट, बिल्ट-इन कलर, और इफ़ेक्ट वाले फ़ॉन्ट शामिल होते हैं. हालांकि, ये बहुत बड़े हो सकते थे. साथ ही, इनमें टेक्स्ट में बदलाव करने की सुविधा मिलती थी, लेकिन इन्हें अपनी पसंद के मुताबिक बनाने का विकल्प नहीं था.

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

तुलना करने वाला विज़ुअलाइज़ेशन और बार चार्ट. इसमें दिखाया गया है कि COLRv1 फ़ॉन्ट ज़्यादा शार्प और छोटे होते हैं.
यह इमेज https://developer.chrome.com/blog/colrv1-fonts/ से ली गई है

यहां Chrome डेवलपर ब्लॉग पोस्ट से लिया गया इमोजी का एक उदाहरण दिया गया है. आपने शायद यह देखा होगा कि इमोजी के फ़ॉन्ट का साइज़ बढ़ाने पर, वह साफ़ नहीं दिखता. यह एक इमेज है, न कि वेक्टर आर्ट. अक्सर ऐप्लिकेशन में इमोजी का इस्तेमाल करने पर, उसे बेहतर क्वालिटी वाली ऐसेट से बदल दिया जाता है. COLRv1 फ़ॉन्ट की मदद से, इमोजी को वेक्टर और सुंदर बनाया जा सकता है:

आइकॉन फ़ॉन्ट, इस फ़ॉर्मैट के साथ कुछ बेहतरीन काम कर सकते हैं. जैसे, कस्टम डुओ-टोन कलर पैलेट और अन्य सुविधाएं उपलब्ध कराना. COLRv1 फ़ॉन्ट को लोड करना, किसी अन्य फ़ॉन्ट फ़ाइल को लोड करने जैसा ही होता है:

@import url(https://fonts.googleapis.com/css2?family=Bungee+Spice);

COLRv1 फ़ॉन्ट को पसंद के मुताबिक बनाने के लिए, @font-palette-values का इस्तेमाल किया जाता है. यह एक खास सीएसएस ऐट-रूल है. इसका इस्तेमाल, पसंद के मुताबिक बनाने के विकल्पों के सेट को ग्रुप करने और उन्हें नाम देने के लिए किया जाता है, ताकि बाद में उन्हें रेफ़रंस के तौर पर इस्तेमाल किया जा सके. ध्यान दें कि कस्टम प्रॉपर्टी की तरह ही, कस्टम नाम कैसे तय किया जाता है. इसकी शुरुआत -- से होती है:

@import url(https://fonts.googleapis.com/css2?family=Bungee+Spice);

@font-palette-values --colorized {
  font-family: "Bungee Spice";
  base-palette: 0;
  override-colors: 0 hotpink, 1 cyan, 2 white;
}

कस्टमाइज़ेशन के लिए --colorized को एलियास के तौर पर इस्तेमाल करने के बाद, आखिरी चरण में पैलेट को उस एलिमेंट पर लागू करना होता है जो कलर फ़ॉन्ट फ़ैमिली का इस्तेमाल कर रहा है:

@import url(https://fonts.googleapis.com/css2?family=Bungee+Spice);

@font-palette-values --colorized {
  font-family: "Bungee Spice";
  base-palette: 0;
  override-colors: 0 hotpink, 1 cyan, 2 white;
}

.spicy {
  font-family: "Bungee Spice";
  font-palette: --colorized;
}
DUNE शब्द के साथ Bungee Spice फ़ॉन्ट का स्क्रीनशॉट.
Bungee Spice फ़ॉन्ट को पसंद के मुताबिक बनाए गए रंगों के साथ दिखाया गया है. इसका सोर्स https://developer.chrome.com/blog/colrv1-fonts/ है

ज़्यादा से ज़्यादा वैरिएबल फ़ॉन्ट और कलर फ़ॉन्ट उपलब्ध होने की वजह से, वेब टाइपोग्राफ़ी, क्रिएटिविटी और पसंद के मुताबिक बनाने के मामले में बहुत आगे बढ़ रही है.

संसाधन

व्यूपोर्ट यूनिट

इस ग्राफ़िक में दिखाया गया है कि डिवाइस की स्क्रीन, ब्राउज़र विंडो, और iframe, सभी के अलग-अलग व्यूपोर्ट होते हैं.

व्यूपोर्ट के नए वर्शन से पहले, वेब पर फ़िज़िकल यूनिट उपलब्ध कराई जाती थीं. इससे व्यूपोर्ट को फ़िट करने में मदद मिलती थी. इनमें ऊंचाई, चौड़ाई, सबसे छोटा साइज़ (vmin), और सबसे बड़ा साइज़ (vmax) शामिल हैं. इनसे कई काम आसानी से हो जाते थे, लेकिन मोबाइल ब्राउज़र की वजह से समस्याएं आने लगीं.

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

.original-viewport-units {
  height: 100vh;
  width: 100vw;
  --size: 100vmin;
  --size: 100vmax;
}

नए व्यूपोर्ट वैरिएंट के बाद, छोटी, बड़ी, और डाइनैमिक व्यूपोर्ट यूनिट उपलब्ध कराई जाती हैं. साथ ही, फ़िज़िकल यूनिट में लॉजिकल यूनिट जोड़ी जाती हैं. इसका मकसद, डेवलपर और डिज़ाइनर को यह सुविधा देना है कि वे अपने दिए गए उदाहरण के लिए, यह चुन सकें कि उन्हें कौनसी यूनिट का इस्तेमाल करना है. स्टेटस बार के हट जाने पर, लेआउट में थोड़ा बदलाव हो सकता है. इसलिए, dvh (डाइनैमिक व्यूपोर्ट की ऊंचाई) का इस्तेमाल बिना किसी चिंता के किया जा सकता है.

इस ग्राफ़िक में तीन फ़ोन दिखाए गए हैं, ताकि DVH, LVH, और SVH को बेहतर तरीके से समझाया जा सके. DVH के उदाहरण के तौर पर दिखाए गए फ़ोन में दो वर्टिकल लाइनें हैं. पहली लाइन, खोज बार के सबसे नीचे और व्यूपोर्ट के सबसे नीचे के बीच में है. दूसरी लाइन, खोज बार के ऊपर (सिस्टम स्टेटस बार के नीचे) और व्यूपोर्ट के सबसे नीचे के बीच में है. इससे पता चलता है कि DVH, इन दोनों में से किसी भी लंबाई का हो सकता है. एलवीएच को बीच में दिखाया गया है. डिवाइस के स्टेटस बार के सबसे नीचे और फ़ोन के व्यूपोर्ट के बटन के बीच एक लाइन है. आखिरी उदाहरण एसवीएच यूनिट का है. इसमें ब्राउज़र के खोज बार के सबसे नीचे वाली लाइन से लेकर व्यूपोर्ट के सबसे नीचे वाली लाइन तक दिखाया गया है

यहां व्यूपोर्ट के नए वैरिएंट के साथ उपलब्ध कराए गए, व्यूपोर्ट यूनिट के सभी नए विकल्पों की पूरी सूची दी गई है:

व्यूपोर्ट की ऊंचाई की इकाइयां
​​.new-height-viewport-units {
  height: 100vh;
  height: 100dvh;
  height: 100svh;
  height: 100lvh;
  block-size: 100vb;
  block-size: 100dvb;
  block-size: 100svb;
  block-size: 100lvb;
}
व्यूपोर्ट की चौड़ाई की इकाइयां
.new-width-viewport-units {
  width: 100vw;
  width: 100dvw;
  width: 100svw;
  width: 100lvw;
  inline-size: 100vi;
  inline-size: 100dvi;
  inline-size: 100svi;
  inline-size: 100lvi;
}
व्यूपोर्ट की सबसे छोटी साइड यूनिट
.new-min-viewport-units {
  --size: 100vmin;
  --size: 100dvmin;
  --size: 100svmin;
  --size: 100lvmin;
}
सबसे बड़ी व्यूपोर्ट साइड यूनिट
.new-max-viewport-units {
  --size: 100vmax;
  --size: 100dvmax;
  --size: 100svmax;
  --size: 100lvmax;
}

हमें उम्मीद है कि इससे डेवलपर और डिज़ाइनर को, व्यूपोर्ट के रिस्पॉन्सिव डिज़ाइन बनाने में मदद मिलेगी.

संसाधन

:has()

Browser Support

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

Source

:has() से पहले, चुनने वाले टूल का विषय हमेशा आखिर में होता था. उदाहरण के लिए, इस सिलेक्टर का विषय सूची में दिया गया आइटम है: ul > li. स्यूडो सिलेक्टर, सिलेक्टर में बदलाव कर सकते हैं. हालांकि, वे विषय को नहीं बदलते: ul > li:hover या ul > li:not(.selected).

:has() के बाद, एलिमेंट ट्री में ऊपर मौजूद कोई विषय, बच्चों के बारे में क्वेरी करते समय भी विषय बना रह सकता है: ul:has(> li). यह समझना आसान है कि :has() को "पैरंट सिलेक्टर" नाम क्यों दिया गया है, क्योंकि इस मामले में सिलेक्टर का विषय अब पैरंट है.

यहां सिंटैक्स का एक बुनियादी उदाहरण दिया गया है. इसमें क्लास .parent विषय बनी रहती है, लेकिन इसे सिर्फ़ तब चुना जाता है, जब किसी चाइल्ड एलिमेंट में .child क्लास मौजूद हो:

.parent:has(.child) {...}

यहां एक उदाहरण दिया गया है, जिसमें <section> एलिमेंट सब्जेक्ट है. हालांकि, सिलेक्टर सिर्फ़ तब मैच होता है, जब किसी चाइल्ड में :focus-visible मौजूद हो:

section:has(*:focus-visible) {...}

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

a:has(> img) {...}

इन सभी उदाहरणों में, :has() सिर्फ़ पैरंट सिलेक्टर की तरह दिखता है. <figure> एलिमेंट में मौजूद इमेज के इस्तेमाल के उदाहरण पर विचार करें. साथ ही, अगर फ़िगर में <figcaption> है, तो इमेज के स्टाइल में बदलाव करें. यहां दिए गए उदाहरण में, figcaption के साथ फ़िगर चुने गए हैं. इसके बाद, उस कॉन्टेक्स्ट में मौजूद इमेज चुनी गई हैं. :has() का इस्तेमाल किया गया है और इससे विषय नहीं बदला है, क्योंकि हमारा टारगेट विषय इमेज है, न कि आंकड़े:

figure:has(figcaption) img {...}

इनका इस्तेमाल कई तरह से किया जा सकता है. :has() को quantity queries के साथ मिलाएं और बच्चों की संख्या के आधार पर सीएसएस ग्रिड लेआउट में बदलाव करें. :has() को इंटरैक्टिव सूडो क्लास स्टेट के साथ मिलाएं और ऐसे ऐप्लिकेशन बनाएं जो नए क्रिएटिव तरीकों से जवाब देते हैं.

@supports और इसके selector() फ़ंक्शन की मदद से, यह आसानी से पता लगाया जा सकता है कि ब्राउज़र में इस सुविधा के लिए सहायता उपलब्ध है या नहीं. यह फ़ंक्शन, सिंटैक्स का इस्तेमाल करने से पहले यह जांच करता है कि ब्राउज़र को सिंटैक्स समझ में आता है या नहीं:

@supports (selector(:has(works))) {
  /* safe to use :has() */
}

संसाधन

2022 और इसके बाद

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

अगले सेक्शन में दी गई जानकारी से आपको यह पता चलेगा कि यहां बताई गई समस्याओं को ठीक करने के लिए, कई कंपनियों के लोग समाधान ढूंढ रहे हैं. इसका मतलब यह नहीं है कि इन समाधानों को 2023 में रिलीज़ किया जाएगा.

लूज़ली टाइप की गई कस्टम प्रॉपर्टी

Browser Support

  • Chrome: 85.
  • Edge: 85.
  • Firefox: 128.
  • Safari: 16.4.

Source

सीएसएस की कस्टम प्रॉपर्टी बहुत अच्छी होती हैं. इनकी मदद से, किसी नाम वाले वैरिएबल में हर तरह की चीज़ें सेव की जा सकती हैं. इसके बाद, उन्हें बढ़ाया जा सकता है, उन पर कैलकुलेशन की जा सकती है, उन्हें शेयर किया जा सकता है, और भी बहुत कुछ किया जा सकता है. दरअसल, ये इतने लचीले हैं कि कुछ ऐसे भी होने चाहिए जो कम लचीले हों.

मान लें कि किसी box-shadow ने अपनी वैल्यू के लिए कस्टम प्रॉपर्टी का इस्तेमाल किया है:

box-shadow: var(--x) var(--y) var(--blur) var(--spread) var(--color);

यह सब तब तक ठीक से काम करता है, जब तक किसी प्रॉपर्टी की वैल्यू को ऐसी वैल्यू में नहीं बदल दिया जाता जिसे सीएसएस स्वीकार नहीं करती. जैसे, --x: red. अगर नेस्ट किए गए किसी भी वैरिएबल की वैल्यू मौजूद नहीं है या उसे अमान्य वैल्यू टाइप पर सेट किया गया है, तो पूरी शैडो टूट जाती है.

ऐसे में, @property काम आता है: --x को टाइप की गई कस्टम प्रॉपर्टी बनाया जा सकता है. यह अब ढीली और फ़्लेक्सिबल नहीं रहेगी, बल्कि कुछ तय सीमाओं के साथ सुरक्षित रहेगी:

@property --x {
  syntax: '<length>';
  initial-value: 0px;
  inherits: false;
}

अब जब box-shadow, var(--x) का इस्तेमाल करता है और बाद में --x: red का इस्तेमाल करने की कोशिश की जाती है, तो red को अनदेखा कर दिया जाएगा, क्योंकि यह <length> नहीं है. इसका मतलब है कि शैडो काम करती रहेगी, भले ही उसकी किसी कस्टम प्रॉपर्टी को अमान्य वैल्यू दी गई हो. इसके बजाय, यह 0px के initial-value पर वापस आ जाता है.

ऐनिमेशन

टाइप की सुरक्षा के साथ-साथ, यह ऐनिमेशन के लिए भी कई विकल्प उपलब्ध कराता है. सीएसएस सिंटैक्स में कुछ चीज़ों को ऐनिमेट करना मुमकिन नहीं है. जैसे, ग्रेडिएंट. @property यहां मदद करता है, क्योंकि टाइप की गई सीएसएस प्रॉपर्टी, ब्राउज़र को डेवलपर के मकसद के बारे में बता सकती है. ऐसा, इंटरपोलेशन के बहुत ज़्यादा जटिल होने पर किया जाता है. इससे, ब्राउज़र के लिए स्टाइल के कुछ ऐसे पहलुओं को ऐनिमेट करना मुमकिन हो जाता है जिन्हें वह पहले ऐनिमेट नहीं कर सकता था.

इस डेमो उदाहरण पर गौर करें. इसमें, ओवरले के एक हिस्से को बनाने के लिए रेडियल ग्रेडिएंट का इस्तेमाल किया गया है. इससे स्पॉटलाइट फ़ोकस इफ़ेक्ट बनता है. JavaScript, alt/opt कुंजी दबाने पर माउस x और y सेट करती है. इसके बाद, फ़ोकल साइज़ को 25% जैसी छोटी वैल्यू में बदल देती है. इससे माउस की पोज़िशन पर स्पॉटलाइट फ़ोकस सर्कल बन जाता है:

डेमो आज़माएं
.focus-effect {
  --focal-size: 100%;
  --mouse-x: center;
  --mouse-y: center;

  mask-image: radial-gradient(
    circle at var(--mouse-x) var(--mouse-y),
    transparent 0%,
    transparent var(--focal-size),
    black 0%
  );
}

हालांकि, ग्रेडिएंट को एनिमेट नहीं किया जा सकता. ये बहुत ज़्यादा फ़्लेक्सिबल और जटिल होते हैं. इसलिए, ब्राउज़र को यह "सिर्फ़ अनुमान लगाने" में मुश्किल होती है कि आपको इन्हें कैसे ऐनिमेट करना है. हालांकि, @property की मदद से, किसी प्रॉपर्टी को अलग से टाइप और ऐनिमेट किया जा सकता है. इससे ब्राउज़र को आसानी से यह पता चल जाता है कि प्रॉपर्टी को किस मकसद से ऐनिमेट किया गया है.

इस फ़ोकस इफ़ेक्ट का इस्तेमाल करने वाले वीडियो गेम में, सर्कल हमेशा ऐनिमेट होता है. यह बड़े सर्कल से पिनहोल सर्कल में बदलता है. हमारे डेमो के साथ @property का इस्तेमाल करने का तरीका यहां बताया गया है, ताकि ब्राउज़र ग्रेडिएंट मास्क को ऐनिमेट कर सके:

@property --focal-size {
  syntax: '<length-percentage>';
  initial-value: 100%;
  inherits: false;
}

.focus-effect {
  --focal-size: 100%;
  --mouse-x: center;
  --mouse-y: center;

  mask-image: radial-gradient(
    circle at var(--mouse-x) var(--mouse-y),
    transparent 0%,
    transparent var(--focal-size),
    black 0%
  );

  transition: --focal-size .3s ease;
}
डेमो आज़माएं

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

@property में और भी कई सुविधाएं हैं, लेकिन इन छोटी-छोटी सुविधाओं को चालू करने से आपको काफ़ी फ़ायदा मिल सकता है.

संसाधन

min-width या max-width में था

मीडिया क्वेरी रेंज से पहले, सीएसएस मीडिया क्वेरी में min-width और max-width का इस्तेमाल किया जाता है. इससे, किसी शर्त के पूरा होने या न होने के बारे में बताया जाता है. यह इस तरह दिख सकता है:

@media (min-width: 320px) {
  
}

मीडिया क्वेरी की रेंज के बाद, वही मीडिया क्वेरी कुछ ऐसी दिख सकती है:

@media (width >= 320px) {
  
}

min-width और max-width, दोनों का इस्तेमाल करने वाली सीएसएस मीडिया क्वेरी ऐसी दिख सकती है:

@media (min-width: 320px) and (max-width: 1280px) {
  
}

मीडिया क्वेरी की रेंज के बाद, वही मीडिया क्वेरी कुछ ऐसी दिख सकती है:

@media (320px <= width <= 1280px) {
  
}

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

संसाधन

कोई मीडिया क्वेरी वैरिएबल नहीं

@custom-media से पहले, मीडिया क्वेरी को बार-बार दोहराना पड़ता था या बिल्ड टाइम के दौरान स्टैटिक वैरिएबल के आधार पर सही आउटपुट जनरेट करने के लिए, प्रीप्रोसेसर पर भरोसा करना पड़ता था.

@custom-media के बाद, सीएसएस में मीडिया क्वेरी को एलियास करने और उन्हें रेफ़रंस करने की अनुमति होती है. यह कस्टम प्रॉपर्टी की तरह ही होता है.

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

@custom-media --OSdark  (prefers-color-scheme: dark);
@custom-media --OSlight (prefers-color-scheme: light);

@custom-media --pointer (hover) and (pointer: coarse);
@custom-media --mouse   (hover) and (pointer: fine);

@custom-media --xxs-and-above (width >= 240px);
@custom-media --xxs-and-below (width <= 240px);

अब जब उन्हें तय कर लिया गया है, तो मैं इनमें से किसी एक का इस्तेमाल इस तरह कर सकता/सकती हूं:

@media (--OSdark) {
  :root {
    
  }
}

मुझे Open Props नाम की सीएसएस कस्टम प्रॉपर्टी लाइब्रेरी में इस्तेमाल की गई कस्टम मीडिया क्वेरी की पूरी सूची दिखाओ.

संसाधन

नेस्टिंग सिलेक्टर बहुत अच्छे होते हैं

@nest से पहले, स्टाइलशीट में कई बार एक ही तरह की जानकारी दी जाती थी. जब सिलेक्टर लंबे होते थे और हर सिलेक्टर में छोटे-छोटे अंतर होते थे, तब यह खास तौर पर मुश्किल हो जाता था. नेस्टिंग की सुविधा, प्रीप्रोसेसर को अपनाने की सबसे सामान्य वजहों में से एक है.

@nest के बाद, दोहराने की सुविधा बंद हो जाती है. प्रीप्रोसेसर की सुविधा वाली नेस्टिंग की करीब-करीब हर सुविधा, सीएसएस में उपलब्ध कराई जाएगी.

article {
  color: darkgray;
}

article > a {
  color: var(--link-color);
}

/* with @nest becomes */

article {
  color: darkgray;

  & > a {
    color: var(--link-color);
  }
}

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

मालिकाना हक को केंद्रीकरण के तौर पर भी देखा जा सकता है. स्टाइलशीट में काम की स्टाइल ढूंढने के बजाय, उन्हें एक साथ किसी कॉन्टेक्स्ट में नेस्ट किया जा सकता है. यह पैरंट से चाइल्ड रिलेशनशिप के साथ-साथ चाइल्ड से पैरंट रिलेशनशिप के साथ भी काम करता है.

मान लें कि कोई कॉम्पोनेंट चाइल्ड, पैरंट के अलग कॉन्टेक्स्ट में खुद को अडजस्ट करना चाहता है. इसके उलट, पैरंट के पास स्टाइल का मालिकाना हक होता है और वह चाइल्ड में बदलाव करता है:

/* parent owns this, adjusting children */
section:focus-within > article {
  border: 1px solid hotpink;
}

/* with @nest becomes */

/* article owns this, adjusting itself when inside a section:focus-within */
article {
  @nest section:focus-within > & {
     border: 1px solid hotpink;
  }
}

@nest की मदद से, स्टाइल को बेहतर तरीके से व्यवस्थित किया जा सकता है, उन्हें एक जगह पर इकट्ठा किया जा सकता है, और उनका मालिकाना हक तय किया जा सकता है. स्टाइल ब्लॉक के बीच स्टाइल को बांटने के बजाय, कॉम्पोनेंट अपनी स्टाइल को ग्रुप कर सकते हैं और उनका मालिकाना हक रख सकते हैं. इन उदाहरणों में यह बदलाव छोटा लग सकता है, लेकिन इससे पढ़ने में आसानी होती है और यह बहुत काम का होता है.

संसाधन

स्टाइल को स्कोप करना बहुत मुश्किल है

Browser Support

  • Chrome: 118.
  • Edge: 118.
  • Firefox: behind a flag.
  • Safari: 17.4.

Source

@scope से पहले, कई रणनीतियां मौजूद थीं, क्योंकि सीएसएस में स्टाइल कैस्केड होती हैं, इनहेरिट होती हैं, और डिफ़ॉल्ट रूप से ग्लोबल तौर पर स्कोप की जाती हैं. सीएसएस की ये सुविधाएँ कई कामों के लिए बहुत आसान होती हैं. हालाँकि, जटिल साइटों और ऐप्लिकेशन के लिए, जिनमें कॉम्पोनेंट की कई अलग-अलग स्टाइल हो सकती हैं, ग्लोबल स्पेस और कैस्केड की वजह से ऐसा लग सकता है कि स्टाइल लीक हो रही हैं.

@scope के बाद, स्टाइल को सिर्फ़ किसी कॉन्टेक्स्ट, जैसे कि क्लास के दायरे में नहीं रखा जा सकता. साथ ही, यह भी बताया जा सकता है कि स्टाइल कहां खत्म होती हैं और कैस्केड या इनहेरिट नहीं होती हैं.

यहां दिए गए उदाहरण में, BEM नेमिंग कन्वेंशन स्कोपिंग को असल मकसद में बदला जा सकता है. इस उदाहरण में, BEM सिलेक्टर, header एलिमेंट के रंग को .card कंटेनर के स्कोप में लाने की कोशिश कर रहा है. इसके लिए, नाम रखने के नियमों का पालन किया जा रहा है. इसके लिए, हेडर में यह क्लासनेम होना ज़रूरी है. इससे लक्ष्य पूरा हो जाता है. @scope की मदद से, हेडर एलिमेंट को मार्क अप किए बिना एक ही लक्ष्य को पूरा करने के लिए, नाम रखने के किसी भी नियम का पालन करने की ज़रूरत नहीं होती:

.card__header {
  color: var(--text);
}

/* with @scope becomes */

@scope (.card) {
  header {
    color: var(--text);
  }
}

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

​​@scope (.light-theme) {
  a { color: purple; }
}

@scope (.dark-theme) {
  a { color: plum; }
}

यहां दी गई जानकारी को पूरा करने के लिए, @scope यह भी तय करता है कि स्टाइल स्कोप कहां खत्म होता है. इसे किसी भी नेमिंग कन्वेंशन या प्रीप्रोसेसर के साथ नहीं किया जा सकता; यह खास है और इसे सिर्फ़ ब्राउज़र में पहले से मौजूद सीएसएस कर सकती है. यहां दिए गए उदाहरण में, img और .content स्टाइल सिर्फ़ तब लागू होती हैं, जब .media-block का कोई चाइल्ड, .content का सिबलिंग या पैरंट हो:

@scope (.media-block) to (.content) {
  img {
    border-radius: 50%;
  }

  .content {
    padding: 1em;
  }
}

संसाधन

मेसनरी लेआउट के लिए कोई सीएसएस तरीका नहीं है

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

सीएसएस मेसनरी और ग्रिड का इस्तेमाल करने के बाद, JavaScript लाइब्रेरी की ज़रूरत नहीं होगी. साथ ही, कॉन्टेंट का क्रम सही होगा.

मेसनरी लेआउट का स्क्रीनशॉट. इसमें सबसे ऊपर नंबर दिख रहे हैं, जो नीचे की ओर जा रहे हैं.
Smashing Magazine से ली गई इमेज और डेमो
https://www.smashingmagazine.com/native-css-masonry-layout-css-grid/

ऊपर दिया गया डेमो, इस सीएसएस की मदद से बनाया गया है:

.container {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  grid-template-rows: masonry;
}

यह जानकर खुशी हुई कि लेआउट की इस रणनीति को शामिल करने पर विचार किया जा रहा है. साथ ही, इसे आज ही Firefox में आज़माया जा सकता है.

संसाधन

सीएसएस, उपयोगकर्ताओं को डेटा कम करने में मदद नहीं कर सकती

Browser Support

  • Chrome: behind a flag.
  • Edge: behind a flag.
  • Firefox: not supported.
  • Safari: not supported.

Source

prefers-reduced-data मीडिया क्वेरी से पहले, JavaScript और सर्वर, उपयोगकर्ता के ऑपरेटिंग सिस्टम या ब्राउज़र के "डेटा सेवर" विकल्प के आधार पर अपना व्यवहार बदल सकते थे. हालांकि, सीएसएस ऐसा नहीं कर सकती थी.

prefers-reduced-data मीडिया क्वेरी के बाद, सीएसएस उपयोगकर्ता अनुभव को बेहतर बनाने में मदद कर सकती है. साथ ही, डेटा को सेव करने में भी अपनी भूमिका निभा सकती है.

@media (prefers-reduced-data: reduce) {
  picture, video {
    display: none;
  }
}

ऊपर दिए गए सीएसएस का इस्तेमाल इस मीडिया स्क्रोल कॉम्पोनेंट में किया जाता है. इससे काफ़ी बचत हो सकती है. विज़िट किए जा रहे व्यूपोर्ट का साइज़ जितना बड़ा होगा, पेज लोड होने में उतनी ही ज़्यादा बचत होगी. उपयोगकर्ताओं के मीडिया स्क्रोलर से इंटरैक्ट करने पर, सेव करने की प्रोसेस जारी रहती है. सभी इमेज में loading="lazy" एट्रिब्यूट मौजूद हैं. साथ ही, सीएसएस की मदद से एलिमेंट को पूरी तरह से छिपाया गया है. इसका मतलब है कि इमेज के लिए नेटवर्क अनुरोध कभी नहीं किया जाता.

टीवी शो के कैरसेल इंटरफ़ेस का स्क्रीनशॉट. इसमें कई थंबनेल और टाइटल दिखाए गए हैं.

मेरी टेस्टिंग के लिए, मीडियम साइज़ वाले व्यूपोर्ट पर, शुरुआत में 40 अनुरोध और 700 केबी के संसाधन लोड किए गए थे. जब कोई उपयोगकर्ता मीडिया चुनने के लिए स्क्रोल करता है, तो ज़्यादा अनुरोध और संसाधन लोड होते हैं. सीएसएस और कम किए गए डेटा मीडिया क्वेरी की मदद से, 10 अनुरोध और 172 केबी के संसाधन लोड किए जाते हैं. इससे आधा मेगाबाइट डेटा की बचत होती है. साथ ही, उपयोगकर्ता ने किसी भी मीडिया को स्क्रोल नहीं किया है. इस समय कोई अतिरिक्त अनुरोध नहीं किया गया है.

टीवी शो के कैरसेल इंटरफ़ेस का स्क्रीनशॉट. इसमें कोई थंबनेल नहीं है और कई टाइटल दिखाए गए हैं.

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

संसाधन

स्क्रोल स्नैप करने की सुविधाएं बहुत सीमित हैं

स्क्रोल स्नैप के सुझावों से पहले, कैरसेल, स्लाइडर या गैलरी को मैनेज करने के लिए, अपनी JavaScript लिखना मुश्किल हो सकता था. इसमें सभी ऑब्ज़र्वर और स्टेट मैनेजमेंट शामिल होते थे. इसके अलावा, अगर ध्यान न दिया जाए, तो स्क्रिप्ट की मदद से स्क्रोलिंग की सामान्य स्पीड को भी सामान्य किया जा सकता है. इससे उपयोगकर्ता को इंटरैक्शन थोड़ा अजीब और संभावित रूप से मुश्किल लग सकता है.

नए एपीआई

snapChanging()

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

document.querySelector('.snap-carousel').addEventListener('snapchanging', event => {
  console.log('Snap is changing', event.snappedTargetsList);
});
snapChanged()

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

document.querySelector('.snap-carousel').addEventListener('snapchanged', event => {
  console.log('Snap changed', event.snappedTargetsList);
});
scroll-start

स्क्रोलिंग हमेशा शुरुआत से शुरू नहीं होती. स्वाइप किए जा सकने वाले कॉम्पोनेंट का इस्तेमाल करें. इनमें बाईं या दाईं ओर स्वाइप करने पर अलग-अलग इवेंट ट्रिगर होते हैं. इसके अलावा, खोज बार का इस्तेमाल करें. यह पेज लोड होने पर, तब तक छिपा रहता है, जब तक आप सबसे ऊपर तक स्क्रोल नहीं करते. इस सीएसएस प्रॉपर्टी की मदद से डेवलपर यह तय कर सकते हैं कि स्क्रोलर को किसी खास पॉइंट से शुरू होना चाहिए.

:root { --nav-height: 100px }

.snap-scroll-y {
  scroll-start-y: var(--nav-height);
}
:snap-target

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

.card {
  --shadow-distance: 5px;
  box-shadow: 0 var(--shadow-distance) 5px hsl(0 0% 0% / 25%);
  transition: box-shadow 350ms ease;
}

.card:snapped {
  --shadow-distance: 30px;
}

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

सीएसएस और JS की इन सुविधाओं को अभी लॉन्च किया गया है. हालांकि, इन सुविधाओं को अपनाने और इनकी टेस्टिंग में मदद करने वाले पॉलीफ़िल पर नज़र रखें.

संसाधन

जाने-पहचाने राज्यों के बीच साइकल चलाना

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

toggle() के बाद, सीएसएस के लिए किसी भी एलिमेंट पर कस्टम स्टेट बनाई जा सकती हैं, ताकि सीएसएस उन्हें स्टाइल बदलने और इस्तेमाल करने के लिए इस्तेमाल कर सके. इसमें ग्रुप बनाने, साइकल चलाने, टॉगल करने के लिए निर्देश देने वगैरह की सुविधा मिलती है.

यहां दिए गए उदाहरण में, सूची के आइटम को पूरा होने पर स्ट्राइकथ्रू करने का वही इफ़ेक्ट मिलता है. हालांकि, इसमें किसी भी चेकबॉक्स एलिमेंट का इस्तेमाल नहीं किया गया है:

<ul class='ingredients'>
   <li>1 banana
   <li>1 cup blueberries
  ...
</ul>

साथ ही, इससे जुड़ी सीएसएस toggle() स्टाइल:

li {
  toggle-root: check self;
}

li:toggle(check) {
  text-decoration: line-through;
}

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

संसाधन

चुने गए एलिमेंट को पसंद के मुताबिक बनाना

<selectmenu> से पहले, सीएसएस में रिच एचटीएमएल की मदद से <option> एलिमेंट को पसंद के मुताबिक बनाने की सुविधा नहीं थी. साथ ही, विकल्पों की सूची को दिखाने के तरीके में ज़्यादा बदलाव नहीं किया जा सकता था. इस वजह से, डेवलपर को ऐसी बाहरी लाइब्रेरी लोड करनी पड़ीं जो <select> की ज़्यादातर सुविधाओं को फिर से बनाती थीं. इसमें बहुत ज़्यादा काम करना पड़ा.

<selectmenu> के बाद, डेवलपर विकल्प वाले एलिमेंट के लिए रिच एचटीएमएल उपलब्ध करा सकते हैं. साथ ही, उन्हें अपनी ज़रूरत के हिसाब से स्टाइल कर सकते हैं. हालांकि, उन्हें सुलभता से जुड़ी ज़रूरी शर्तों को पूरा करना होगा और सिमैंटिक एचटीएमएल उपलब्ध कराना होगा.

नीचे दिए गए उदाहरण में, <selectmenu> जानकारी देने वाले पेज से लिया गया है. इसमें कुछ बुनियादी विकल्पों के साथ एक नया 'चुने' मेन्यू बनाया गया है:

<selectmenu>
  <option>Option 1</option>
  <option>Option 2</option>
  <option>Option 3</option>
</selectmenu>

सीएसएस, एलिमेंट के हिस्सों को टारगेट और स्टाइल कर सकती है:

.my-select-menu::part(button) {
  color: white;
  background-color: red;
  padding: 5px;
  border-radius: 5px;
}

.my-select-menu::part(listbox) {
  padding: 10px;
  margin-top: 5px;
  border: 1px solid red;
  border-radius: 5px;
}

लाल रंग के ऐक्सेंट वाले मेन्यू की इमेज.

वेब एक्सपेरिमेंट फ़्लैग चालू करके, Canary में Chromium पर <selectmenu> एलिमेंट आज़माया जा सकता है. साल 2023 और उसके बाद, मनमुताबिक बनाए जा सकने वाले select मेन्यू एलिमेंट पर नज़र रखें.

संसाधन

किसी एलिमेंट को दूसरे एलिमेंट से जोड़ना

anchor() से पहले, ऐब्सलूट और रिलेटिव पोज़िशन, पोज़िशन की रणनीतियां थीं. ये रणनीतियां, डेवलपर को इसलिए उपलब्ध कराई जाती थीं, ताकि वे चाइल्ड एलिमेंट को पैरंट एलिमेंट के अंदर घुमा सकें.

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

अगर आपको इस बारे में ज़्यादा जानना है, तो इस एक्सप्लेनर में कुछ बेहतरीन उदाहरण और कोड सैंपल दिए गए हैं.

संसाधन