التنسيق

بودكاست CSS - 009: التنسيق

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

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

التنسيق: سجلّ موجز

في بدايات الويب، تم وضع تصميمات أكثر تعقيدًا من المستندات البسيطة باستخدام عناصر <table>. أصبح فصل HTML عن الأنماط المرئية أسهل عندما اعتمدت المتصفحات CSS على نطاق واسع في أواخر التسعينيات. لقد أتاح CSS للمطوّرين إمكانية تغيير مظهر الموقع الإلكتروني ومضمونه بالكامل بدون لمس HTML على الإطلاق. وقد ألهمت هذه الإمكانية الجديدة مشاريع مثل The CSS Zen Garden الذي تم إنشاؤه لإثبات قوة CSS لتشجيع المزيد من المطوّرين على تعلُّمها.

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

مخطط زمني يعرض كيفية تطوّر خدمة CSS على مر السنين، بدءًا من 1996 وحتى 2021

التخطيط: الحاضر والمستقبل

تتميز لغة CSS الحديثة بأدوات تخطيط قوية للغاية. لدينا أنظمة مخصصة للتخطيط وسنلقي نظرة عالية المستوى على ما لدينا تحت تصرفنا، قبل البحث في المزيد من التفاصيل عن Flexbox وGrid في الوحدات التالية.

فهم السمة display

تنفّذ السمة display شيئين. أول شيء يفعله هو تحديد ما إذا كان المربع الذي تم تطبيقه على العمل مضمّنًا أو كتلة.

.my-element {
  display: inline;
}

تتصرف العناصر المضمنة مثل الكلمات في الجملة. تجلس بجانب بعضها البعض في الاتجاه المضمّن. يتم تلقائيًا تضمين العناصر، مثل <span> و<strong>، التي تُستخدم عادةً لتنسيق أجزاء من النص داخل عناصر تحتوي على عناصر مثل <p> (فقرة). كما أنها تحافظ على المسافة البيضاء المحيطة.

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

لا يمكنك تعيين عرض وارتفاع واضحين في العناصر المضمنة. وسيتم تجاهل أي هامش لمستوى الكتلة أو مساحة متروكة بواسطة العناصر المحيطة.

.my-element {
    display: block;
}

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

.my-element {
    display: flex;
}

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

Flexbox والشبكة

هناك آليات تنسيق رئيسية تنشئ قواعد تنسيق لعناصر متعددة، وهما flexbox وgrid. وهي تشترك في أوجه التشابه، ولكنها مصممة لحل مشكلات التخطيط المختلفة.

Flexbox

.my-element {
    display: flex;
}

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

ستظل العناصر على المحور نفسه ولن يتم لفّها عند نفاد المساحة. بدلاً من ذلك، سيحاولون الضغط على نفس الخط مع بعضهم البعض. يمكن تغيير هذا السلوك باستخدام السمات align-items وjustify-content وflex-wrap.

يحوّل Flexbox أيضًا العناصر الفرعية إلى عناصر مرنة، ما يعني أنّه يمكنك كتابة قواعد حول سلوكها داخل حاوية مرنة. يمكنك تغيير المحاذاة والترتيب والتبرير في عنصر فردي. يمكنك أيضًا تغيير كيفية تقليل حجم النمو أو تقليصه باستخدام السمة flex.

.my-element div {
    flex: 1 0 auto;
}

السمة flex هي اختصار للمصطلحات flex-grow وflex-shrink وflex-basis. يمكنك توسيع المثال أعلاه كما يلي:

.my-element div {
 flex-grow: 1;
 flex-shrink: 0;
 flex-basis: auto;
}

يوفّر المطوّرون هذه القواعد المنخفضة المستوى لتلميح للمتصفح إلى الطريقة التي يجب أن يتصرف بها التنسيق عندما تواجهه أبعاد المحتوى وإطار العرض. هذا يجعلها آلية مفيدة للغاية لتصميم الويب سريع الاستجابة.

معرّف الإصدار العالمي (GRid)

.my-element {
    display: grid;
}

تتشابه "Grid" (الشبكة) في نواح كثيرة مع flexbox، ولكنها مصممة للتحكم في التخطيطات متعددة المحاور بدلاً من التخطيطات أحادية المحور (المساحة العمودية أو الأفقية).

تتيح لك "Grid" (الشبكة) كتابة قواعد تنسيق على عنصر يتضمّن display: grid، وتقدّم بعض الأساسيات الجديدة لتصميم التنسيق، مثل الدالتَين repeat() وminmax(). إحدى وحدات الشبكة المفيدة هي وحدة fr، وهي جزء من المساحة المتبقية، يمكنك إنشاء شبكات تقليدية مكوّنة من 12 عمودًا، مع وجود فجوة بين كل عنصر، باستخدام 3 خصائص CSS:

.my-element {
  display: grid;
  grid-template-columns: repeat(12, 1fr);
  gap: 1rem;
}

يوضح هذا المثال أعلاه تخطيطًا أحادي المحور. عندما يتعامل flexbox في الغالب مع العناصر كمجموعة، تمنحك الشبكة تحكمًا دقيقًا في موضعها في بُعدين. يمكننا تحديد أن العنصر الأول في هذه الشبكة يأخذ صفين و3 أعمدة:

.my-element :first-child {
  grid-row: 1/3;
  grid-column: 1/4;
}

السمتان grid-row وgrid-column توجّه العنصر الأول في الشبكة إلى بداية العمود الرابع، من العمود الأول، ثم التمديد إلى الصف الثالث، من الصف الأول.

تخطيط التدفق

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

مربّع مضمّن

هل تتذكر كيف لا تحترم العناصر المحيطة هامش الحظر والمساحة المتروكة على عنصر مضمّن؟ من خلال inline-block، يمكنك تنفيذ ذلك.

p span {
    display: inline-block;
}

يمنحك استخدام inline-block مربّعًا يحتوي على بعض خصائص العنصر على مستوى الحظر، لكنه لا يزال يتدفق بشكل مضمّن مع النص.

p span {
    margin-top: 0.5rem;
}

عائمة

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

img {
    float: left;
    margin-right: 1em;
}

توجّه السمة float عنصرًا إلى "العائم" في الاتجاه المحدّد. يتم تعليم الصورة في هذا المثال بحيث تطفو على اليسار، مما يسمح بعد ذلك للعناصر التابعة "بالتفاف" حولها. يمكنك ضبط عنصر ليجعله عائمًا left أو right أو inherit.

التخطيط متعدد الأعمدة

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

<h1>All countries</h1>
<ul class="countries">
  <li>Argentina</li>
  <li>Aland Islands</li>
  <li>Albania</li>
  <li>Algeria</li>
  <li>American Samoa</li>
  <li>Andorra</li>
  …
</ul>
.countries {
    column-count: 2;
    column-gap: 1em;
}

يؤدي ذلك إلى تقسيم تلك القائمة الطويلة تلقائيًا إلى عمودين ويضيف فجوة بين العمودين.

.countries {
    width: 100%;
    column-width: 260px;
    column-gap: 1em;
}

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

المكانة في السوق

أخيرًا، في هذه النظرة العامة على آليات التخطيط، تحديد الموضع. تغيِّر السمة position طريقة عمل عنصر في التدفق العادي للمستند، ومدى ارتباطه بالعناصر الأخرى. الخيارات المتاحة هي relative وabsolute وfixed وsticky بالقيمة التلقائية التي هي static.

.my-element {
  position: relative;
  top: 10px;
}

يتم دفع هذا العنصر بمقدار 10 بكسل لأسفل بناءً على موضعه الحالي في المستند، نظرًا لتحديد موضعه بالنسبة إلى نفسه. تؤدي إضافة position: relative إلى عنصر أيضًا إلى جعله كتلة تضمين أي عناصر فرعية تحتوي على position: absolute. وهذا يعني أنه سيتم تغيير موضع العنصر الفرعي الآن إلى هذا العنصر تحديدًا، بدلاً من العنصر الأصل النسبي الأعلى، عندما يتم تطبيق موضع مطلق عليه.

.my-element {
  position: relative;
  width: 100px;
  height: 100px;
}

.another-element {
    position: absolute;
    bottom: 0;
    right: 0;
    width: 50px;
    height: 50px;
}

عند ضبط السمة position على absolute، يتم إيقاف العنصر خارج تدفق المستند الحالي. وهذا يعني أمرين:

  1. يمكنك وضع هذا العنصر في أي مكان تريده باستخدام top وright وbottom وleft في أقرب عنصر رئيسي نسبي له.
  2. تتم إعادة تدفق كل المحتوى المحيط بعنصر مطلق لملء المساحة المتبقية التي تركها هذا العنصر.

يتصرف العنصر الذي يتضمّن القيمة position fixed بالطريقة نفسها التي يتصرف بها العنصر absolute، مع كون عنصره الرئيسي العنصر الجذر <html>. تظل عناصر الموضع الثابت مثبّتة من أعلى اليسار استنادًا إلى القيم top وright وbottom وleft التي تضبطها.

ويمكنك الاستفادة من الجوانب الثابتة والثابتة في fixed وجوانب احترام تدفق المستندات الأكثر توقعًا في relative باستخدام sticky. عند استخدام هذه القيمة، عندما ينتقل إطار العرض بعد العنصر، يظل مرتبطًا بالقيم top وright وbottom وleft التي تضبطها.

الخاتمة

يوفر تنسيق CSS الكثير من الخيارات والمرونة. للتعرّف بشكل أفضل على إمكانيات CSS Flexbox وGrid، يمكنك المتابعة إلى الوحدات القليلة التالية.

التحقّق من استيعابك

اختبر معلوماتك حول التخطيط

ما هما الإجراءان اللذان تنفّذهما السمة display؟

يحدّد inline أو block أو none.
يحتاج محرك التخطيط إلى معرفة ما إذا كان هذا المربع بعرض كامل أم لا ويحتاج إلى سطر جديد.
يحدد إطار تخطيط الشبكة.
يمكن لخاصية العرض ضبط العرض على الشبكة ولكن ليس لها أي علاقة بإطار التخطيط.
يحدد كيف يجب أن يتصرف الأطفال.
لدى Flexbox وGrid آراء وميزات جديدة لأطفالهم.
تحدِّد هذه السياسة ما إذا كان يجب تمرير المربّع أم لا.
هذه سمة overflow.

لتدفق عدة فقرات إلى أعمدة، ما خاصية CSS الأفضل لهذه المهمة؟

display: grid
بينما يمكن للشبكة وضع فقرات متعددة في أعمدة، فإن هذه الأعمدة ستكون أعمدتها الخاصة، ولا تتدفق معًا من واحدة إلى أخرى.
column-count
ستتدفق الفقرات من نهاية أحد الأعمدة إلى بداية العمود الذي يليه، مثلما تفعل مجلة أو صحيفة.
display: flex
بينما يمكن أن تضع المرونة في فقرات متعددة في أعمدة، فإن هذه الأعمدة ستكون أعمدتها الخاصة، ولا تتدفق معًا من عمود إلى آخر مثل الحاجة.
float
يُرجى اختيار إجابة أخرى.

ماذا يعني أن يكون هناك كتلة خارج التدفق؟

عالِق على جانب النهر.
السياق هو CSS هنا، وليس الموقع الجغرافي.
تم منحه قيمة الموضع top أو left.
وجود هذه الخصائص وحدها لا يؤدي إلى إخراج الصندوق من التدفق.
لم يعد في موضعه بناءً على مواضع الأشقاء.
على سبيل المثال، تم تحديد موضع مربّع يتضمّن position: absolute وإحداثي س وص بناءً على القطعة التي تتضمّن الرمز، وليس ترتيبه مع العناصر التابعة الأخرى.

هل يغطّي كل من Flexbox وGrid الأطفال بشكل تلقائي؟

صحيح
ويجب تفعيله من خلال "flex-wrap: wrap" أو "repeat(auto-fit, 30ch)".
خطأ
يحتوي Flexbox وGrid على ميزات التفاف خاصة تحتاج إلى أنماط إضافية لتطبيقها.