Kodokon kodokon.com

الشبكات الاحترافية: subgrid وauto-fit وminmax

ابنِ شبكات ذاتية التكيّف دون استعلامات وسائط، وحاذِ المكوّنات المتداخلة على مسارات الأصل باستخدام subgrid.

10 دقيقة · 3 أسئلة

افتح هذا الدرس في Kodokon

ينشئ repeat(auto-fill, ...) وrepeat(auto-fit, ...) من المسارات بقدر ما يسمح به عرض الحاوية. ولا يظهر الفرق إلا عندما يكون عدد العناصر أقل من عدد المسارات الممكنة: يُبقي auto-fill المسارات الفارغة (تبقى بطاقتاك بحجمهما الأدنى، مع فراغ على اليمين)، في حين أن auto-fit يطوي المسارات الفارغة إلى صفر - عندئذٍ تمتص المسارات المشغولة، بحكم أن حدها الأقصى 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: يُبقي fill على 6 مسارات (2 ممتلئان، 4 فارغة)، ويطوي fit الفارغة ويمدّ العنصرين.

فخّان في minmax() يقع فيهما حتى المطوّرون الكبار. الأول: يفيض minmax(240px, 1fr) عندما تكون الحاوية أضيق من 240px - فالحد الأدنى أرضية صلبة. والحل الاصطلاحي يُعشِّش دالة مقارنة: minmax(min(100%, 240px), 1fr). الثاني: 1fr بمفرده يكافئ minmax(auto, 1fr)؛ ويتيح الحد الأدنى auto لمحتوى غير قابل للكسر (رابط طويل، أو <pre>) أن يوسّع المسار إلى ما يتجاوز حصته. أما minmax(0, 1fr) فيثبّت التوزيع.

CSS
.grid {
  display: grid;
  gap: 1rem;
  grid-template-columns: repeat(
    auto-fit,
    minmax(min(100%, 240px), 1fr)
  );
}
الشبكة المتجاوبة النموذجية بلا أي استعلام وسائط: لا تفيض أبدًا، حتى دون 240px عرضًا.

يحلّ subgrid المشكلة القديمة للمحاذاة عبر المكوّنات المتداخلة. فمع grid-template-rows: subgrid، لا تخترع الشبكة الداخلية مساراتها الخاصة: بل تتبنّى مسارات الأصل على المساحة التي تشغلها. كما ترث أسماء خطوط الأصل (ويمكنها إضافة أسمائها الخاصة)، وكذلك gap، الذي يمكنها تجاوزه محليًا. والحالة الكلاسيكية: بطاقات يتحاذى فيها العنوان والوصف والتذييل أفقيًا من بطاقة إلى أخرى، أيًّا كان طول محتواها - كان تحقيق ذلك بنظافة مستحيلًا قبل 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 صفوف من الأصل وتتبنّاها: تتحاذى العناوين والنصوص والتذييلات عبر البطاقات.

اختبار المعرفة

تأكّد من أنك تذكّرت النقاط الأساسية في هذا الدرس.

  1. يمكن لحاوية أن تحوي 6 مسارات لكنها تحتوي على عنصرين فقط. ما الفرق بين auto-fill وauto-fit؟
    • لا فرق، فهما اسمان مستعاران لنفس القيمة
    • يُبقي auto-fill على 4 مسارات فارغة؛ ويطويها auto-fit فيتمدد العنصران
    • ينشئ auto-fit دائمًا مسارات أكثر من auto-fill
  2. ما الذي يتبنّاه بالضبط عنصر مُصرَّح بـ grid-template-rows: subgrid؟
    • عدد صفوف الأصل فقط
    • أحجام مسارات الأصل وأسماء خطوطه على المساحة المشغولة، مع gap موروث لكنه قابل للتجاوز
    • كل خصائص شبكة الأصل، بما فيها مناطقه المسمّاة
  3. لماذا نكتب minmax(min(100%, 240px), 1fr) بدلًا من minmax(240px, 1fr)؟
    • لضمان 240px على كل شاشة
    • لتفادي الفيضان عندما تكون الحاوية أضيق من 240px
    • لأن min() صار إلزاميًا داخل repeat() منذ Grid Level 2