Kodokon kodokon.com

विशेषज्ञ ग्रिड: subgrid, auto-fit और minmax

media queries के बिना स्वयं-अनुकूलित होने वाली ग्रिड बनाएँ और subgrid के साथ नेस्टेड कंपोनेंट्स को पैरेंट के tracks पर संरेखित करें।

10 मिनट · 3 प्रश्न

इस पाठ को Kodokon में खोलें

repeat(auto-fill, ...) और repeat(auto-fit, ...) उतने tracks बनाते हैं जितने कंटेनर की चौड़ाई अनुमति देती है। अंतर केवल तब दिखता है जब आइटम, संभव tracks से कम हों: auto-fill खाली tracks को बनाए रखता है (आपके दो कार्ड अपने न्यूनतम आकार पर बने रहते हैं, दाईं ओर खाली जगह के साथ), जबकि auto-fit खाली tracks को शून्य पर समेट देता है - तब भरे हुए tracks, जिन्हें 1fr अधिकतम दिया गया है, मुक्त हुई सारी जगह सोख लेते हैं और आपके दो कार्ड पूरी चौड़ाई में फैल जाते हैं।

CSS
.gallery-fill {
  display: grid;
  grid-template-columns: repeat(
    auto-fill, minmax(150px, 1fr)
  );
}
.gallery-fit {
  display: grid;
  grid-template-columns: repeat(
    auto-fit, minmax(150px, 1fr)
  );
}
900px में 2 आइटम के साथ: fill 6 tracks रखता है (2 भरे, 4 खाली), fit खाली वालों को समेट देता है और 2 आइटम को फैला देता है।

दो minmax() जाल जिनमें वरिष्ठ डेवलपर तक फँस जाते हैं। पहला: minmax(240px, 1fr) तब overflow करता है जब कंटेनर 240px से संकरा हो - न्यूनतम एक कठोर floor है। मुहावरेदार समाधान एक तुलना फ़ंक्शन को नेस्ट करता है: minmax(min(100%, 240px), 1fr)। दूसरा: अकेला 1fr, minmax(auto, 1fr) के तुल्य है; auto न्यूनतम अटूट सामग्री (एक लंबा URL, एक <pre>) को track को उसके हिस्से से अधिक चौड़ा करने देता है। minmax(0, 1fr) वितरण को लॉक कर देता है।

CSS
.grid {
  display: grid;
  gap: 1rem;
  grid-template-columns: repeat(
    auto-fit,
    minmax(min(100%, 240px), 1fr)
  );
}
बिना किसी media query वाली आदर्श responsive ग्रिड: कभी overflow नहीं करती, 240px चौड़ाई से कम पर भी।

subgrid नेस्टेड कंपोनेंट्स में संरेखण की पुरानी समस्या हल करता है। grid-template-rows: subgrid के साथ, भीतरी ग्रिड अपने खुद के tracks का आविष्कार नहीं करती: यह जिस क्षेत्र में फैलती है उस पर पैरेंट के tracks को अपना लेती है। यह पैरेंट के line names भी विरासत में लेती है (और अपने भी जोड़ सकती है), साथ ही gap भी, जिसे यह स्थानीय रूप से ओवरराइड कर सकती है। classic मामला: ऐसे कार्ड जिनके title, description और footer एक कार्ड से दूसरे तक क्षैतिज रूप से संरेखित होते हैं, उनकी सामग्री की लंबाई चाहे जो हो - subgrid से पहले इसे साफ़-सुथरे ढंग से करना असंभव था, क्योंकि हर कार्ड अपनी ऊँचाइयों की गणना अलग-थलग करता था।

CSS
.cards {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 1.5rem;
}
.card {
  grid-row: span 3;
  display: grid;
  grid-template-rows: subgrid;
  row-gap: 0.5rem;
}
हर कार्ड पैरेंट की 3 पंक्तियों में फैलता है और उन्हें अपना लेता है: title, text और footer कार्डों के आर-पार संरेखित होते हैं।

ज्ञान जांच

सुनिश्चित करें कि आपको इस पाठ के मुख्य बिंदु याद हैं।

  1. एक कंटेनर 6 tracks रख सकता है पर उसमें केवल 2 आइटम हैं। auto-fill और auto-fit में क्या अंतर है?
    • कोई नहीं, वे एक ही वैल्यू के दो उपनाम हैं
    • auto-fill 4 खाली tracks रखता है; auto-fit उन्हें समेट देता है और 2 आइटम फैल जाते हैं
    • auto-fit हमेशा auto-fill से अधिक tracks बनाता है
  2. grid-template-rows: subgrid के साथ घोषित एक एलिमेंट ठीक-ठीक क्या अपनाता है?
    • केवल पैरेंट की पंक्तियों की संख्या
    • फैलाए गए क्षेत्र पर पैरेंट के track आकार और line names, gap विरासत में मिलती है पर ओवरराइड की जा सकती है
    • पैरेंट की सभी grid प्रॉपर्टीज़, उसके named areas समेत
  3. minmax(240px, 1fr) के बजाय minmax(min(100%, 240px), 1fr) क्यों लिखें?
    • हर स्क्रीन पर 240px की गारंटी देने के लिए
    • जब कंटेनर 240px से संकरा हो तब overflow से बचने के लिए
    • क्योंकि Grid Level 2 से repeat() के भीतर min() अनिवार्य है