CSS
تصميم المواقع

CSS الحديث لتصميم مواقع احترافية: Grid وFlexbox وResponsive Design

دليل عملي لتصميم واجهات ويب حديثة ومتجاوبة باستخدام CSS Grid وFlexbox وMedia Queries وتحسين قابلية الاستخدام على الهاتف.

ابدأ من المحتوى لا من حجم الشاشة

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

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

:root {
  --space-1: .5rem;
  --space-2: 1rem;
  --space-3: 1.5rem;
  --content-width: 72rem;
  --text-color: #202938;
}
.page {
  width: min(100% - 2rem, var(--content-width));
  margin-inline: auto;
}

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

متى تختار Flexbox ومتى تختار Grid؟

يعمل Flexbox على محور أساسي واحد في كل مرة؛ لذلك يناسب صف أزرار، أو مجموعة عناصر تنقل، أو رأس بطاقة يحتوي عنوانًا وشارة. تستطيع تغيير اتجاهه باستخدام flex-direction، والتحكم في توزيع المساحة بواسطة justify-content ومحاذاة المحور الآخر بواسطة align-items. تذكّر أن gap غالبًا أوضح من إضافة هوامش متفرقة لكل عنصر.

.toolbar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: .75rem;
}

أما Grid فيناسب تخطيط الصفوف والأعمدة معًا، مثل شبكة مقالات أو لوحة منتجات. عندما تريد عدد أعمدة يتغير تلقائيًا بحسب المساحة، جرّب auto-fit مع minmax() بدل كتابة نقطة تحول لكل عرض محتمل:

.article-grid {
  display: grid;
  grid-template-columns:
    repeat(auto-fit, minmax(min(100%, 17rem), 1fr));
  gap: 1.25rem;
}
.article-card {
  min-width: 0;
  overflow-wrap: anywhere;
}

تمنع min(100%, 17rem) العمود من تجاوز الحاوية الضيقة، بينما تسمح minmax() للأعمدة بالتمدد عند توفر المساحة. أضف min-width: 0 إلى عناصر الشبكة عندما تتسبب الكلمات الطويلة أو عناصر المحتوى في تمدد العمود خارج حدوده.

نقاط التحول تُبنى حول المحتوى

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

.feature {
  display: grid;
  grid-template-columns: 1fr;
  gap: 1rem;
}
@media (min-width: 48rem) {
  .feature {
    grid-template-columns: minmax(0, 1fr) minmax(15rem, .8fr);
    align-items: center;
  }
}

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

الصور والنصوص والمحتوى غير المتوقع

يجب ألا تفترض أن جميع الصور لها نسبة أبعاد واحدة أو أن كل عنوان يتكون من سطرين. استخدم max-width: 100% للصور، وحدد height: auto عند الحفاظ على أبعادها الأصلية. إذا كانت البطاقات تتطلب صورًا موحدة الارتفاع، فاختر aspect-ratio وobject-fit: cover مع نص بديل يصف المعنى عند الحاجة، لا مجرد كلمة عامة مثل «صورة».

.card__image {
  display: block;
  width: 100%;
  aspect-ratio: 16 / 9;
  object-fit: cover;
}
.card__title {
  overflow-wrap: anywhere;
}

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

الحركة والتباين وإمكانية الوصول

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

a:focus-visible,
button:focus-visible {
  outline: 3px solid #2563eb;
  outline-offset: 3px;
}
@media (prefers-reduced-motion: reduce) {
  *,
  *::before,
  *::after {
    scroll-behavior: auto !important;
    animation-duration: .01ms !important;
    transition-duration: .01ms !important;
  }
}

استخدم الحركة لتوضيح علاقة أو نتيجة، لا لإضافة ضوضاء بصرية. احترم إعداد prefers-reduced-motion، وتجنب تحريك مساحات كبيرة باستمرار، ولا تجعل معلومات مهمة متاحة فقط عند المرور بالفأرة لأن مستخدمي اللمس ولوحة المفاتيح قد لا يصلون إليها بالطريقة نفسها.

الأداء والصيانة

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

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

قائمة اختبار قبل النشر

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

استخدم دليل التصميم المتجاوب من MDN، وراجع Flexbox وCSS Grid عند اختيار أداة التخطيط. التصميم الجيد نتيجة قرارات قابلة للاختبار، وليس مجموعة حيل بصرية.

ترتيب القواعد والتدرج في التحسين

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

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

.profile {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: 1rem;
}
@supports (display: grid) {
  .profile {
    align-items: start;
  }
}
@media (min-width: 44rem) {
  .profile {
    grid-template-columns: 12rem minmax(0, 1fr);
  }
}

لا تحتاج إلى استخدام @supports لكل خاصية؛ استخدمه عندما توجد خطة بديلة فعلية لميزة قد لا تتوفر. أما الميزات الأساسية في التصميم، فراجع دعمها المستهدف واختبر السلوك في المتصفحات المهمة للموقع.

اختبار واقعي بدل الاكتفاء بالمعاينة

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

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

إدارة المسافات والتصميم المتسق

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

:root {
  --space-xs: .375rem;
  --space-sm: .75rem;
  --space-md: 1rem;
  --space-lg: 1.5rem;
  --space-xl: 2.5rem;
}
.section {
  padding-block: var(--space-xl);
}
.section__heading {
  margin-block: 0 var(--space-lg);
}

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

كيف تقيس نجاح التحسين؟

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

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

تسليم العمل ومراجعته

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

قاعدة مختصرة لاتخاذ القرار

إذا كنت ترتب عناصر في اتجاه واحد فابدأ بـ Flexbox، وإذا كنت تنظم صفوفًا وأعمدة فجرّب Grid، وإذا كان المكوّن يتغير بحسب المساحة التي يحصل عليها داخل الصفحة ففكّر في Container Queries. بعد ذلك اختبر المحتوى الحقيقي، ثم أضف media query فقط عندما تتطلب بنية الصفحة ذلك. هذا الترتيب يبقي CSS مفهومًا ويقلل عدد القواعد التي تحتاج إلى صيانة.

مصادر موثوقة

كلمات مفتاحية:CSSCSS GridFlexboxResponsive Designتصميم مواقع متجاوبة

مثال شبكة متجاوبة

.card-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 16rem), 1fr));
  gap: 1rem;
}
.card { min-width: 0; overflow-wrap: anywhere; }

اختر Flexbox للتخطيط على محور واحد مثل صف الأزرار، وGrid عندما تحتاج إلى صفوف وأعمدة. اختبر 320 و375 و768 بكسل، والتكبير إلى 200%، وحالة التركيز بلوحة المفاتيح، وتباين النص. لا تجعل عدد الأعمدة ثابتًا إذا كانت مساحة الشاشة تتغير.

راجع دليل التصميم المتجاوب في MDN، ثم اختبر التخطيط بمحتوى طويل وصور متفاوتة الأبعاد قبل نشره.

اختبر التخطيط عند نقاط الانكسار الحقيقية

لا تختَر نقاط media query بحسب أسماء الأجهزة؛ راقب متى يصبح المحتوى ضيقًا أو تبدأ العناصر في التداخل. استخدم Grid لتقسيم المساحة ثنائية الأبعاد، وFlexbox لتوزيع العناصر في محور واحد، ثم أضف قيودًا مثل minmax() وmin() وmax() لتقليل الحاجة إلى قيم ثابتة.

.cards {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 16rem), 1fr));
  gap: 1rem;
}
.card { min-width: 0; }
img { max-width: 100%; height: auto; }

اختبر نصوصًا طويلة وأزرارًا متعددة وصورًا بأبعاد مختلفة. لا تجعل التخطيط يعتمد على ارتفاع ثابت عندما يمكن أن يختلف طول المحتوى بين اللغات والأجهزة.

الخلاصة

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

الكاتب: عماد الدين لمراني

اقرأ أيضًا