آموزش طراحی سایت و برنامهنویسی وب
آموزش Container Queries در CSS با مثال و دموی زنده (۱۴۰۵)
- Container Queries به کامپوننت اجازه میدهد بر اساس عرض والد خودش تغییر کند، نه عرض کل صفحه.
- دو قدم دارد: روی والد
container-type: inline-sizeبگذارید و برای فرزندان از@containerاستفاده کنید. - واحدهای
cqiوcqwاندازهها را نسبت به کانتینر تنظیم میکنند؛ عالی برای تایپوگرافی کارتها. - از سال ۲۰۲۳ در همهٔ مرورگرهای اصلی پشتیبانی میشود و امروز با خیال راحت قابل استفاده است.
سالها ریسپانسیو کردن سایت یعنی نوشتن Media Query بر اساس عرض صفحه. اما وقتی یک کارت محصول هم در بدنهٔ اصلی و هم در سایدبار باریک استفاده میشود، عرض صفحه به تنهایی کافی نیست. Container Queries دقیقاً همین مشکل را حل میکند و به هر کامپوننت اجازه میدهد خودش تصمیم بگیرد در فضای موجود چطور نمایش داده شود.
Container Queries در CSS چیست؟
Container Query یک قانون CSS است که استایل یک عنصر را بر اساس اندازهٔ نزدیکترین والدی که بهعنوان کانتینر تعریف شده تغییر میدهد. یعنی بهجای پرسیدن «صفحه چقدر عرض دارد؟» میپرسیم «جایی که این کامپوننت در آن قرار گرفته چقدر عرض دارد؟». نتیجه، کامپوننتهایی است که هر جای سایت بگذارید، درست نمایش داده میشوند.

تفاوت Container Query و Media Query

این دو رقیب هم نیستند. Media Query هنوز برای چیدمان کلی صفحه (تعداد ستونها، منوی موبایل، فاصلههای اصلی) بهترین ابزار است. Container Query برای اجزای داخلی مثل کارت، ویجت، فرم و بنر استفاده میشود. اگر با چیدمانهای مدرن آشنا نیستید، اول آموزش Flexbox و آموزش CSS Grid را ببینید؛ Container Queries در کنار این دو قدرت واقعیاش را نشان میدهد.
نحوهٔ استفاده از Container Queries در دو قدم
- تعریف کانتینر روی والدبه عنصر والد بگویید که کانتینر است. مقدار
inline-sizeیعنی فقط عرض را بررسی کن (در بیشتر موارد همین کافی است). - نوشتن قانون @container برای فرزندانمثل Media Query شرط بنویسید، با این تفاوت که شرط به عرض والد برمیگردد.
/* قدم ۱: والد را کانتینر کنید */
.card-container {
container-type: inline-size;
}
/* حالت پیشفرض (کانتینر باریک): عمودی */
.card {
display: grid;
gap: 12px;
}
/* قدم ۲: وقتی کانتینر حداقل 420px عرض داشت، افقی شو */
@container (min-width: 420px) {
.card {
grid-template-columns: 40% 1fr;
align-items: center;
}
}نکته: کانتینر نمیتواند خودش را استایل کند؛ قانون @container همیشه روی فرزندان کانتینر اعمال میشود. به همین دلیل معمولاً یک wrapper دور کامپوننت میگذاریم.
دموی زنده: عرض کانتینر را تغییر دهید
کارت ریسپانسیو با Container Query
کارت محصول طاووس وب
این کارت فقط به عرض کادر خطچین نگاه میکند، نه عرض صفحه. اسلایدر را حرکت دهید.
زیر ۴۲۰ پیکسل: چیدمان عمودی · ۴۲۰ تا ۶۴۰: دو ستونه · بالای ۶۴۰: سه ستونه. اندازهٔ تیتر هم با واحد cqi تغییر میکند.
نامگذاری کانتینر با container-name
وقتی کانتینرها تو در تو هستند، @container به نزدیکترین کانتینر والد نگاه میکند. اگر بخواهید شرط را به یک کانتینر مشخص وصل کنید، به آن نام بدهید. خاصیت کوتاه container نام و نوع را با هم میگیرد:
.sidebar {
container: sidebar / inline-size;
/* معادل:
container-name: sidebar;
container-type: inline-size; */
}
@container sidebar (max-width: 300px) {
.widget-title { font-size: 1rem; }
.widget-thumb { display: none; }
}| مقدار container-type | چه چیزی بررسی میشود | کاربرد |
|---|---|---|
inline-size | فقط عرض | رایجترین حالت؛ برای تقریباً همهٔ کامپوننتها |
size | عرض و ارتفاع | فقط وقتی کانتینر ارتفاع مشخص دارد |
normal | هیچکدام (پیشفرض) | برای Style Queries بدون محدودیت اندازه |
واحدهای Container Query: cqw، cqh، cqi و...
همانطور که vw درصدی از عرض صفحه است، واحدهای cq درصدی از اندازهٔ کانتینر هستند. بهترین کاربردشان تایپوگرافی و فاصلههای داخلی کامپوننت است:
۱٪ از عرض یا ارتفاع کانتینر.
۱٪ از اندازهٔ inline (عرض) یا block (ارتفاع)؛ در سایتهای فارسی و انگلیسی cqi همان عرض است.
کوچکتر یا بزرگتر بین cqi و cqb.
برای جلوگیری از خیلی ریز یا درشت شدن متن، همیشه با clamp محدودش کنید.
.card h3 {
/* حداقل 16px، حداکثر 24px، در این بین 5٪ عرض کانتینر */
font-size: clamp(1rem, 5cqi, 1.5rem);
}پشتیبانی مرورگرها از Container Queries
Size Container Queries از سال ۲۰۲۳ در همهٔ مرورگرهای اصلی پشتیبانی میشود و جزو ویژگیهای Baseline است؛ پس برای پروژههای امروز بدون نگرانی قابل استفاده است:
| مرورگر | از نسخه |
|---|---|
| Chrome و Edge | 105 |
| Safari (مک و iOS) | 16 |
| Firefox | 110 |
| Samsung Internet | 20 |
اگر باید از مرورگرهای خیلی قدیمی هم پشتیبانی کنید، استایل پیشفرض را طوری بنویسید که بدون Container Query هم قابل قبول باشد (مثلاً چیدمان عمودی) و حالتهای پیشرفته را داخل @container بگذارید. این همان رویکرد progressive enhancement است. قابلیت جدیدتر Style Queries (مثل @container style(--theme: dark)) هنوز در همهٔ مرورگرها کامل نیست و بهتر است فعلاً فقط بهعنوان بهبود اختیاری از آن استفاده کنید.
اشتباهات رایج در استفاده از Container Queries
چکلیست رفع اشکال
اگر @container شما کار نمیکند، این موارد را بررسی کنید:
مراقب باشید: container-type: inline-size باعث میشود عرض کانتینر دیگر به محتوای داخلش وابسته نباشد. اگر کانتینر یک آیتم flex با عرض خودکار باشد، ممکن است ناگهان به عرض صفر جمع شود. در این حالت به آن flex: 1 یا یک عرض مشخص بدهید.
سایتی میخواهید که روی همهٔ دستگاهها بینقص باشد؟طاووس وب سایتها را با CSS مدرن، سرعت بالا و طراحی ریسپانسیو واقعی میسازد. مشاورهٔ اولیه رایگان است.
مشاهدهٔ خدمات طراحی سایتسؤالات متداول Container Queries
Container Queries جایگزین Media Queries میشود؟
خیر. Media Query برای چیدمان کلی صفحه بر اساس عرض صفحه همچنان لازم است و Container Query برای کامپوننتهایی که باید بر اساس فضای والد خود تغییر کنند استفاده میشود. در پروژههای مدرن هر دو را کنار هم به کار میبریم.
چرا @container من کار نمیکند؟
رایجترین دلیل این است که container-type روی والد تعریف نشده یا روی خود عنصری تعریف شده که میخواهید استایلش تغییر کند. کانتینر فقط فرزندانش را کنترل میکند.
تفاوت inline-size و size در container-type چیست؟
inline-size فقط عرض کانتینر را بررسی میکند و در بیشتر موارد کافی است. size عرض و ارتفاع را بررسی میکند و فقط وقتی مناسب است که کانتینر ارتفاع مشخصی داشته باشد.
آیا استفاده از Container Queries روی سرعت سایت اثر منفی دارد؟
در استفادهٔ معمول خیر. مرورگرها این قابلیت را بهینه اجرا میکنند و چون نیاز به جاوااسکریپت برای تشخیص اندازه را حذف میکند، اغلب سبکتر از راهحلهای قدیمی است.
واحد cqi چیست؟
cqi برابر یک درصد از اندازهٔ inline کانتینر است که در سایتهای افقی همان عرض است. مثلاً 5cqi یعنی پنج درصد عرض کانتینر و برای تایپوگرافی کشسان کامپوننتها کاربرد دارد.