- CSS Subgrid मौजूदा Grid की सीमाओं से आगे बढ़कर parent grid structure को निचले DOM elements तक विस्तारित करने वाली एक feature है
- पहले केवल direct children ही grid में भाग ले सकते थे, लेकिन subgrid का उपयोग करने पर
<ul>·<li> जैसी nested structures में भी वही grid cell placement संभव हो जाती है
- यह content length के अंतर से पैदा होने वाले sibling elements के बीच असंतुलन को हल करता है और हर card या section के dynamically responsive लेआउट को support करता है
- हालांकि row reservation issues, line number reset, auto-fill आधारित fluid grid के साथ incompatibility जैसी बातों पर ध्यान देना ज़रूरी है
- प्रमुख browsers में इसका support उपलब्ध है, और progressive adoption संभव होने से यह आगे चलकर UI design flexibility को काफ़ी बढ़ाने वाली तकनीक है
Subgrid की बुनियादी अवधारणा
- शुरुआती CSS Grid में केवल direct child elements ही लेआउट में भाग ले सकते थे
- उदाहरण के लिए, portfolio UI में
<ul> के अंदर मौजूद <li> images मूल रूप से एक ही cell में बंध जाती हैं
grid-template-rows: subgrid, grid-template-columns: subgrid का उपयोग करने पर parent grid की row·column definitions inherit की जा सकती हैं
- हर
<li> parent grid के cell में सीधे place हो सकता है, जिससे semantic HTML structure और visual alignment दोनों एक साथ बने रहते हैं
- वही नतीजा Flexbox और nested Grid से भी बनाया जा सकता है, लेकिन subgrid single grid structure sharing के कारण ज़्यादा संक्षिप्त तरीका देता है
नए लेआउट की संभावनाएँ
- portfolio card उदाहरण में हर
<article> के पास 2-column grid होती है, जिसमें image और text रखे जाते हैं
fr unit flexible होती है, लेकिन हर card अलग से calculation करती है, जिससे column width imbalance पैदा होता है
grid-template-columns: subgrid लागू करने पर parent grid के column ratios को सभी cards साझा करते हैं
- title length जैसे content changes के अनुसार पूरी grid अपने-आप फिर से adjust हो जाती है
- इस तरीके से sibling elements के बीच mutually aware layout लागू किया जा सकता है
- उदाहरण: “Infinite Supercomputer” title को छोटा करने पर सभी cards का image·text ratio तुरंत adjust हो जाता है
Subgrid इस्तेमाल करते समय ध्यान देने योग्य बातें (Gotchas)
row space reservation
- column sharing सहज लगती है, लेकिन rows share करने पर explicit row reservation की ज़रूरत होती है
- उदाहरण: pricing table cards में हर
<ul> की items को एक ही row में align करने के लिए grid-row: span N से row count specify करना पड़ता है
- subgrid default रूप से सिर्फ एक cell घेरती है, इसलिए कई rows का उपयोग करने के लिए पहले parent grid area को expand करना ज़रूरी है
nested grid numbering
- subgrid parent की row·column templates inherit करती है, लेकिन line numbers reset हो जाते हैं
- उदाहरण: parent की 2~5 lines inherit होने पर भी अंदर वे 1~4 के रूप में फिर से नंबर पाती हैं
- हर grid का अपना index होता है, इसलिए line numbers unique ID नहीं बल्कि relative index की तरह काम करते हैं
fluid grid के साथ incompatibility
repeat(auto-fill, minmax()) रूप वाली fluid grid को subgrid के साथ इस्तेमाल नहीं किया जा सकता
- subgrid को defined column count चाहिए, और
auto-fill·auto-fit support नहीं होते
- लेखक ने साफ़ कहा है कि उन्हें इस combination का कोई समाधान नहीं मिला
पुराने browsers का support
- 2023 के बाद से प्रमुख browsers में support है, लेकिन support rate 90% से कम है
@supports not (grid-template-columns: subgrid) condition के जरिए alternative layout दी जा सकती है
- उदाहरण: image और text को vertical stack में रखने वाला fallback structure सुझाया गया है
वास्तविक उदाहरण और निष्कर्ष
- Stripe developer site (stripe.dev) पूरे page को एक बड़े grid के रूप में बनाती है और कई subgrid layers के ज़रिए बारीक placement लागू करती है
- subgrid केवल बड़े लेआउट ही नहीं, छोटे UI adjustments में भी उपयोगी है
- पूरे project को फिर से बनाए बिना progressively adopt किया जा सकता है
- CSS layout में नई flexibility हासिल करने का साधन होने के कारण, प्रयोगात्मक उपयोग के लिहाज़ से इसका मूल्य काफ़ी ऊँचा है
1 टिप्पणियां
Hacker News राय
Subgrid फीचर वाकई शानदार है, लेकिन पहले आसान उदाहरण में
ul { display: contents }का इस्तेमाल करके children को grid layout में हिस्सा लेने दिया जा सकता हैअगर Subgrid फीचर ज़रूरी नहीं है, तो यह तरीका ज़्यादा efficient है
display: contentsUL element को layout से पूरी तरह हटा देता हैइसलिए उस element पर style लागू नहीं किया जा सकता या उससे UI events नहीं लिए जा सकते
अगर आप UL को highlight area या scroll होने वाले section की तरह इस्तेमाल करना चाहते हैं, तो subgrid कहीं ज़्यादा उपयोगी है
frकी जगह कोई दूसरी unit इस्तेमाल करें, और text के लिएfrरखें ताकि वह बची हुई जगह भर लेपहले जब price comparison UI बना रहा था, तब subgrid न होने की वजह से बहुत परेशानी हुई थी
दो tables को साथ-साथ रखकर उनकी rows को align करना असंभव था
fixed height या JS calculation से इसे संभाला जा सकता था, लेकिन React component structure में यह बहुत inefficient था
मुझे लगा था कि Container queries शायद बेहतर समाधान होंगी
लेकिन पूरे grid की consistency बनाए रखने के लिए subgrid ज़्यादा उपयुक्त हो सकता है
वैसे CodePen example देखें तो समझना आसान है
ऊपर से container इस्तेमाल करने पर नया stacking context बन जाता है, जो असुविधाजनक है
subgrid और container को साथ में इस्तेमाल न कर पाना अफसोस की बात है। अगर child subgrid size को refer कर पाते, तो यह सच में बहुत powerful होता
यह सोच आता है, “क्या हम आखिरकार फिर से <table> layout पर लौट आए हैं?”
Grid system visual arrangement का tool है, data structure दिखाने वाली table से अलग
अब जब grid standard बन चुका है, तो काश इसकी table से तुलना बंद हो जाए
लेकिन responsive design या accessibility का बिल्कुल ध्यान नहीं रखा जाता था। आख़िर में हमने tables को फिर से ईजाद ही किया है
आखिरकार CSS ने उसी capability को बेहतर रूप में फिर से लागू किया है
पहले जो grid bug झेला था, उनमें से एक यह था कि
<img>element का size percentage में देने पर cell size original image size की वजह से बिगड़ जाता थायह Firefox और Chromium, दोनों में होता था, और संबंधित bug Mozilla Bug 1857365 में है
अफसोस होता है कि layout के लिए CSS को कई बार document structure की जानकारी अतिरिक्त रूप से देनी पड़ती है
जैसे rows की संख्या अलग से बतानी पड़ती है
या फिर एक flex container दूसरे container की distribution को mimic कर सके, तो अच्छा होगा
लेकिन ऐसा करने पर DX जटिल हो जाने की संभावना ज़्यादा है
मैं सोच रहा था कि code examples में HTML और CSS, दोनों files में styles क्यों हैं
पहले subgrid example का सिर्फ CSS देखकर मैं काफ़ी देर तक यही ढूँढता रहा कि UL पर कौन-सा style लागू हुआ है
यह सोच आता है, “क्या हम आखिरकार फिर से grid पर लौट आए हैं?”
पुराने HTML दौर में भी हम कुछ ऐसा ही करते थे
Josh के blog posts हमेशा प्रभावित करते हैं
लिखने की स्पष्टता, design sense, और interactive website—सब शानदार है
निजी तौर पर मुझे अब भी grid के साथ काम करना असहज लगता है
इसका syntax अटपटा लगता है और layout की समझ भी ठीक से नहीं बैठती। Flexbox कहीं ज़्यादा intuitive और flexible है
Flexbox content-केंद्रित है, जबकि Grid size को container-केंद्रित तरीके से control करता है
content कई axes पर अपने-आप align नहीं होता, और सब कुछ manually place करना पड़ता है
शायद मैं अभी तक grid की असली प्रकृति ठीक से नहीं समझ पाया, या फिर यह मेरे काम के प्रकार के लिए सही नहीं है