الحفر في خاصية العرض: قيمتا العرض

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

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

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

عناصر الكتلة والمضمنة

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

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

يعتبر سلوك عناصر الكتلة والعناصر المضمنة أمرًا أساسيًا لـ CSS وحقيقة أن مستند HTML المرمز بشكل صحيح سيكون قابلاً للقراءة افتراضيًا. يُشار إلى هذا التخطيط باسم "Block and Inline Layout" أو "Normal Flow" لأن هذه هي الطريقة التي تضع بها العناصر نفسها إذا لم نفعل شيئًا آخر لها.

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

القيم الداخلية والخارجية display

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

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

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

أعتقد أن طريقة التفكير هذه في display مفيدة للغاية ؛ يشرح بشكل مباشر ما نقوم به باستخدام طرق التخطيط المختلفة. إذا كنت تريد تحديد display: inline flex ، فماذا تتوقع؟ نأمل أن يكون المربع الذي يتصرف كعنصر مضمن ، مع الأطفال الذين هم عناصر مرنة.

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

نحن نعود دائمًا إلى التدفق الطبيعي

عند التفكير في خصائص العرض الداخلية والخارجية ، قد يكون من المفيد التفكير فيما يحدث إذا لم نتلاعب بقيمة العرض على الإطلاق. إذا قمت بكتابة بعض HTML وعرضه في متصفح ، فإن ما تحصل عليه هو Block and Inline Layout ، أو Normal Flow. يتم عرض العناصر كعناصر block أو inline .

انظر كتلة القلم والتخطيط المضمن بواسطة راشيل أندرو.

انظر كتلة القلم والتخطيط المضمن بواسطة راشيل أندرو.

يحتوي المثال أدناه على بعض العلامات التي قمت بتحويلها إلى كائن وسائط ، من خلال جعل عرض div display: flex (الطفلين المباشرين) الآن عناصر مرنة ، وبالتالي أصبحت الصورة الآن في صف واحد مع المحتوى. إذا رأيت في المحتوى ، مع ذلك ، هناك عنوان وفقرة يتم عرضها في التدفق الطبيعي مرة أخرى. أصبح الأطفال المباشرون لوسائل الإعلام عناصر مرنة ؛ يعود أطفالهم إلى التدفق الطبيعي ما لم نغير قيمة العرض على العنصر المرن. الحاوية المرنة نفسها عبارة عن صندوق كتلة ، كما ترى من خلال حقيقة أن الحد يمتد إلى حافة الأصل.

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

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

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

شرح flow-root inline-block

من المحتمل أيضًا أن تكون قيمة inline-block مألوفة للكثيرين منا ممن عملوا CSS لفترة من الوقت. هذه القيمة هي طريقة للحصول على بعض سلوك الكتلة على عنصر inline . على سبيل المثال ، يمكن أن يكون لعنصر inline-block عرض وارتفاع. عنصر مع display: inline-block أيضًا بطريقة مثيرة للاهتمام من حيث أنه ينشئ B lock F أو C ontent (BFC).

يقوم BFC ببعض الأشياء المفيدة من حيث التخطيط ، على سبيل المثال ، يحتوي على عدد عائم. لقراءة المزيد عن سياقات تنسيق الكتل بمزيد من التفصيل ، راجع مقالتي السابقة "فهم تخطيط CSS وسياق تنسيق الكتلة." لذلك فإن قول display: inline-block يمنحك مربعًا مضمنًا ينشئ BFC أيضًا.

كما ستكتشف (إذا قرأت المقالة المذكورة أعلاه حول سياق تنسيق الكتلة) ، فهناك قيمة أحدث للعرض والتي تنشئ أيضًا BFC بشكل صريح. هذه هي قيمة flow-root . تنشئ هذه القيمة BFC على كتلة ، بدلاً من عنصر مضمن.

  • display: inline-block BFC في مربع مضمن.
  • display: flow-root BFC على صندوق كتلة.

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

القيم القديمة للعرض

توضح مواصفات CSS2 القيم التالية لخاصية display :

  • inline
  • block
  • inline-block
  • list-item
  • none
  • table
  • inline-table

تم تعريف الخصائص الداخلية المختلفة للجدول أيضًا مثل table-cell التي لا نتعامل معها في هذه المقالة.

ثم أضفنا إلى هذه بعض القيم للعرض ، لدعم التخطيط المرن والشبكة:

  • grid
  • inline-grid
  • flex
  • inline-flex

ملاحظة : تحدد المواصفات أيضًا ruby inline-ruby لدعم نص Ruby والذي يمكنك قراءته في مواصفات Ruby.

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

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

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

قيمة واحدة اثنان من قيم الكلمات الرئيسية وصف
block block flow صندوق بلوك مع تدفق داخلي طبيعي
flow-root block flow-root مربع كتلة يحدد BFC
inline inline flow مربع مضمن مع تدفق داخلي عادي
inline-block inline flow-root مربع مضمن يحدد BFC
list-item block flow list-item صندوق بلوك مع صندوق ماركر داخلي وإضافي التدفق الطبيعي
flex block flex صندوق بلوك مع تخطيط داخلي مرن
inline-flex inline flex مربع مضمن مع تخطيط داخلي مرن
grid block grid مربع كتلة مع تخطيط الشبكة الداخلية
inline-grid inline grid مربع مضمن مع تخطيط الشبكة الداخلية
table block table مربع كتلة مع تخطيط الجدول الداخلي
inline-table inline table مربع مضمن مع تخطيط جدول داخلي

لشرح كيفية عمل ذلك ، يمكننا التفكير في حاوية شبكية. في العالم ذي القيمتين ، سننشئ حاوية شبكة على مستوى الكتلة مع:

 .container { display: block grid; }

ومع ذلك ، فإن الكلمة الرئيسية القديمة تعني أن ما يلي يفعل الشيء نفسه:

 .container { display: grid; }

إذا أردنا بدلاً من ذلك حاوية شبكة مضمنة ، في العالم ذي القيمتين ، سنستخدم:

 .container { display: inline grid; }

وفي حالة استخدام القيم القديمة:

 .container { display: inline-grid; }

يمكننا الآن العودة إلى حيث بدأت هذه المحادثة وإلقاء نظرة على display: inline-block . بالنظر إلى الجدول ، يمكنك أن ترى أن هذا مُعرَّف في العالم ذي القيمتين على أنه display: inline flow-root . يتطابق الآن مع display: flow-root الذي سيتم display: block flow-root . القليل من الترتيب والتوضيح لكيفية تعريف هذه الأشياء. إعادة هيكلة CSS ، إذا أردت.

دعم المستعرض لبناء جملة قيمتين

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

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