حفر في خاصية العرض: شبكات على طول الطريق

نشرت: 2022-03-10
ملخص سريع ↬ استمرارًا لسلسلة على خاصية display في CSS ، تلقي راشيل أندرو هذه المرة نظرة على ما يحدث عند استخدام الشبكة كقيمة للعرض ، مع إضافة معلومات حول كيفية تغيير الشبكة الفرعية لهذا السلوك.

اليوم ، سنلقي نظرة على ما يحدث عندما نستخدم display: grid وكيف يمكننا استخدام قيمة grid-template-columns grid-template-rows للسماح للشبكات على طول الطريق من خلال العلامات الخاصة بنا ، والتي تتعلق ببعضها البعض.

هذه المقالة جزء من سلسلة تبحث في الجوانب المختلفة لخاصية display CSS ، وهي متابعة للمقالتين الأوليين:

  1. قيمتا display
  2. جيل الصندوق
  3. شبكات على طول الطريق

ماذا يحدث عندما نقوم بإنشاء حاوية شبكية؟

يتم تشغيل CSS Grid Layout باستخدام display: grid . إذا كنت قد قرأت المقالة الأولى في هذه السلسلة ، فستعرف أن ما تعنيه خاصية القيمة الفردية هذه في الواقع هو display: block grid . نحصل على مربع مستوى الكتلة والذي يتم تعريفه على أنه حاوية شبكة ، مع عناصر فرعية مباشرة تكون عناصر شبكة وتشارك في تخطيط الشبكة.

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

المزيد بعد القفز! أكمل القراءة أدناه ↓

يُقال أن حاوية الشبكة تنشئ سياق تنسيق شبكة مشابهًا لسياق تنسيق الكتلة (BFC). لقد كتبت دليلاً شاملاً لسياق تنسيق الكتلة. في هذه المقالة سوف تكتشف شيئين حول BFC التي هي نفسها بالنسبة لسياق تنسيق الشبكة. لا تتطفل العوامات على حاوية الشبكة ، ولا تنهار الهوامش الموجودة على الحاوية مع تلك الموجودة في المحتويات.

ومع ذلك ، توجد اختلافات بمجرد دخولنا إلى حاوية الشبكة. العناصر الفرعية لحاوية الشبكة ولا تشارك في تخطيط الكتلة والمضمنة ، فهي عناصر شبكة وبالتالي فهي تشارك في تخطيط الشبكة. هذا يعني أن بعض الأشياء التي اعتدنا عليها في التخطيط الكتلي والمضمن لا تكون صحيحة.

إذا تم تعويم أي عنصر في التخطيط أو مسحه ، فلن يكون لخصائص float أي تأثير بمجرد clear يصبح العنصر عنصر شبكة. ليس لخاصية vertical-align أي تأثير ، ولا يمكن استخدام العناصر الزائفة ::first-letter الأول و ::first-line .

حقيقة أن العنصر لا يمكن أن يكون عائمًا وعنصر الشبكة مفيدًا من حيث إنشاء العناصر الاحتياطية. عند إنشاء احتياطي للمتصفحات التي لا تدعم الشبكة باستخدام العوامات (عندما تكون الشبكة مدعومة) ، لا تحتاج إلى القيام بأي شيء خاص: يتم استبدال العائمة.

أوجز هذا النهج في مقالتي حول دعم المتصفحات بدون شبكة. هناك مواقف تبين فيها أن السلوك يمثل مشكلة ، على الرغم من أنه يمكن حل هذه المشكلات باستخدام جزء آخر من CSS كما هو موضح في هذا المنشور لتفريغ مشكلة في الشبكة والعوامات و "التخطيطات التحريرية والاستثناءات وشبكة CSS".

مع كل ما قيل ، إذا لم نفعل شيئًا آخر غير تغيير قيمة display إلى grid ، فلن نرى فرقًا كبيرًا في تخطيطنا. الأطفال المباشرون هم عناصر شبكة ، ومع ذلك ، فإننا ننتهي افتراضيًا بشبكة ذات عمود واحد. تحتوي الشبكة دائمًا على عمود واحد وصف واحد. باقي الصفوف التي يمكننا رؤيتها بعد القيام بذلك هي صفوف ضمنية ، أي صفوف تم إنشاؤها لاستيعاب المحتوى.

مجموعة من البطاقات موضوعة تحت الأخرى في عمود واحد.
عندما نقوم بإنشاء حاوية شبكة بدون أعمدة ، نحصل على شبكة ذات عمود واحد. (معاينة كبيرة)

يمكننا أن نبدأ في تكوين شيء يشبه الشبكة بالنسبة إلينا من خلال إعطاء قيمة grid-template-columns . يأخذ العقار قائمة المسار كقيمة ؛ إذا أعطيته ثلاثة مسارات 1fr ، فإننا نجد أنفسنا الآن مع شبكة من ثلاثة أعمدة ، واستخدام خاصية gap يعطيني التباعد بين هذه البطاقات.

لدينا الآن شيء يشبه الشبكة:

بطاقات مرتبة في ثلاثة أعمدة وصفين
نحدد بعض مسارات الأعمدة وفجوة للحصول على تخطيط شبكي واضح (معاينة كبيرة)

كل عنصر من عناصر الشبكة في مثالنا له عناصر فرعية خاصة به. تحتوي البطاقات على رؤوس وتذييلات ومنطقة للمحتوى الرئيسي للبطاقة. هؤلاء الأطفال عبارة عن عناصر شبكية ، لكن أطفالهم عادوا إلى تخطيط الكتلة والمضمنة. لا يقوم الرأس ومنطقة المحتوى والتذييل بأي شبكة مثل الأشياء. هذا لأننا عندما نغير قيمة display إلى grid ، فإنها لا ترث ولكن بدلاً من ذلك تصبح العناصر الفرعية فقط عناصر الشبكة ؛ أطفالهم يعودون إلى تخطيط الكتلة.

شبكات التعشيش

إذا كانت البطاقة تحتوي على محتوى أكثر من البطاقات الأخرى ، فإن البطاقات الموجودة في هذا الصف تصبح أطول. القيمة الأولية align-items الشبكة هي stretch . تمتد بطاقاتنا إلى الارتفاع الكامل. ومع ذلك ، فإن العناصر الموجودة بالداخل موجودة في كتلة طبيعية وتدفق مضمّن ، وبالتالي لا تتمدد بطريقة سحرية لملء البطاقة. (هذا هو السبب في الصورة أعلاه يمكنك أن ترى أن البطاقات ذات المحتوى الأقل بها فجوة في الأسفل.)

إذا أردنا منهم (من أجل جعل هذا التذييل يجلس دائمًا في الأسفل) ، فيمكننا أيضًا جعل عنصر الشبكة لدينا شبكة أيضًا. في هذه الحالة ، كل ما نحتاجه هو شبكة ذات عمود واحد. يمكننا بعد ذلك تحديد مسارات الصفوف ، وإعطاء المنطقة التي يجلس فيها div مع فئة المحتوى ، وحجم المسار 1fr . يؤدي ذلك إلى شغل كل المساحة المتوفرة في الحاوية ، وسيدفع التذييل إلى أسفل البطاقة.

شاهد القلم [عرض: الشبكة الفرعية ليست ما نريد] (https://codepen.io/rachelandrew/pen/PvQzeG) بقلم راشيل أندرو.

شاهد عرض القلم: الشبكة الفرعية ليست ما نريده بواسطة راشيل أندرو.

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

اصطفاف الرؤوس والتذييلات

كما رأينا الآن ، إذا أردنا وضع مجموعة من البطاقات على شبكة ، وأردنا عرضها بطول أطول بطاقة ، ونريد دفع التذييلات إلى أسفل البطاقة ، فنحن بحاجة إلى القليل جدًا من CSS . تنسيق CSS للمثال أعلاه هو كما يلي:

 .cards { display: grid; gap: 20px; grid-template-columns: 1fr 1fr 1fr; } article { display: grid; grid-template-rows: auto 1fr auto; row-gap: 20px; }

ماذا لو أردنا أن يصطف لون الخلفية في الرؤوس والتذييلات؟ كل بطاقة عبارة عن عنصر شبكة ، ولكن الرؤوس والتذييلات موجودة في الشبكة بالعنصر. ليس لديهم علاقة ببعضهم البعض ولذا لا يمكننا ترتيبهم. سيكون من الرائع هنا أن نرث الشبكة بطريقة ما من خلال الأطفال.

إذا تمكنا من تحديد شبكة على الأصل تحتوي على ثلاثة صفوف ، فضع البطاقات عبر هذه الصفوف الثلاثة ويكون كل منها رأس ومحتوى وتذييل في أحد الصفوف. بهذه الطريقة ، سيكون كل رأس في نفس الصف ، وبالتالي إذا زاد طول أحد الرؤوس ، فسيصبح الصف بأكمله أطول.

ليس لدينا حل جيد لذلك في المتصفحات اليوم ، لكنه في الطريق. ستعمل ميزة الشبكة الفرعية للمستوى 2 من تخطيط شبكة CSS على تمكين هذا النمط الدقيق. ستكون قادرًا على إنشاء شبكة على الأصل ثم اختيار الصفوف و / أو الأعمدة بشكل انتقائي لاستخدام تلك الشبكة ، بدلاً من تحديد شبكة جديدة على العنصر child المستقل تمامًا عن تلك الشبكة.

لاحظ أن الأمثلة التالية تعمل فقط وقت الكتابة في Firefox Nightly. تعد قيمة grid-template-columns grid-template-rows ميزة جديدة وجزءًا من المستوى 2 من مواصفات شبكة CSS. لتجربة هذه الميزة ، قم بتنزيل نسخة من Firefox Nightly.

يمكنك أن ترى كيف يعمل هذا في الصور أدناه. في الصورة الأولى ، قمت بإنشاء ثلاثة مسارات للصفوف على الوالد وامتدت البطاقة عبرهم. مع قيام Firefox Grid Inspector بتمييز الشبكة ، يمكنك أن ترى أن صفوف الوالد لا تتعلق بالصفوف المستخدمة من قبل الأطفال.

صورة لشبكة من ثلاثة أعمدة مع مسارات Firefox Grid Inspector متراكبة.
يُظهر فحص الشبكة باستخدام Firefox Grid Inspector أن العناصر لا تظهر في مسارات الأصل. (معاينة كبيرة)

إذا استخدمت قيمة grid-template-rows ، فبدلاً من تحديد ثلاثة صفوف على الطفل ، تستخدم البطاقة الآن تلك الصفوف على الأصل. يمكنك أن ترى كيف تتم محاذاة الاثنين وبالتالي تتم محاذاة الرؤوس والتذييلات أيضًا:

صورة لشبكة من ثلاثة أعمدة ، محاذاة جميع العناصر الموجودة داخل البطاقات.
باستخدام الشبكة الفرعية ينتقل كل جزء من البطاقة إلى مساره الخاص (معاينة كبيرة)

ما نقوم به هنا مع الشبكة الفرعية ليس قيمة جديدة display . العنصر الذي يمثل شبكة فرعية هو حاوية شبكة بحد ذاتها ، حيث قمنا بتعيين display: grid عليه. تتصرف عناصر الشبكة كما تفعل عناصر الشبكة عادةً. هذا تخطيط شبكة عادي - لا يختلف عن الشبكة المتداخلة الأصلية باستثناء أنه (بدلاً من العنصر الذي يحتوي على حجم مسار الصف الخاص به) فإنه يستخدم مسارات الأصل.

 .cards { display: grid; gap: 20px; grid-template-columns: 1fr 1fr 1fr; grid-template-rows: repeat(2,auto 1fr auto); } article { grid-row-end: span 3; display: grid; grid-template-rows: subgrid; }

هذا هو الشيء الجميل في subgrid ؛ ليس هناك الكثير لتتعلمه إذا كنت تعرف بالفعل كيفية استخدام تخطيط الشبكة. يمكنك أن تقرأ عن بقية التفاصيل في رسالتي السابقة هنا على Smashing Magazine ، "CSS Grid Level 2: Here Comes Subgrid".

بالأمس ( 23 مايو 2019) ، هبطت الشبكة الفرعية في Firefox Nightly ، لذلك لدينا تنفيذ قابل للاختبار لقيمة grid-template-columns grid-template-rows . يرجى الحصول على نسخة من Nightly وتجربتها. مع نسخة Nightly ، يمكنك رؤية المثال الأخير الذي يعمل في CodePen هذا:

شاهد عرض القلم: الشبكة الفرعية ليست ما نريده بواسطة راشيل أندرو.

شاهد عرض القلم: الشبكة الفرعية ليست ما نريده بواسطة راشيل أندرو.

تعرف على ما إذا كان يمكنك التفكير في حالات الاستخدام الأخرى التي تم حلها من خلال امتلاك ميزة الشبكة الفرعية ، أو ربما الأشياء التي تعتقد أنها مفقودة. بينما لا تتوفر الميزة إلا في المتصفح الليلي ، فهذا هو الوقت الذي يمكن فيه إجراء تغييرات على المواصفات في حالة اكتشاف بعض المشكلات. لذلك ، قدم معروفًا لنفسك في المستقبل لتطوير الويب وجرب ميزات مثل هذه حتى تتمكن من المساهمة في نظام الويب وتحسين الأمور.

إذا كنت تعتقد أنك عثرت على خطأ في تطبيق Firefox ، فيمكنك إلقاء نظرة على خطأ التنفيذ الرئيسي في Bugzilla والذي يرتبط بالمشكلات ذات الصلة في القسم يعتمد على . إذا لم تتمكن من رؤية مشكلتك ، فقم بإنشاء حالة اختبار بسيطة قدر الإمكان ورفع الخطأ. إذا كنت تعتقد أن الشبكة الفرعية يجب أن تفعل شيئًا من أجل حل حالة استخدام ، وهذا شيء لم يتم تفصيله في المواصفات ، فيمكنك إثارة مشكلة على GitHub مجموعة عمل CSS من أجل تحسين محتمل.

ماذا عن display: contents ؟

إذا كنت تتابع ، فقد تعتقد أن display: contents (كما هو موضح في المقالة السابقة حول display ) قد تحل المشكلات التي تسعى الشبكة الفرعية إلى حلها - وهي السماح للأطفال غير المباشرين بالمشاركة في تخطيط الشبكة. هذا ليس هو الحال ، ومثالنا على البطاقات هو طريقة مثالية لإثبات الفرق.

إذا ، بدلاً من جعل بطاقتنا تخطيط شبكة مع display: grid ، قمنا بإزالة المربع باستخدام display: contents ، فسنحصل على هذه النتيجة في CodePen التالية. (حاول إزالة display: contents من قواعد .card . لمعرفة الفرق.)

شاهد عرض القلم: الشبكة الفرعية ليست ما نريده بواسطة راشيل أندرو.

شاهد عرض القلم: الشبكة الفرعية ليست ما نريده بواسطة راشيل أندرو.

في هذا المثال ، تمت إزالة مربع البطاقة ومن ثم يشارك الرأس والمحتوى والتذييل مباشرة في تخطيط الشبكة ويتم وضعها تلقائيًا عبر الشبكة. لم يكن هذا ما أردناه على الإطلاق! ستكون قيمة contents العرض مفيدة حقًا بمجرد التعامل مع مشكلات إمكانية الوصول في المتصفحات المذكورة في مقالتي الأخيرة ، ومع ذلك ، فإنها تحل مشكلات مختلفة عن تلك التي نستكشفها.

المزيد من القراءة والأمثلة

لقد قمت بإنشاء عدد من الأمثلة والعروض التوضيحية لمساعدة الجميع على فهم الشبكة الفرعية. يمكنك تجربة هؤلاء على الروابط أدناه:

  • أمثلة على شبكة CSS من المستوى 2
  • CSS Grid المستوى 2: هنا يأتي Subgrid
  • شبكات على طول الطريق (عرض تقديمي)
  • وثائق MDN لـ Subgrid