مقالات آموزشی

آموزش Container Queries در CSS با مثال و دموی زنده (۱۴۰۵)

Container Queries در CSS: انقلابی در طراحی ریسپانسیو ۲۰۲۵
زمان مطالعه: ۹ دقیقهسطح: متوسطبه‌روز شده در ۱۴۰۵
خلاصه در یک نگاه
  • Container Queries به کامپوننت اجازه می‌دهد بر اساس عرض والد خودش تغییر کند، نه عرض کل صفحه.
  • دو قدم دارد: روی والد container-type: inline-size بگذارید و برای فرزندان از @container استفاده کنید.
  • واحدهای cqi و cqw اندازه‌ها را نسبت به کانتینر تنظیم می‌کنند؛ عالی برای تایپوگرافی کارت‌ها.
  • از سال ۲۰۲۳ در همهٔ مرورگرهای اصلی پشتیبانی می‌شود و امروز با خیال راحت قابل استفاده است.

سال‌ها ریسپانسیو کردن سایت یعنی نوشتن Media Query بر اساس عرض صفحه. اما وقتی یک کارت محصول هم در بدنهٔ اصلی و هم در سایدبار باریک استفاده می‌شود، عرض صفحه به تنهایی کافی نیست. Container Queries دقیقاً همین مشکل را حل می‌کند و به هر کامپوننت اجازه می‌دهد خودش تصمیم بگیرد در فضای موجود چطور نمایش داده شود.

Container Queries در CSS چیست؟

Container Query یک قانون CSS است که استایل یک عنصر را بر اساس اندازهٔ نزدیک‌ترین والدی که به‌عنوان کانتینر تعریف شده تغییر می‌دهد. یعنی به‌جای پرسیدن «صفحه چقدر عرض دارد؟» می‌پرسیم «جایی که این کامپوننت در آن قرار گرفته چقدر عرض دارد؟». نتیجه، کامپوننت‌هایی است که هر جای سایت بگذارید، درست نمایش داده می‌شوند.

نمونهٔ کاربرد Container Queries در CSS برای کارت‌های ریسپانسیو
یک کارت با Container Query، بسته به عرض ستونی که در آن قرار دارد، چیدمان متفاوتی می‌گیرد

تفاوت Container Query و Media Query

مقایسهٔ Media Query و Container Query در CSS
Media Query برای چیدمان کلی صفحه، Container Query برای کامپوننت‌ها

این دو رقیب هم نیستند. Media Query هنوز برای چیدمان کلی صفحه (تعداد ستون‌ها، منوی موبایل، فاصله‌های اصلی) بهترین ابزار است. Container Query برای اجزای داخلی مثل کارت، ویجت، فرم و بنر استفاده می‌شود. اگر با چیدمان‌های مدرن آشنا نیستید، اول آموزش Flexbox و آموزش CSS Grid را ببینید؛ Container Queries در کنار این دو قدرت واقعی‌اش را نشان می‌دهد.

نحوهٔ استفاده از Container Queries در دو قدم

  1. تعریف کانتینر روی والدبه عنصر والد بگویید که کانتینر است. مقدار inline-size یعنی فقط عرض را بررسی کن (در بیشتر موارد همین کافی است).
  2. نوشتن قانون @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

100%
تصویر محصول

کارت محصول طاووس وب

این کارت فقط به عرض کادر خط‌چین نگاه می‌کند، نه عرض صفحه. اسلایدر را حرکت دهید.

افزودن به سبد

زیر ۴۲۰ پیکسل: چیدمان عمودی · ۴۲۰ تا ۶۴۰: دو ستونه · بالای ۶۴۰: سه ستونه. اندازهٔ تیتر هم با واحد 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 درصدی از اندازهٔ کانتینر هستند. بهترین کاربردشان تایپوگرافی و فاصله‌های داخلی کامپوننت است:

cqw و cqh

۱٪ از عرض یا ارتفاع کانتینر.

cqi و cqb

۱٪ از اندازهٔ inline (عرض) یا block (ارتفاع)؛ در سایت‌های فارسی و انگلیسی cqi همان عرض است.

cqmin و cqmax

کوچک‌تر یا بزرگ‌تر بین cqi و cqb.

ترکیب با clamp

برای جلوگیری از خیلی ریز یا درشت شدن متن، همیشه با clamp محدودش کنید.

.card h3 {
  /* حداقل 16px، حداکثر 24px، در این بین 5٪ عرض کانتینر */
  font-size: clamp(1rem, 5cqi, 1.5rem);
}

پشتیبانی مرورگرها از Container Queries

Size Container Queries از سال ۲۰۲۳ در همهٔ مرورگرهای اصلی پشتیبانی می‌شود و جزو ویژگی‌های Baseline است؛ پس برای پروژه‌های امروز بدون نگرانی قابل استفاده است:

مرورگراز نسخه
Chrome و Edge105
Safari (مک و iOS)16
Firefox110
Samsung Internet20

اگر باید از مرورگرهای خیلی قدیمی هم پشتیبانی کنید، استایل پیش‌فرض را طوری بنویسید که بدون 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 یعنی پنج درصد عرض کانتینر و برای تایپوگرافی کشسان کامپوننت‌ها کاربرد دارد.

author-avatar

درباره مهدی حبیبی

مهدی حبیبی، بنیان‌گذار طاووس وب و برنامه‌نویس فرانت‌اند با بیش از ۵ سال تجربه در طراحی سایت و بیش از ۵۰ پروژهٔ انجام‌شده. تخصصش وردپرس، المنتور، ووکامرس، سئو و بهینه‌سازی سرعت است و تجربهٔ پروژه‌های واقعی را در طاووس وب به زبان ساده آموزش می‌دهد. و البته مجنون قهوه!

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *