شبكة في ثلاثة أسطر
اضبط display: grid على حاوية واذكر أعمدتها بـ grid-template-columns. يملأ الأبناء الخلايا بالترتيب، بترتيب القراءة (من اليسار إلى اليمين في الإنجليزية، ومن اليمين إلى اليسار في صفحة عربية)، ويبدأ صف جديد كلما امتلأت الأعمدة:
سبعة عناصر في ثلاثة أعمدة: صفان كاملان وصف ثالث فيه العنصر 7 في العمود الأول. كل الأعمدة بالعرض نفسه، وكل العناصر في الصف بالارتفاع نفسه، فتصطف الحواف في الاتجاهين. هذا ما يضيفه grid على flexbox.
ساحة تجربة Grid
اكتب أي قيمة لـ grid-template-columns، أو انقر قيمة جاهزة. تعرض القراءة عروض الأعمدة التي حسبها المتصفح (من getComputedStyle) وعدد الصفوف التي احتاجتها العناصر:
أمور تستحق الملاحظة: 1fr 2fr تجعل العمود الثاني ضعف الأول تمامًا. و200px 1fr تحتفظ بـ 200px وتعطي الباقي للعمود الثاني. وauto 1fr auto تجعل العمودين الطرفيين بحجم محتواهما. وrepeat(4, 100px) تترك مساحة فارغة في النهاية لأن لا شيء مرن. والقيمة غير الصالحة، مثل 1fr 2، تُتجاهل، وتحتفظ الشبكة بآخر قيمة صالحة.
وحدة fr
تعني fr «حصة واحدة من المساحة الحرة». يطرح المتصفح أولًا الأعمدة الثابتة (px وrem و% ومحتوى auto) والفجوات، ثم يقسم ما تبقى بين أعمدة fr حسب أرقامها.
grid-template-columns في حاوية بعرض 600px، بلا فجوة | عروض الأعمدة |
|---|---|
1fr 1fr 1fr | 200, 200, 200 |
1fr 2fr | 200, 400 |
100px 1fr 1fr | 100, 250, 250 |
1fr 50% | 300, 300 |
fr ليست مثل %: النسب المئوية مع الفجوات قد يتجاوز مجموعها 100% فتفيض، بينما تتقاسم أعمدة fr دائمًا ما يتبقى بعد الفجوات فقط.
repeat() وminmax() وشبكة متجاوبة من دون استعلامات وسائط
repeat(4, 1fr) هي 1fr 1fr 1fr 1fr. وminmax(120px, 1fr) عمود لا يضيق أبدًا عن 120px ويكبر ليأخذ حصة. اجمعهما مع auto-fill أو auto-fit مكان العدد، فتنشئ الشبكة أكبر عدد من الأعمدة يتسع:
.cards {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
gap: 16px;
}
هذا التصريح الواحد يعطي أكبر عدد يتسع في الحاوية من الأعمدة التي لا يقل عرضها عن 180px: عدة أعمدة على شاشة عريضة، وعمود واحد على الهاتف، من دون استعلام وسائط. يظهر الفرق بين auto-fill وauto-fit حين تكون العناصر أقل من الأعمدة:
تتسع الحاوية لخمسة أعمدة بعرض 100px. تحتفظ auto-fill بالخمسة كلها، فيكون كل من A وB وC بعرض 112px ويبقى عمودان فارغان. وتطوي auto-fit الفارغة، فتتمدد العناصر الثلاثة إلى نحو 187px لكل منها.
وضع العناصر: grid-column وgrid-row
تُرقَّم خطوط الشبكة بدءًا من 1 عند حافة البداية (اليمين في صفحة عربية). تعني grid-column: 1 / 3 «من الخط 1 إلى الخط 3»، أي عمودين. وتعني span 2 «عمودين من حيث تستقر»، و-1 هو الخط الأخير:
يملأ العنصر الداكن الصف الأول كله. ويغطي الأزرق كتلة من صفين في عمودين، والكهرماني صفين. ويملأ العنصران a وb الخلايا المتبقية من تلقاء نفسيهما: تضع الشبكة كل عنصر تستطيع وضعه في الخلية الحرة التالية. وتضبط grid-auto-rows: 60px ارتفاع الصفوف التي لم تعرّفها بـ grid-template-rows.
grid-template-areas: سمِّ أجزاء التخطيط
لتخطيط صفحة، سمِّ المناطق وارسمها كنص. كل سلسلة نصية صف، وكل كلمة خلية، وينضم العنصر إلى منطقة عبر grid-area:
تمتد الترويسة والتذييل على العمودين لأن اسميهما يملآن خليتي صفيهما. والصف الأوسط 1fr، فيأخذ ما تبقى من الارتفاع البالغ 280px. لتكديس كل شيء على الهاتف، يكفي أن يعيد استعلام وسائط رسم المناطق كعمود واحد: grid-template-areas: "header" "side" "main" "footer" مع grid-template-columns: 1fr. تعرض صفحة استعلامات الوسائط هذا النمط.
المحاذاة داخل الخلايا
تتمدد عناصر grid افتراضيًا لتملأ خليتها. هذه الخصائص تحركها داخلها:
| الخاصية | على | تحرك |
|---|---|---|
justify-items | الحاوية | كل عنصر على امتداد الصف (المحور السطري) |
align-items | الحاوية | كل عنصر صعودًا ونزولًا (المحور الكتلي) |
place-items | الحاوية | اختصار: place-items: center توسّط في الاتجاهين |
justify-self / align-self | العنصر | عنصر واحد |
justify-content / align-content | الحاوية | مجموعة المسارات كلها، حين تكون الشبكة أصغر من الحاوية |
display: grid; place-items: center; هي أقصر طريقة لتوسيط ابن واحد في صندوق.
Grid أم flexbox
Grid ثنائي الأبعاد: تقرر الأعمدة (والصفوف)، ويملؤها المحتوى، فتكون كل بطاقة في المعرض بالعرض نفسه حتى في الصف الأخير. أما Flexbox فأحادي البعد: تتحدد أحجام العناصر من محتواها على خط واحد. ويعملان معًا جيدًا: grid للصفحة ولمعرض البطاقات، وflexbox داخل كل بطاقة لصف ترويستها. تشرح صفحة flexbox النصف الآخر.
الترتيب وسهولة الوصول
يمكن لـ grid-template-areas وgrid-row وgrid-column وorder وضع العنصر في أي مكان، لكن قارئات الشاشة ومفتاح Tab ما زالت تتبع ترتيب HTML. أبقِ ترتيب المصدر ذا معنى (الترويسة، التنقل، المحتوى الرئيسي، التذييل)، واستخدم grid لترتيبه، لا لإصلاح ترتيب HTML لا معنى له.
أخطاء شائعة
- وضع
display: gridعلى العناصر. مكانها الأب؛ والأبناء المباشرون وحدهم عناصر grid. - استخدام النسب المئوية مع الفجوات.
grid-template-columns: 50% 50%معgap: 16pxتفيض بمقدار 16px. استخدم1fr 1fr. auto-fillحين كنت تريدauto-fit. مع عناصر قليلة تتركauto-fillأعمدة فارغة. بدّل إلىauto-fitلتمديد العناصر.- عمود
1frيكبر أكثر من حصته. عمود1frلا يصغر عن أطول محتوى فيه (رابط URL طويل، صورة عريضة). استخدمminmax(0, 1fr)كي يتمكن من التقلص. - سلاسل مناطق ليست مستطيلات. يجب أن تشكّل كل منطقة مسماة مستطيلًا، ويجب أن تحتوي كل سلسلة صف على عدد الخلايا نفسه، وإلا يُتجاهل تصريح
grid-template-areasكله. - نسيان أن أرقام الخطوط تبدأ من 1. لثلاثة أعمدة أربعة خطوط:
1 / 4أو1 / -1تمتد على الثلاثة.
الأسئلة الشائعة
ما هو CSS grid؟
نظام تخطيط يضع العناصر في صفوف وأعمدة في الوقت نفسه. تضبط display: grid على الحاوية، وتصف أعمدتها بـ grid-template-columns (وصفوفها اختياريًا)، فيملأ أبناؤها المباشرون الخلايا بالترتيب.
ماذا تعني 1fr في CSS grid؟
fr جزء من المساحة الحرة في حاوية grid. تعطي grid-template-columns: 1fr 1fr 1fr ثلاثة أعمدة متساوية، و1fr 2fr تجعل العمود الثاني ضعف عرض الأول. تُطرح الأحجام الثابتة والفجوات أولًا؛ ثم تتقاسم أعمدة fr ما تبقى.
ما الفرق بين auto-fill وauto-fit؟
كلتاهما تنشئ أكبر عدد من الأعمدة يتسع. تحتفظ auto-fill بالأعمدة الفارغة، فتبقى العناصر القليلة ضيقة وتترك مساحة فارغة في نهاية الصف. وتطوي auto-fit الأعمدة الفارغة، فتتمدد العناصر لتملأ الصف. ومع عناصر كافية لملء الصف تبدوان متطابقتين.
كيف أجعل عنصرًا في grid يمتد على عمودين؟
استخدم grid-column: span 2 على العنصر، أو أعطه خطي بداية ونهاية: grid-column: 1 / 3 يغطي العمودين 1 و2. وgrid-column: 1 / -1 يمتد على العرض الكامل، لأن -1 هو الخط الأخير.
متى أستخدم grid بدل flexbox؟
استخدم grid حين يجب أن تصطف الصفوف والأعمدة مع بعضها: معارض البطاقات، والنماذج ذات التسميات المحاذاة، والصفحة ذات الترويسة والشريط الجانبي والتذييل. واستخدم flexbox لصف أو عمود واحد تتحدد أحجام عناصره من محتواها، مثل شريط التنقل.
هل grid-gap هي نفسها gap؟
نعم. grid-gap وgrid-row-gap وgrid-column-gap هي الأسماء القديمة. ما زالت المتصفحات تقبلها كأسماء بديلة، لكن اكتب gap وrow-gap وcolumn-gap، التي تعمل في flexbox أيضًا.