EduFlow
إتقان CSS الحديثة
⁦0%⁩

الوحدة 2 · تخطيط يصمد

Grid: المناطق وauto-fit وminmax()

18 دقراءة 3 دبيئة تجريب الكود

الدرس في لمحة

خطّط صفحة باستخدام grid-template-areas المسمّاة، وابنِ شبكة متحدّثين تختار عدد أعمدتها بنفسها باستخدام repeat(auto-fit, minmax()).

  1. 1ارسم الصفحة بقوالب المناطق
  2. 2وحدة fr وحدّها الأدنى الخفيّ
  3. 3شبكة متحدّثين تعدّ أعمدتها بنفسها
  4. 4دورك الآن

لا فيديو هنا، بل الشيء الحقيقي: درس مكتوب وأمثلة قابلة للتشغيل واختبار وتدريب.

يخطّط flexbox الأشياء في اتجاه واحد ويترك لكل سطر أن يتّخذ قراراته بنفسه. هذا مثالي لصف من الفلاتر، وخاطئ لشبكة المتحدّثين في Waypoint، حيث يجب أن تصطفّ كل بطاقة في العمود مع البطاقات فوقها وتحتها. حين تحتاج إلى أن تتّفق الصفوف والأعمدة معًا، فأنت تريد grid.

يبني هذا الدرس تخطيطين في صفحة الجدول: هيكل الصفحة بمناطق مسمّاة، وشبكة المتحدّثين التي تقرّر عدد أعمدتها بنفسها.

ارسم الصفحة بقوالب المناطق

لصفحة الجدول رأس يمتدّ في الأعلى، وشريط جانبي للفلاتر، والمحتوى الرئيسي. باستخدام grid-template-areas ترسم هذا التخطيط مباشرةً:

layout.css
.page {
  display: grid;
  grid-template-columns: 14rem minmax(0, 1fr);
  grid-template-areas:
    "header  header"
    "filters main";
  gap: 1.5rem;
}
.site-header { grid-area: header; }
.filters     { grid-area: filters; }
.schedule    { grid-area: main; }

كل سلسلة نصية صفّ، وكل كلمة داخلها عمود. تكرار الاسم (header header) يجعل تلك المنطقة تمتدّ على العمودين. والنقطة . تشير إلى خلية فارغة. ويجب أن تكون المناطق مستطيلة: الشكل على هيئة حرف L غير صالح، ويُسقَط التصريح كله.

العائد يأتي حين يتغيّر التخطيط. على الشاشات الضيّقة يجب أن تجلس الفلاتر فوق الجلسات، فتعيد رسم السلاسل بدل نقل الـ HTML:

CSS
@media (width < 48rem) {
  .page {
    grid-template-columns: minmax(0, 1fr);
    grid-template-areas:
      "header"
      "filters"
      "main";
  }
}

وحدة fr وحدّها الأدنى الخفيّ

تقسّم fr المساحة الحرّة في الشبكة بعد طرح الـ tracks الثابتة والفجوات. عمودان بقيمة 1fr في شبكة عرضها 600px مع فجوة 20px عرض كلٍّ منهما 290px.

وهناك فخّ ستقابله عاجلًا أو آجلًا: 1fr اختصار لـ minmax(auto, 1fr)، وauto كحدّ أدنى تعني «على الأقل عرض المحتوى الأدنى (min-content)». ضع رابطًا طويلًا متصلًا أو كتلة كود في أحد العمودين فيتّسع ويسرق المساحة من الآخر. لهذا يستخدم هيكل الصفحة أعلاه minmax(0, 1fr): فهي تسمح للعمود الرئيسي بالتقلّص تحت حجم محتواه، ويُعالَج أيّ فيضان بداخله (بوضع overflow-x: auto على كتلة الكود مثلًا). إنها نظير إصلاح min-width: 0 من الدرس السابق، لكن في grid.

شبكة متحدّثين تعدّ أعمدتها بنفسها

في Waypoint 23 متحدّثًا. على الهاتف يجب أن يتكدّسوا عموديًا؛ وعلى الحاسوب المحمول أربعة أو خمسة في الصف. تصريح واحد يتعامل مع كل العروض:

speakers.css
.speakers {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
  gap: 16px;
}
.speaker.featured {
  grid-column: 1 / -1;
}

اقرأها من الداخل إلى الخارج. minmax(180px, 1fr) تقول إن كل عمود لا يقل عن 180px ولا يزيد على حصة متساوية من المساحة الحرّة. وrepeat(auto-fit, …) تطلب من المتصفّح أن ينشئ أكبر عدد ممكن من هذه الأعمدة يتّسع. في حاوية عرضها 640px بفجوات 16px، تتّسع ثلاثة أعمدة بعرض 180px (ثلاثة أعمدة وفجوتان تساوي 572px) ولا تتّسع أربعة، فتحصل على ثلاثة أعمدة يتمدّد كلٌّ منها إلى نحو 203px.

grid-column: 1 / -1 تجعل متحدّث الـ keynote يمتدّ من الخط الأول إلى الأخير، أيًّا كان عدد الأعمدة. أرقام الخطوط السالبة تُعدّ من نهاية الشبكة الصريحة.

شبكتان بالعرض نفسه في كلٍّ منهما عنصران. مع auto-fill يشغل العنصران عمودين من أربعة أعمدة متساوية ويبقى اثنان من الـ tracks الفارغة المتقطّعة. ومع auto-fit تنطوي الـ tracks الفارغة ويأخذ كل عنصر نصف العرض. auto-fill فارغ فارغ auto-fit
auto-fill تحتفظ بالـ tracks الفارغة، وauto-fit تطويها فتتمدّد العناصر

الفرق بين auto-fit وauto-fill لا يظهر إلا حين تكون العناصر أقل من الأعمدة. auto-fill تحتفظ بالـ tracks الفارغة، فيبقى المتحدّثان بحجم البطاقة ويتركان فراغًا. وauto-fit تطوي الـ tracks الفارغة إلى الصفر، فيتمدّد المتحدّثان على امتداد الصف. ولشبكة متحدّثين تكاد تكون فارغة أحيانًا (اليوم الثاني فيه أربعة متحدّثين فقط)، اختر بحسب التصميم: auto-fill لعرض بطاقات ثابت، وauto-fit لصف ممتلئ.

دورك الآن

يعطيك التمرين هيكل الصفحة وشبكة المتحدّثين بأعمدة مكتوبة يدويًا. سمِّ المناطق، وحوّل المتحدّثين إلى auto-fit، واجعل الـ keynote يمتدّ على الصف كاملًا. تغيّر الفحوصات حجم الصفحة لتتأكّد من أن عدد الأعمدة يتكيّف. وبعدها ستجعل محتويات بطاقات grid تصطفّ عبر البطاقات باستخدام الـ subgrid.

أهم النقاط

  • تتيح لك grid-template-areas أن ترسم التخطيط كأنه رسم بالحروف (ASCII art)، وإعادة ترتيب الصفحة لحجم شاشة آخر تعني إعادة رسم السلاسل النصية، لا نقل الـ HTML.
  • repeat(auto-fit, minmax(12rem, 1fr)) تنشئ أكبر عدد ممكن من الأعمدة التي تتّسع وتمدّدها لتملأ الصف، دون media queries.
  • auto-fill تحتفظ بالـ tracks (مسارات الشبكة) الفارغة حين تكون العناصر قليلة، بينما auto-fit تطويها فتتمدّد العناصر لتملأ الصف.
  • لـ 1fr حدّ أدنى تلقائي يساوي حجم المحتوى؛ استخدم minmax(0, 1fr) حين يجب السماح للـ track بالتقلّص تحت حجم محتواه.

قراءات إضافية

تحقّق من فهمك

3 أسئلة

السؤال 1 من 3

شبكة متحدّثين تستخدم repeat(auto-fill, minmax(180px, 1fr)) في حاوية عرضها 900px، لكن فيها متحدّثان فقط. ماذا ترى؟

السؤال 2 من 3

ما الذي يضعه هذا التخطيط في الصف الثاني، العمود الأول؟

CSS
.page {
  display: grid;
  grid-template-columns: 14rem 1fr;
  grid-template-areas:
    "header header"
    "filters main";
}
السؤال 3 من 3

شبكة لها grid-template-columns: 1fr 1fr وُضعت في عمودها الأول كتلة كود فيها سطر طويل جدًا، فأصبح العمودان غير متساويين. ما الإصلاح؟

تدريب

بيئة تجريب الكود

سمِّ المناطق ودع المتحدّثين يتدفّقون

عرض الصفحة ثابت عند 860px في هذا التمرين.

  1. أعطِ .page تخطيطًا بـ grid-template-areas: header على العمودين في الصف الأول، ثم filters وmain جنبًا إلى جنب. وزّع .site-header و.filters و.speakers على تلك المناطق.
  2. استبدل repeat(3, 1fr) الثابتة في المتحدّثين بأعمدة لا يقل عرضها عن 180px، بأكبر عدد يتّسع، وتتمدّد لتملأ الصف حين يكون المتحدّثون قليلين.
  3. اجعل المتحدّث .featured يمتدّ على الصف كاملًا.

تغيّر الفحوصات حجم الصفحة وتخفي بعض المتحدّثين لترى كيف تتفاعل شبكتك.

<div class="page">
  <header class="site-header">Waypoint Conf 2026</header>
  <nav class="filters">Tracks</nav>
  <main class="speakers">
    <div class="speaker featured">Keynote · Ana Ortiz</div>
    <div class="speaker">Kenji Watanabe</div>
    <div class="speaker">Layla Haddad</div>
    <div class="speaker">Tom Becker</div>
    <div class="speaker">Priya Nair</div>
    <div class="speaker">Marcus Lee</div>
  </main>
</div>جارٍ تحميل المحرّر…

Ctrl/⌘ + Enter للتشغيل · يعمل في بيئة معزولة داخل متصفّحك. لا شيء يغادر جهازك.

المعاينة

الـ console

(لا مخرجات)

الفحوص

  • الصفحة تستخدم grid-template-areas
  • الرأس يمتدّ في الأعلى، والفلاتر على يسار المتحدّثين
  • المتحدّثون يشكّلون ثلاثة أعمدة عند هذا العرض
  • المتحدّث المميّز يمتدّ على الصف كاملًا
  • الصفحة الأضيق تحصل على عمودين
  • مع متحدّثَين فقط، يتمدّدان ليملآ الصف