المشكلة التي تحلّها
تعلّمت في درس التصميم المتجاوب أن @media تستعلم عن عرض الشاشة. لكن المكوّن نفسه (بطاقة، شريط جانبي) قد يظهر بعرض 300px داخل شريط جانبي، وبعرض 900px داخل عمود رئيسي — على نفس الشاشة، في نفس الصفحة. @media لا ترى هذا الفرق، لأنها تسأل عن الشاشة لا عن مكان العنصر.
استعلامات الحاويات تسأل السؤال الصحيح: "كم عرض الحاوية التي يعيش بداخلها هذا العنصر؟"
الخطوة 1: عيّن عنصرًا كـ"حاوية"
أي عنصر أب يجب أن يُعلَن صراحة كحاوية queries عبر container-type:
.sidebar-slot {
container-type: inline-size; /* استعلم عن العرض فقط — الأكثر استخدامًا */
}
| القيمة | المعنى |
|---|---|
inline-size | يفعّل الاستعلام عن البعد المضمَّن (العرض غالبًا) — الأشيع |
size | يفعّل الاستعلام عن البعدين، لكنه يفرض احتواء الحجم بالكامل |
normal | لا استعلام حجم؛ يسمح فقط باستعلامات الاسم/النمط |
الخطوة 2: استعلم بـ @container
@container (width > 400px) {
.card { display: flex; gap: 16px; }
}
@container (width <= 400px) {
.card { display: block; }
}
الآن .card يتغيّر حسب عرض الحاوية .sidebar-slot، بغضّ النظر عن عرض الشاشة نفسها — نفس المكوّن يتصرّف بذكاء في أي مكان تضعه فيه.
تسمية الحاويات (لتفادي التداخل)
عند وجود حاويات متداخلة، سمِّ الحاوية المقصودة صراحة عبر container-name أو اختصار container:
.sidebar-slot {
container: sidebar / inline-size; /* الاسم / النوع */
}
@container sidebar (width > 400px) {
.card { flex-direction: row; }
}
وحدات قياس نسبية للحاوية
مثل vw/vh للشاشة، توجد وحدات مكافئة بالنسبة للحاوية:
.card h2 {
font-size: clamp(1rem, 5cqi, 2rem);
/* 5cqi = 5% من عرض الحاوية (inline) */
}
| الوحدة | تعني |
|---|---|
cqw | 1% من عرض الحاوية |
cqh | 1% من ارتفاع الحاوية |
cqi | 1% من البعد المضمَّن (inline) للحاوية |
cqb | 1% من البعد الكتلي (block) للحاوية |
Media Queries مقابل Container Queries
@media | @container | |
|---|---|---|
| تستعلم عن | الشاشة/نافذة المتصفح | حاوية أب محدَّدة |
| المكوّن يتصرّف | نفس الشكل أينما وُضع | يتكيّف حسب مكانه |
| يحتاج تفعيلًا | لا، يعمل دائمًا | نعم، container-type على الأب |
🔑 لا تُلغي
@media— الاثنان يتكاملان:@mediaلتخطيط الصفحة العام (هل نعرض الشريط الجانبي أصلًا؟)، و@containerلسلوك المكوّن الداخلي أينما ظهر.
الأخطاء الشائعة
- ❌ توقّع عمل
@containerبلاcontainer-typeعلى أب → الاستعلام يُتجاهَل بصمت. - ❌ الاستعلام عن عرض الحاوية نفسها من داخلها → يجب أن يكون الاستعلام على أب العنصر المتأثر، لا العنصر ذاته.
- ❌ استخدام
container-type: sizeحين تحتاجinline-sizeفقط → يفرض احتواءً غير ضروري وقد يكسر التخطيط الطبيعي بالبعد الآخر.
خلاصة
container-type: inline-size على الحاوية الأب + @container (width > Npx) على أبنائها = مكوّنات تتكيّف حسب مكانها الفعلي، لا حسب عرض الشاشة فقط. أضف وحدات cqw/cqi لقياسات نسبية للحاوية نفسها.