التصميم المتجاوب
نجعل الصفحة تعمل على الجوال والحاسوب معًا، كما رسمناها في المخطط. ⏱ نحو 25 دقيقة.
- تضيف سطر
viewportوتعرف وظيفته. - تستخدم الوحدات المرنة و
max-width. - تكتب استعلامات الوسائط بطريقة «الجوال أولًا».
- تختبر الصفحة بعرض الجوال في أدوات المتصفح.
١صفحة واحدة لكل الشاشات
أكثر من نصف زوار المواقع يستخدمون الجوال. التصميم المتجاوب يعني أن الصفحة نفسها تعيد ترتيب نفسها حسب عرض الشاشة، كما رسمناه في الدرس 6. نحتاج ثلاثة أشياء:
- سطر viewport في head.
- وحدات مرنة بدل الأعرض الثابتة.
- استعلامات الوسائط Media Queries: قواعد تعمل عند عرض معيّن فقط.
٢سطر viewport
بدونه يعرض الجوال الصفحة وكأنها شاشة حاسوب مصغّرة، فيصغر الخط جدًّا. ضعه في head كل صفحة:
<meta name="viewport" content="width=device-width, initial-scale=1">معناه: «اجعل عرض الصفحة بعرض الجهاز، ولا تصغّرها». اختصار VS Code ( ! ثم Enter ) يكتبه لك تلقائيًّا.
٣وحدات مرنة
<div class="wrap"> <img src="images/coffee.svg" alt="قهوة"> <p>الصورة لا تخرج عن الحاوية أبدًا.</p></div>
.wrap { width: 90%; max-width: 600px; margin: 0 auto;}img { max-width: 100%; height: auto;}
| القاعدة | لماذا؟ |
|---|---|
width: 90% بدل width: 900px | النسبة تتبع عرض الشاشة، والرقم الثابت يخرج عن الجوال. |
max-width: 600px | لا تتجاوز 600 في الشاشات الكبيرة حتى لا تطول الأسطر. |
img { max-width: 100%; } | الصورة لا تتجاوز عرض حاويتها أبدًا. |
rem | للخطوط والمسافات، تتبع إعداد حجم الخط عند الزائر. |
٤استعلامات الوسائط
@media قاعدة شرطية: «إذا كان عرض الشاشة كذا، فطبّق هذه القواعد». نكتب للجوال أولًا، ثم نضيف للشاشة الكبيرة:
<div class="cards"> <div class="card">بايثون</div> <div class="card">الويب</div> <div class="card">قواعد البيانات</div></div>
/* الجوال أولًا: عمود واحد */.cards { display: flex; flex-direction: column; gap: 10px;}.card { background: #DCE8FA; padding: 20px; border-radius: 8px;} /* من 600 بكسل فأكثر: صف واحد */@media (min-width: 600px) { .cards { flex-direction: row; } .card { flex: 1; }}
جرّب: اضغط «✏️ جرّب وعدّل» ثم زر 📱 لترى المعاينة بعرض الجوال، و 💻 لعرض الحاسوب. البطاقات تنتقل من عمود إلى صف.
| الشرط | معناه |
|---|---|
@media (min-width: 600px) | العرض 600 فأكثر (الأجهزة اللوحية والحاسوب). نستخدمه مع «الجوال أولًا». |
@media (max-width: 599px) | العرض 599 فأقل (الجوال). |
٥اختبر صفحتك على الجوال
- في Chrome اضغط F12، ثم أيقونة الجوال 📱
(Toggle device toolbar)أو Ctrl+Shift+M. - اختر جهازًا من القائمة أعلى الصفحة (مثل iPhone)، أو اسحب الحافة لتغيير العرض.
- تأكد: لا يوجد تمرير أفقي، والخط مقروء، والأزرار كبيرة بما يكفي للإصبع.
- وأفضل اختبار: افتح الموقع على جوالك الحقيقي.
توقّع وتحقّق
ما وظيفة سطر viewport؟
width=device-width.قاعدة تعمل في الشاشات من 768 فأكثر:
min = فأكثر.كيف نمنع الصورة من الخروج عن الشاشة؟
في «الجوال أولًا» نكتب أولًا:
الخلاصة
viewportيجعل الصفحة بعرض الجهاز.- النسب و
max-widthبدل الأعرض الثابتة، وimg{max-width: 100%; }. - @
media(min-width: …) قواعد للشاشات الأكبر بعد قواعد الجوال. F12ثم أيقونة الجوال لاختبار العرض.
تحدٍّ برمجي: صفحة الدورات المتجاوبة
متقدماجعل صفحة الدورات متجاوبة: عمود واحد في الجوال، وصف من ثلاث بطاقات من 700 بكسل فأكثر. جرّب بزري 📱 و 💻 فوق المعاينة.
- سطر viewport في head.
- الصورة .banner لا تتجاوز عرض الحاوية
(max-width: 100%). - البطاقات .course عمود واحد افتراضيًّا (للجوال).
- استعلام @
media (min-width: 700px)يجعل .courses صفًّا.
👀 اعرض شكل الناتج المطلوب
- سطر viewport في head.
- الصورة لا تتجاوز عرض الحاوية.
- عمود واحد افتراضيًّا (خارج @media).
- @
media (min-width: 700px)يجعل .courses صفًّا.
💡 تلميح 1
flex-direction: column; }💡 تلميح 2
media (min-width: 700px) { .courses { flex-direction: row; } }حاول بنفسك أولًا؛ للمسألة أكثر من حلّ صحيح.
<!DOCTYPE html><html lang="ar" dir="rtl"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>الدورات</title> <link rel="stylesheet" href="style.css"></head><body> <img class="banner" src="images/team.svg" alt="فريق المدربين" width="900"> <div class="courses"> <div class="course">بايثون</div> <div class="course">تطوير الويب</div> <div class="course">قواعد البيانات</div> </div></body></html>
.banner { max-width: 100%; height: auto;}.courses { display: flex; flex-direction: column; gap: 10px;}.course { background: #DCE8FA; padding: 24px; border-radius: 8px;}@media (min-width: 700px) { .courses { flex-direction: row; } .course { flex: 1; }}