[وضع إشارة مرجعية] CSS: استخدام المسافة البادئة والمسافات البادئة

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




أنواع مسافة CSS


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


الفضاء الداخلي والفضاء الخارجي

في CSS ، يمكن تعديل المسافة بين العناصر ومكوناتها على النحو التالي:

.element {
    padding: 1rem;
    margin-bottom: 1rem;
}

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

Property خاصية الهامش - مسافة بادئة


يتم marginاستخدام الخاصية لتحديد المسافة بين العناصر الفردية. على سبيل المثال ، استخدم المثال السابق خاصية CSS margin-bottom: 1remلإضافة مسافة رأسية بين عنصرين يقع أحدهما فوق الآخر.

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

▍ انهيار الحشو الخارجي


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


يزداد مقدار المسافة البادئة.

في الرسم البياني أعلاه ، يتم تكوين الخاصية على العنصر العلوي والخاصيةmargin-bottomعلى العنصر السفليmargin-top. تقابل المسافة الرأسية بين العناصر أكبر هذه المسافات البادئة.

لتجنب هذه المشكلة ، يوصى بتهيئة نفس المسافة البادئة في جميع العناصر (كما هو موضح هنا ). وهنا حقيقة أخرى مثيرة للاهتمام. صوت المورد الخدع CSSعلى استخدام الخصائصmargin-bottomوmargin-top. كما اتضح ،margin-bottomفازالعقار، بنسبة 61 ٪ من الأصوات.

إليك كيفية حل هذه المشكلة:

.element:not(:last-child) {
    margin-bottom: 1rem;
}

إن استخدام محدد CSS :notيجعل من السهل إزالة المسافة البادئة الخارجية للطفل الأخير للتخلص من المساحة غير الضرورية بين العناصر.

هنا عرض توضيحي للعمل مع الهوامش الخارجية ،

ومثال آخر متعلق بهبوط الهوامش الخارجية يتعلق بالعناصر الفرعية والأبوين. افترض أن لديك HTML التالي:

<div class="parent">
  <div class="child">I'm the child element</div>
</div>

هنا أنماطه:

.parent {
  margin: 50px auto 0 auto;
  width: 400px;
  height: 120px;
}

.child {
  margin: 50px 0;
}

إليك ما تبدو عليه نتيجة تصور كل هذا.


الطفل والوالد

لاحظ أن الطفل يتاخم الجزء العلوي من الوالد. هذا هو نتيجة انهيار هوامشها الخارجية. وفقًا لـ W3C ، هناك العديد من الخيارات لحل هذه المشكلة:

  • إضافة خاصية borderللعنصر الأصلي.
  • تعيين خاصية displayعنصر تابع إلى قيمة inline-block.

قد يكون تعيين خاصية padding-topالعنصر الرئيسي حلاً مفهومة أكثر لهذه المشكلة .


تعيين المسافة البادئة العليا للعنصر الأصلي

ent مسافة بادئة سلبية


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


نتائج تعيين خاصية الحشو للعنصر

الأصلي يحتوي العنصر الأصل على خاصيةpadding: 1rem. هذا يتسبب في حصول الطفل على تعويضات من الأعلى واليسار واليمين. ولكن يجب أن يكون الطفل مجاورًا لحدود الوالدين. سوف تساعد الهوامش الخارجية السلبية على تحقيق ذلك.

.parent {
    padding: 1rem
}

.child {
    margin-left: -1rem;
    margin-right: -1rem;
    margin-top: -1rem;
}

هذا ما حدث نتيجة هذا الأسلوب.


تساعد الهوامش الخارجية السلبية للطفل على تحقيق التأثير المطلوب

إليك عرض توضيحي

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

property خاصية الحشو - الحشو الداخلي


كما ذكرنا من قبل ، paddingتسمح لك الخاصية بالتحكم في المساحة داخل العنصر. يعتمد الغرض من تطبيق هذه الخاصية على الحالة التي يتم استخدامها فيها.

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


مسافة بادئة باللون الأخضر

▍ الحالات التي لا تعمل فيها خاصية الحشو


من المهم ملاحظة أن المسافة البادئة العمودية لا تعمل مع العناصر التي لها خاصية display: inline. على سبيل المثال ، هذه هي العناصر <span>و <a>. إذا قمت بتكوين خاصية paddingهذا العنصر ، فلن يعمل مثل هذا الإعداد على هذا العنصر. هذا مجرد تذكير ودي بأن العناصر المضمنة تحتاج إلى تغيير خاصية display:

.element span {
    display: inline-block;
    padding-top: 1rem;
    padding-bottom: 1rem;
}

مسافة بين عناصر تخطيط شبكة CSS


في CSS Grid ، يمكنك بسهولة ضبط المسافة بين الأعمدة والصفوف باستخدام الخاصية grid-gap. هذا اختصار لخاصية تحدد المسافة بين الأعمدة والصفوف.


المسافات بين الأعمدة والصفوف

.element {
    display: grid;
    grid-template-columns: 1fr 1fr;
    grid-gap: 16px; /*    16px     */
}

يبدو السجل الكامل لهذه الخصائص كما يلي:

.element {
    display: grid;
    grid-template-columns: 1fr 1fr;
    grid-row-gap: 24px;
    grid-column-gap: 16px;
}

المسافة بين عناصر CSS لتخطيط Flexbox


هناك خاصية واحدة مقترحة لتخطيطات الشبكة والمرن. هذه ملكية gap. حاليًا ، يدعمها Firefox فقط.

.element {
    display: flex;
    flex-wrap: wrap;
    gap: 16px;
}

علاوة على ذلك ، لا يمكن استخدام هذه الخاصية مع CSS @supportsلتحديد ما إذا كانت مدعومة ، واتخاذ القرارات المناسبة بناءً على ذلك. إذا أعجبك هذا العقار - صوت لإضافته إلى Chrome.

عناصر التموضع في CSS


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

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

.category {
    position: absolute;
    left: 16px;
    top: 16px;
}



يتم تمييز المسافة بين حدود العنصر الأصل والعناصر التابعة باللون الأخضر.

استخدم السيناريوهات ودراسات الحالة


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

component مكون الرأس



المكوّن هو رأس يحتوي على الإعدادات التالية: الهوامش اليمنى واليسرى والمساحة حول الشعار والمسافة حول عنصر التنقل والمسافة بين عنصر التنقل واسم المستخدم

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

<header class="c-header">
  <h1 class="c-logo"><a href="#">Logo</a></h1>
  <div class="c-header__nav">
    <nav class="c-nav">
      <ul>
        <li><a href="#">...</a></li>
      </ul>
    </nav>
    <a href="#" class="c-user">
      <span>Ahmad</span>
      <img class="c-avatar" src="shadeed.jpg" alt="">
    </a>
  </div>
</header>



الهوامش الداخلية والخارجية يتم استخدام الهوامش

اليسرى واليمنى. والغرض منها هو التأكد من أن محتويات الرأس لا تتشبث بحوافها.

.c-header {
    padding-left: 16px;
    padding-right: 16px;
}

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

.c-nav a {
    display: block;
    padding: 16px 8px;
}

إذا تحدثنا عن المسافة بين العناصر ، فيمكنك استخدام الخاصية margin، أو - يمكنك تغيير خاصية displayالعناصر <li>إلى inline-block. ونتيجة لذلك ، يتم إضافة مسافة صغيرة بين العناصر الموجودة على نفس المستوى ، نظرًا لحقيقة أن هذه العناصر تعتبر رموزًا.

.c-nav li {
    /*     ,     */
    display: inline-block;
}

أخيرًا ، يحتوي اسم المستخدم والصورة الرمزية على مسافة بادئة خارجية يسرى.

.c-user img,
.c-user span {
    margin-left: 10px;
}

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

.c-user img,
.c-user span {
    margin-inline-start: 1rem;
}



المسافات قبل وبعد الفاصل ليست هي نفسها.

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

  • تعيين الحد الأدنى لعرض عناصر التنقل.
  • زيادة المسافة البادئة الأفقية.
  • يضيف مسافة بادئة إضافية على الجانب الأيسر من الفاصل.

الطريقة الأفضل والأسهل هي استخدام الطريقة الثالثة ، وهي تكوين الخاصية margin-left:

.c-user {
    margin-left: 8px;
}

هنا تجريبي

▍ المسافات في تخطيطات الشبكة - CSS Flexbox


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


تخطيط الشبكة

نحتاج إلى ضبط المسافة بين صفوف وأعمدة الجدول. إليك الترميز:

<div class="wrapper">
    <div class="grid grid--4">
        <div class="grid__item">
              <article class="card"><!--   --></article>
        </div>
        <div class="grid__item">
              <article class="card"><!--   --></article>
        </div>
        <!--   .. -->
    </div>
</div>

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

.grid--4 {
    display: flex;
    flex-wrap: wrap;
}

.grid__item {
    flex-basis: 25%;
    margin-bottom: 16px;
}

بفضل رمز CSS هذا ، سيكون هناك أربع بطاقات في كل سطر. فيما يلي طريقة ممكنة لضبط المسافة بينهما:

.grid__item {
    flex-basis: calc(25% - 10px);
    margin-left: 10px;
    margin-bottom: 16px;
}

باستخدام وظيفة CSS ، calc()يتم طرح المسافة البادئة من flex-basis. كما ترون ، هذا ليس حلًا بسيطًا. أنا في الواقع أفضل ما يلي:

  • قم بتعيين خاصية عنصر الشبكة padding-left.
  • قم بتعيين العنصر الأصل بحيث يكون له هامش خارجي سلبي margin-leftبنفس قيمة y padding-left.

لقد تعلمت عن هذه الطريقة منذ سنوات عديدة ، بعد قراءة هنا بعض المقالات ، التي نسي اسمها بالفعل (إذا كنت تعرف نوع المقالة - يرجى إخباري).

.grid--4 {
    display: flex;
    flex-wrap: wrap;
    margin-left: -10px;
}

.grid__item {
    flex-basis: 25%;
    padding-left: 10px;
    margin-bottom: 16px;
}

السبب الذي جعلني أستخدم قيمة سالبة لهذا margin-leftالسبب هو أن البطاقة الأولى لها خاصية padding-left، في الواقع ، ليست ضرورية. ونتيجة لذلك ، أقوم بتحريك عنصر الغلاف إلى اليسار والتخلص من المساحة غير الضرورية.

→  إليك مثال عملي ،

وهناك فكرة أخرى مماثلة وهي استخدام المسافات البادئة والمسافة البادئة السلبية. هنا مثال من موقع Facebook.


الهوامش الداخلية والخارجية

إليك رمز CSS الذي يوضح هذه الفكرة:

.wrapper {
    margin-left: -4px;
    margin-right: -4px;
}

.story {
    padding-left: 4px;
    padding-right: 4px;
}

istanceالمسافة في تخطيطات الشبكة - CSS Grid


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

.grid--4 {
    display: grid;
    grid-template-columns: 1fr 1fr 1fr;
    grid-gap: 1rem;
}

هذا كل شئ. أعتقد أنه لن يجادل أحد في أن إعداد تخطيطات الشبكة أسهل وأكثر قابلية للفهم من إعداد تخطيطات Flexbox.

distance تحديد المسافة بين العناصر عند الضرورة فقط


في تخطيطات الشبكة ، أحب حقًا أن الخاصية grid-gapيتم تطبيقها فقط عندما يجب أن يكون هناك مسافة بين العناصر. نلقي نظرة على التخطيط التالي.


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

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

.card:not(:last-child) {
    margin-bottom: 16px;
}

@media (min-width: 700px) {
    .card:not(:last-child) {
        margin-bottom: 0;
        margin-left: 1rem;
    }
}

غير مناسب للغاية. حقيقة؟ ماذا عن النمط التالي؟

.card-wrapper {
    display: grid;
    grid-template-columns: 1fr;
    grid-gap: 1rem;
}

@media (min-width: 700px) {
    .card-wrapper {
        grid-template-columns: 1fr 1fr;
    }
}

تم! وكل شيء أبسط بكثير.

with العمل مع المسافة البادئة الخارجية السفلية


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


مجموعة من المكونات مرتبة أفقيًا

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

يمكنك حل هذه المشكلة باللجوء إلى أحد الحلول التي سنحللها الآن.

الحل # 1: محدد CSS: لا


.element:not(:last-child) {
    margin-bottom: 16px;
}

الحل رقم 2: مزيج من العناصر المجاورة من نفس المستوى


.element + .element {
    margin-top: 16px;
}

تحليل القرار


على الرغم من أن الحل رقم 1 يبدو أكثر جاذبية ، إلا أنه يحتوي على العيوب التالية:

  • أنه يؤدي إلى قضايا محددة CSS. لا يمكن إعادة تعريفه حتى يتم استخدام محدد :not.
  • لا تنطبق عندما يكون هناك أكثر من عمود واحد من العناصر. هذا موضح أدناه.


عمودين من العناصر ومشكلة الحل رقم 1

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

في هذه الحالة ، من الأفضل اللجوء إلى قرار إزالة المساحة غير الضرورية عن طريق إضافة مسافة بادئة خارجية سلبية إلى العنصر الأصلي:

.wrapper {
    margin-bottom: -16px;
}

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

Card بطاقة المكون


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


بطاقة مكون (إذا كنت ترغب في تناول الطعام - أنا آسف)

فكر في مكان استخدام هذه المسافة بالضبط بين العناصر وأجزائها. هنا جوابي على هذا السؤال.


الهوامش الداخلية والخارجية

هنا الترميز:

<article class="card">
    <a href="#">
      <div class="card__thumb"><img src="food.jpg" alt=""></div>
      <div class="card__content">
        <h3 class="card__title">Cinnamon Rolls</font></h3>
        <p class="card__author">Chef Ahmad</p>
        <div class="card__rating"><span>4.9</span></div>
        <div class="card__meta"><!-- --></div>
      </div>
    </a>
</article>

هنا هو أسلوب الفصل card__content:

.card__content {
    padding: 10px;
}

بفضل مجموعة المسافة البادئة هنا ، سيتم تعيين الإزاحة لجميع الأطفال. ثم قم بإعداد الهوامش الخارجية:

.card__title,
.card__author,
.card__rating {
  margin-bottom: 10px;
}

عند إعداد الفصل بين التصنيف والمعلومات ، استخدمت الحدود:

.card__meta {
    padding-top: 10px;
    border-top: 1px solid #e9e9e9;
}

ولكن هنا نواجه مشكلة! لا يتم ربط الحدود بالحواف ، ويرجع ذلك إلى card__contentالمسافة البادئة للعنصر الأصلي مع الفصل .


الفاصل غير مرتبط بالحافة.

ربما تكون قد خمنت بالفعل أن المسافات البادئة السلبية ستساعدنا هنا:

.card__meta {
    padding-top: 10px;
    border-top: 1px solid #e9e9e9;
    margin: 0 -10px;
}

ولكن هنا مرة أخرى ، حدث خطأ ما. الآن تمسك النص إلى حافة البطاقة.


الفاصل طبيعي ، لكن محتويات البطاقة غير موجودة بشكل صحيح.

لحل هذه المشكلة ، تحتاج إلى تكوين المسافات البادئة اليمنى واليسرى لمحتويات البطاقة.

.card__meta {
    padding: 10px 10px 0 10px;
    border-top: 1px solid #e9e9e9;
    margin: 0 -10px;
}



تم تكوين البطاقة كما ينبغي

هنا مثال

▍ محتوى المقالات


أنا متأكد من أن ما سنتحدث عنه هنا هو وضع شائع جدًا. النقطة هنا هي أن محتوى المقالات ينتقل عادةً إلى صفحات من CMS (نظام إدارة المحتوى - نظام إدارة المحتوى) ، أو يتم إنشاؤه تلقائيًا بناءً على ملفات Markdown. لا يمكنك تحديد فئات العناصر هنا.

خذ بعين الاعتبار المثال التالي ، الذي يعرض ترميزًا يحتوي على مزيج من العناوين والفقرات والصور.

<div class="wrapper">
  <h1>Spacing Elements in CSS</h1>
  <p><!-- content --></p>
  <h2><font color="#3AC1EF">Types of Spacing</font></h2>
  <img src="spacing-1.png" alt="">
  <p><!-- content --></p> 
  <p><!-- content --></p> 
  <h2><font color="#3AC1EF">Use Cases</font></h2>
  <p><!-- content --></p> 
  <h3><font color="#3AC1EF">▍Card Component</font></h3> 
  <img src="use-case-card-2.png" alt="">
</div>

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

h1, h2, h3, h4, h5 {
  margin: 2.75rem 0 1.05rem;
}

h1 {
  margin-top: 0;
}

img {
  margin-bottom: 0.5rem;
}

هنا رسم تخطيطي للصفحة مع نص المقالة.


تخطيط الصفحة وتطبيق خصائص أعلى الهامش وأسفل الهامش

إذا كان العنصر<p>متبوعًا بعنوان ، على سبيل المثال ، عنوانTypes of Spacing،فسيتم تجاهلخاصيةmargin-bottomالعنصر<p>. هذا ، كما يمكنك تخمينه ، نتيجة لانهيار الهوامش الخارجية.

هنا مثال

ind المسافة البادئة الخارجية ، حسب الاقتضاء


نلقي نظرة على التخطيط التالي.


العناصر في حالة طبيعية وفي حالة نفاد مساحة

العناصر لا تبدو جيدة جدًا عندما تكون قريبة جدًا من بعضها البعض. لقد أنشأت هذا التخطيط باستخدام Flexbox. تُسمى هذه التقنية "محاذاة إزاحة المحاذاة". اكتشفت اسمها من هنا .

.element {
    display: flex;
    flex-wrap: wrap;
}

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


العناصر الفرعية موجودة في خطوط جديدة.

هنا تحتاج إلى التعامل مع الوضع المتوسط ​​حيث لا يزال هناك عنصران بجانب بعضهما البعض ، ولكن المسافة بينهما هي صفر. في هذه الحالة ، أفضل اللجوء إلى العقارmargin-right، الذي يمنع العناصر من لمس بعضها البعض ويسرع الاستجابةflex-wrap.


العناصر لا تلمس بعضها البعض

writing وضع كتابة خاصية CSS


أولاً نقتبس MDN : "الخاصية writing-modeتحدد الموضع الأفقي أو الرأسي للنص ، وكذلك اتجاه الكتلة".

هل فكرت يومًا في كيفية عمل المسافات البادئة الخارجية عند استخدامها مع عنصر writing-modeتختلف خصائصه عن المعيار؟ خذ بعين الاعتبار المثال التالي.


بطاقة برأس عمودي. فيما

يلي الأنماط:

.wrapper {
    /*              */
    display: flex;
}

.title {
    writing-mode: vertical-lr;
    margin-right: 16px;
}

يتم تدوير الرأس 90 درجة. يجب أن تكون هناك مسافة فارغة بينه وبين الصورة. كما اتضح ، margin-rightيظهر العقار نفسه بشكل مثالي بقيم مختلفة للعقار writing-mode.

إليك مثال ،

أعتقد أننا غطينا ما يكفي من سيناريوهات المسافة البادئة. الآن فكر في بعض المفاهيم المثيرة للاهتمام.

تغليف المكونات


تحتوي أنظمة التصميم الكبيرة على العديد من المكونات. هل سيكون من المنطقي تعديل هوامشها الخارجية؟

خذ بعين الاعتبار المثال التالي.


أزرار

<button class="button">Save Changes</button>
<button class="button button-outline">Discard</button>

أين أحتاج إلى ضبط المسافة بين الأزرار؟ هل أحتاج إلى تكوين بعض خصائص الزر الأيسر أو الأيمن؟ ربما يمكنك استخدام مزيج من العناصر المجاورة من نفس المستوى؟

.button + .button {
    margin-left: 1rem;
}

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

components استخدام مكونات مجردة


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


مكونات الوالدين والطفل

<div class="list">
    <div class="list__item">
        <button class="button">Save Changes</button>
    </div>
    <div class="list__item">
        <button class="button button-outline">Discard</button>
    </div>
</div>

يرجى ملاحظة أن هناك عناصر مجمعة. كل زر له غلافه الخاص.

.list {
    display: flex;
    align-items: center;
    margin-left: -1rem; /*       */
}

.list__item {
    margin-left: 1rem;
}

هذا كل شئ! علاوة على ذلك ، من السهل تطبيق هذا المفهوم على أي إطار عمل JavaScript. على سبيل المثال:

<List>
  <Button>Save Changes</Button>
  <Button outline>Discard</Button>
</List>

ويجب أن تضع أداة JS المستخدمة كل عنصر في غلافه الخاص.

المكونات المستخدمة كفواصل


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

تخيل أنك في قسم معين من الموقع تحتاج إلى مسافة بادئة خارجية يسرى 24px. في الوقت نفسه ، يتم تقديم المتطلبات التالية إلى المسافة البادئة:

  • لا يجب تكوين المسافة البادئة الخارجية مباشرةً في المكون ، نظرًا لأنها جزء من نظام تصميم تم إنشاؤه بالفعل.
  • يجب أن تكون المسافة البادئة مرنة. في صفحة واحدة يمكن أن يكون لها حجم X، وفي الأخرى - حجم Y.

لقد لاحظت هذه الخدعة لأول مرة أثناء استكشاف تصميم Facebook الجديد .




يستخدم عنصر فاصل تصميم Facebook هنا كعنصر فاصل<div>بنمط مضمنwidth: 16px. الغرض الوحيد منه هو إضافة مسافة فارغة بين العنصر الأيسر وعنصر الحاوية.

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

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

component مشكلات مكون الفاصل


الآن بعد أن تعرفت على فكرة مكونات الفاصل ، دعنا نتحدث عن بعض المشاكل التي من المتوقع أن تحدث عند العمل معها. فيما يلي الأسئلة التي كنت أفكر فيها:

  • كيف يشغل مكون الفاصل مساحة في المكون الرئيسي؟ كيف يتصرف في المخططات الأفقية والرأسية؟ على سبيل المثال ، كيف سيفصل هذا المكون المكونات عموديا وأفقيا؟
  • هل أحتاج إلى تصميم هذه المكونات بناءً على خاصية displayالمكون الأصلي (Flexbox ، Grid)؟

دعونا نفحص هذه الأسئلة.

▍ أحجام مكونات الفاصل


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

يوجد مكون فاصل يقع بين Headerو Section.

<Header />
<Spacer mb={4} />
<Section />

وهنا وضع مختلف قليلاً. هنا ، يتم استخدام الفاصل لإنشاء مسافة قابلة للتعديل تلقائيًا بين الشعار (المكون Logo) ومنطقة التنقل التي تمثلها المكونات Link.

<Flex>
  <Logo />
  <Spacer m="auto" />
  <Link>Beep</Link>
  <Link>Boop</Link>
</Flex>

قد يبدو أن تنفيذ مثل هذا الفاصل باستخدام CSS أمر بسيط للغاية ، وأنه يكفي استخدام التصميم justify-content: space-between. ولكن ماذا لو كنت بحاجة إلى تغيير التصميم؟ في هذه الحالة ، يجب عليك تغيير الشكل.

نلقي نظرة على المثال التالي. هل يبدو هذا الرمز مرنًا؟

<Flex>
  <Logo />
  <Link>Beep</Link>
  <Link>Boop</Link>
  <Spacer m="auto" />
  <Link>Boop</Link>
</Flex>

في هذه الحالة ، يجب تغيير الأسلوب.

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

<Flex>
  <Spacer grow="1" />
</Flex>

▍ استخدام العناصر الزائفة


الفكرة الأخرى التي تتبادر إلى ذهني هي استخدام العناصر الزائفة لإنشاء فواصل.

.element:after {
    content: "";
    display: block;
    height: 32px;
}

ربما لدينا الفرصة لجعل العنصر الزائف فاصلًا ، وليس استخدام عنصر منفصل لهذا؟ على سبيل المثال:

<Header spacer="below" type="pseudo" length="32">
  <Logo />
  <Link>Home</Link>
  <Link>About</Link>
  <Link>Contact</Link>
</Header>

حتى الآن ، لم أستخدم مكونات الفاصل في مشاريعي. لكني أبحث عن سيناريوهات يمكن أن تكون مفيدة لي.

وظائف CSS للرياضيات min () ، max () ، clamp ()


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

تذكر مخططات الشبكة وتحدث عن كيفية استخدام المسافة البادئة الديناميكية فيها.

.wrapper {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    grid-gap: min(2vmax, 32px);
}

البناء min(2vmax, 32px)يعني ما يلي: استخدم مسافة مساوية 2vmaxولكن لا تتجاوز 32px.

→  هنا هو عرض فيديو لمثل هذا التخطيط

→  هنا مثال.

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

ملخص


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

القراء الأعزاء! ما الأدوات التي تستخدمها غالبًا لضبط المسافة بين عناصر صفحة الويب؟


All Articles