فارسی

قدرت Container Queries در CSS را برای ایجاد چیدمان‌های واکنش‌گرا و انطباق‌پذیر که به اندازه کانتینر خود واکنش نشان می‌دهند، کشف کنید و طراحی وب را متحول سازید.

چیدمان‌های مدرن CSS: نگاهی عمیق به Container Queries

سال‌هاست که مدیا کوئری‌ها (media queries) سنگ بنای طراحی وب واکنش‌گرا بوده‌اند. آن‌ها به ما اجازه می‌دهند تا چیدمان‌های خود را بر اساس اندازه ویوپورت (viewport) تطبیق دهیم. با این حال، مدیا کوئری‌ها بر اساس ابعاد پنجره مرورگر عمل می‌کنند که گاهی اوقات می‌تواند منجر به موقعیت‌های نامناسبی شود، به‌ویژه هنگام کار با کامپوننت‌های قابل استفاده مجدد. اینجا است که Container Queries وارد می‌شوند – یک ویژگی CSS متحول‌کننده که به کامپوننت‌ها اجازه می‌دهد تا بر اساس اندازه عنصر دربرگیرنده خود، و نه کل ویوپورت، سازگار شوند.

Container Queries چه هستند؟

Container Queries که به طور رسمی توسط اکثر مرورگرهای مدرن پشتیبانی می‌شوند، رویکردی دقیق‌تر و مبتنی بر کامپوننت را برای طراحی واکنش‌گرا فراهم می‌کنند. آن‌ها به کامپوننت‌های منفرد این قدرت را می‌دهند که ظاهر و رفتار خود را بر اساس ابعاد کانتینر والد خود، مستقل از اندازه ویوپورت، تنظیم کنند. این امر انعطاف‌پذیری و قابلیت استفاده مجدد بیشتری را ممکن می‌سازد، به‌ویژه هنگام کار با چیدمان‌های پیچیده و سیستم‌های طراحی.

یک کامپوننت کارت را تصور کنید که بسته به اینکه در یک نوار کناری باریک یا یک ناحیه محتوای اصلی عریض قرار می‌گیرد، باید به شکل متفاوتی نمایش داده شود. با مدیا کوئری‌ها، شما باید به اندازه ویوپورت تکیه کرده و به طور بالقوه قوانین CSS را تکرار کنید. با container queries، کامپوننت کارت می‌تواند به طور هوشمندانه بر اساس فضای موجود در کانتینر خود سازگار شود.

چرا از Container Queries استفاده کنیم؟

در ادامه به بررسی مزایای کلیدی استفاده از Container Queries می‌پردازیم:

شروع کار با Container Queries

استفاده از Container Queries شامل چند مرحله کلیدی است:

  1. تعریف کانتینر: یک عنصر را با استفاده از خاصیت `container-type` به عنوان یک کانتینر مشخص کنید. این کار مرزهایی را که کوئری در آن عمل خواهد کرد، تعیین می‌کند.
  2. تعریف کوئری: شرایط کوئری را با استفاده از at-rule به نام `@container` تعریف کنید. این شبیه به `@media` است، اما به جای خصوصیات ویوپورت، شما خصوصیات کانتینر را کوئری خواهید کرد.
  3. اعمال استایل‌ها: استایل‌هایی را که باید هنگام برآورده شدن شرایط کوئری اعمال شوند، به کار ببرید. این استایل‌ها فقط بر روی عناصر داخل کانتینر تأثیر خواهند گذاشت.

۱. راه‌اندازی کانتینر

قدم اول این است که مشخص کنید کدام عنصر به عنوان کانتینر عمل خواهد کرد. برای این کار می‌توانید از خاصیت `container-type` استفاده کنید. چندین مقدار ممکن وجود دارد:

در اینجا یک مثال آورده شده است:


.card-container {
  container-type: inline-size;
}

در این مثال، عنصر `.card-container` به عنوان یک کانتینر تعیین شده است که اندازه inline (عرض) خود را ردیابی می‌کند.

۲. تعریف کوئری کانتینر

در مرحله بعد، خود کوئری را با استفاده از at-rule به نام `@container` تعریف خواهید کرد. اینجا جایی است که شما شرایطی را که باید برای اعمال استایل‌های داخل کوئری برآورده شوند، مشخص می‌کنید.

در اینجا یک مثال ساده وجود دارد که بررسی می‌کند آیا عرض کانتینر حداقل ۵۰۰ پیکسل است:


@container (min-width: 500px) {
  .card {
    flex-direction: row; /* تغییر چیدمان کارت */
  }
}

در این مثال، اگر عرض عنصر `.card-container` حداقل ۵۰۰ پیکسل باشد، خاصیت `flex-direction` عنصر `.card` به `row` تغییر خواهد کرد.

شما همچنین می‌توانید از `max-width`، `min-height`، `max-height` و حتی ترکیب چندین شرط با استفاده از عملگرهای منطقی مانند `and` و `or` استفاده کنید.


@container (min-width: 300px) and (max-width: 700px) {
  .card-title {
    font-size: 1.2em;
  }
}

این مثال استایل‌ها را فقط زمانی اعمال می‌کند که عرض کانتینر بین ۳۰۰ پیکسل و ۷۰۰ پیکسل باشد.

۳. اعمال استایل‌ها

درون at-rule به نام `@container`، شما می‌توانید هر استایل CSS را که می‌خواهید به عناصر داخل کانتینر اعمال کنید. این استایل‌ها فقط زمانی اعمال می‌شوند که شرایط کوئری برآورده شوند.

در اینجا یک مثال کامل که تمام مراحل را ترکیب می‌کند، آورده شده است:


عنوان محصول

توضیح مختصری از محصول.

بیشتر بدانید

.card-container {
  container-type: inline-size;
  border: 1px solid #ccc;
  padding: 1em;
}

.card {
  display: flex;
  flex-direction: column;
  align-items: center;
}

.card-title {
  font-size: 1.5em;
  margin-bottom: 0.5em;
}

.card-button {
  background-color: #007bff;
  color: white;
  padding: 0.5em 1em;
  text-decoration: none;
  border-radius: 5px;
}

@container (min-width: 500px) {
  .card {
    flex-direction: row;
    align-items: flex-start;
  }

  .card-title {
    font-size: 1.8em;
  }
}

در این مثال، هنگامی که عرض `.card-container` حداقل ۵۰۰ پیکسل باشد، عنصر `.card` به یک چیدمان افقی تغییر می‌کند و اندازه `.card-title` افزایش می‌یابد.

نام‌های کانتینر

شما می‌توانید با استفاده از `container-name: my-card;` به کانتینرها یک نام بدهید. این به شما امکان می‌دهد تا در کوئری‌های خود دقیق‌تر باشید، به‌ویژه اگر کانتینرهای تودرتو داشته باشید.


.card-container {
  container-type: inline-size;
  container-name: my-card;
}

@container my-card (min-width: 500px) {
  /* استایل‌هایی که وقتی کانتینر با نام "my-card" حداقل ۵۰۰ پیکسل عرض داشته باشد اعمال می‌شوند */
}

این امر به ویژه زمانی مفید است که شما چندین کانتینر در یک صفحه دارید و می‌خواهید با کوئری‌های خود یکی از آن‌ها را به طور خاص هدف قرار دهید.

واحدهای کوئری کانتینر

همانند مدیا کوئری‌ها، container queries نیز واحدهای مخصوص به خود را دارند که نسبت به کانتینر هستند. این واحدها عبارتند از:

این واحدها برای تعریف اندازه‌ها و فاصله‌گذاری‌هایی که نسبت به کانتینر هستند مفید می‌باشند و انعطاف‌پذیری چیدمان‌های شما را بیشتر می‌کنند.


.element {
  width: 50cqw;
  font-size: 2cqmin;
}

مثال‌های عملی و موارد استفاده

در اینجا چند مثال از دنیای واقعی آورده شده است که چگونه می‌توانید از Container Queries برای ایجاد کامپوننت‌های انطباق‌پذیرتر و قابل استفاده مجدد استفاده کنید:

۱. منوی ناوبری واکنش‌گرا

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

۲. لیست محصولات انطباقی

یک لیست محصولات تجارت الکترونیک می‌تواند تعداد محصولات نمایش داده شده در هر ردیف را بر اساس عرض کانتینر خود تنظیم کند. در یک کانتینر عریض‌تر، می‌تواند محصولات بیشتری در هر ردیف نمایش دهد، در حالی که در یک کانتینر باریک‌تر، برای جلوگیری از شلوغی، محصولات کمتری را نمایش می‌دهد.

۳. کارت مقاله انعطاف‌پذیر

یک کارت مقاله می‌تواند چیدمان خود را بر اساس فضای موجود تغییر دهد. در یک نوار کناری، ممکن است یک تصویر کوچک و یک توضیح مختصر نمایش دهد، در حالی که در ناحیه محتوای اصلی، می‌تواند یک تصویر بزرگتر و خلاصه‌ای دقیق‌تر را نمایش دهد.

۴. عناصر فرم پویا

عناصر فرم می‌توانند اندازه و چیدمان خود را بر اساس کانتینر تطبیق دهند. به عنوان مثال، یک نوار جستجو ممکن است در هدر وب‌سایت عریض‌تر و در یک نوار کناری باریک‌تر باشد.

۵. ویجت‌های داشبورد

ویجت‌های داشبورد می‌توانند محتوا و نمایش خود را بر اساس اندازه کانتینرشان تنظیم کنند. یک ویجت نمودار ممکن است در یک کانتینر بزرگتر نقاط داده بیشتری و در یک کانتینر کوچکتر نقاط داده کمتری را نشان دهد.

ملاحظات کلی

هنگام استفاده از Container Queries، مهم است که پیامدهای کلی انتخاب‌های طراحی خود را در نظر بگیرید.

پشتیبانی مرورگر و Polyfillها

Container Queries از پشتیبانی خوبی در مرورگرهای مدرن، از جمله کروم، فایرفاکس، سافاری و اج برخوردارند. با این حال، اگر نیاز به پشتیبانی از مرورگرهای قدیمی‌تر دارید، می‌توانید از یک polyfill مانند @container-style/container-query استفاده کنید. این polyfill پشتیبانی از container queries را به مرورگرهایی که به طور بومی از آن پشتیبانی نمی‌کنند، اضافه می‌کند.

قبل از استفاده از Container Queries در یک محیط تولیدی، همیشه ایده خوبی است که پشتیبانی فعلی مرورگرها را بررسی کرده و در صورت لزوم استفاده از یک polyfill را در نظر بگیرید.

بهترین شیوه‌ها

در اینجا چند مورد از بهترین شیوه‌ها برای به خاطر سپردن هنگام کار با Container Queries آورده شده است:

Container Queries در مقابل Media Queries: یک مقایسه

در حالی که هم Container Queries و هم Media Queries برای طراحی واکنش‌گرا استفاده می‌شوند، آنها بر اساس اصول متفاوتی عمل می‌کنند و برای سناریوهای مختلفی مناسب هستند.

ویژگی Container Queries Media Queries
هدف اندازه کانتینر اندازه ویوپورت
محدوده سطح کامپوننت سراسری
قابلیت استفاده مجدد بالا پایین‌تر
دقت (Specificity) دقیق‌تر کمتر دقیق
موارد استفاده تطبیق کامپوننت‌های منفرد با زمینه خود تطبیق چیدمان کلی با اندازه‌های مختلف صفحه نمایش

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

آینده چیدمان‌های CSS

Container Queries گام مهمی رو به جلو در تکامل چیدمان‌های CSS محسوب می‌شوند. با توانمند ساختن کامپوننت‌ها برای تطبیق بر اساس کانتینرشان، آن‌ها کدی انعطاف‌پذیرتر، قابل استفاده مجدد و قابل نگهداری‌تر را ممکن می‌سازند. با بهبود مستمر پشتیبانی مرورگرها، Container Queries آماده‌اند تا به ابزاری ضروری برای توسعه‌دهندگان فرانت‌اند تبدیل شوند.

نتیجه‌گیری

Container Queries یک افزودنی قدرتمند به چشم‌انداز CSS هستند که رویکردی مبتنی بر کامپوننت را برای طراحی واکنش‌گرا ارائه می‌دهند. با درک نحوه عملکرد و نحوه استفاده مؤثر از آنها، می‌توانید اپلیکیشن‌های وب انطباق‌پذیرتر، قابل استفاده مجدد و قابل نگهداری‌تری ایجاد کنید. Container Queries را بپذیرید و سطح جدیدی از انعطاف‌پذیری را در چیدمان‌های CSS خود باز کنید!