חיפוש

CSS Container Queries – מדריך מלא עם דוגמאות אינטראקטיביות

תארו לכם את הסיטואציה הבאה: בניתם קומפוננטה כלשהי, סוג של כרטיס מוצר למשל. הוא נראה מושלם באזור התוכן הראשי – תמונה בצד, פרטים לידה, מרווח ונעים.

ואז המעצב שלכם זורק את אותו כרטיס לתוך סיידבר של 280px, ואותו רכיב מתפרק. טקסט גולש, התמונה נמעכת, הכל נראה כמו תאונת דרכים.

אתם פונים ל-Media Query. אבל רגע – הסיידבר צר גם בדסקטופ, לא רק בנייד. ה-@media (max-width: 768px) שלכם נכנס לפעולה במכשירים ניידים כמובן, אבל הכרטיס בסיידבר עדיין שבור ברזולוציה של 1440px מכיוון ש-Media Queries לא יודעים היכן הרכיב שלכם ממוקם. הם מכירים רק את ה-viewport.

זו בדיוק הבעיה בשבילה Container Queries נוצרו. גררו את הסליידר ותראו בעצמכם:

The Problem (and the Fix)
Container Width 830px
Without Container Queries
Product
Same Card
Always stacked. No idea how much space it has.
With Container Queries
Product
Same Card
Adapts its layout to the available space.

אני משתמש ב Container Queries כבר בערך שנה והם שינו את הדרך בה אני חושב על עיצוב רכיבים. במקום לשאול "כמה רחב המסך?", ה-CSS שלכם שואל "כמה רחב הקונטיינר שלי?" – והבדל קטן זה משמעותי יותר ממה שאתם חושבים…

מה זה Container Queries?

Container Queries מאפשרים לכם להחיל סגנונות CSS על אלמנט בהתבסס על גודל הקונטיינר שלו (אלמנט האב), ולא על ה-viewport של הדפדפן.

הקונספט מבוסס על CSS containment. אתם מסמנים אלמנט כ"קונטיינר", ואז כותבים סגנונות מותנים שנכנסים לפעולה כשאותו קונטיינר מגיע לממדים מסוימים.

התוצאה היא רכיבים שניתן להזיז כרצוננו ממקום למקום. אלמנטים מסוגים שונים, כגון תפריט ניווט, או ווידג'ט כזה או אחר יכולים להתאים את ה-layout שלהם בהתאם לשטח שהם מקבלים. גודל המסך הופך לכמעט ולא רלוונטי במקרה זה.

Container Queries מול Media Queries

ההבדל מסתכם במה שכל אחד מהם מגיב אליו.

Media QueriesContainer Queries
מגיב לViewport / מכשירקונטיינר הורה
טווחגלובלי (כל הדף)מקומי (רכיב)
שימוש חוזרBreakpoints נשברים כשהרכיב זזאותו רכיב עובד בכל מקום
מתאים לLayout של דף, העדפות משתמשרספונסיביות ברמת הרכיב

Media Queries שואלים "כמה גדול המסך?" Container Queries שואלים "כמה מקום ההורה שלי נותן לי?" כרטיס בסיידבר של 300px ואותו כרטיס באזור תוכן ראשי של 900px מקבלים סגנונות שונים באופן אוטומטי.

Media Queries ו Container Queries משלימים אחד את השני. השתמשו ב-Media Queries ל-layout ברמת המקרו (גריד של דף, אסטרטגיית ניווט) וב-Container Queries ל-layout ברמת המיקרו, ברמת רכיב (איך רכיבים בודדים מתאימים את עצמם פנימית).

איך Container Queries עובדים

הגדרת Container Queries דורשת שני שלבים: הגדרת קונטיינר, ואז שאילתה עליו.

שלב 1: הגדרת קונטיינר

השתמשו במאפיין container-type בכדי לסמן אלמנט כקונטיינר:

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

המאפיין container-type מקבל את הערכים הבאים:

  • inline-size – מאפשר שאילתות על ציר ה-inline (רוחב במצבי כתיבה אופקיים). במאפיין זה תשתמשו ברוב המקרים.
  • size – מאפשר שאילתות על שני הצירים. דורש שלקונטיינר יהיה גובה (height) מפורש.
  • normal – ברירת המחדל. לא גודל הקונטיינר, אבל עדיין עובד כקונטיינר style query.

אתם יכולים גם לתת לקונטיינר שם עם container-name:

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

או להשתמש בקיצור container (קודם השם, ולאחר מכן סוג):

.card-wrapper {
    container: card / inline-size;
}

שלב 2: שאילתה על הקונטיינר

השתמשו ב-@container בכדי לכתוב סגנונות מותנים. הסגנונות האלה חלים על הצאצאים של הקונטיינר כשהתנאי מתקיים:

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

אתם יכולים גם להשתמש בתחביר range מודרני, הוא קריא יותר:

@container (width > 500px) {
    .card {
        flex-direction: row;
    }
}

@container (300px < width < 600px) {
    .card {
        font-size: 0.9em;
    }
}

בכדי לכוון לקונטיינר ספציפי עם שם:

@container card (width > 500px) {
    .card {
        flex-direction: row;
    }
}

בלי שם, ה @container מכוון לאב הקרוב ביותר עם containment context. מתן שם לקונטיינרים שלכם מונע התנהגות לא צפויה ככל שעץ הרכיבים שלכם גדל.

דוגמאות חיות

גררו את הסליידרים למטה בכדי לשנות את גודל כל קונטיינר ולראות את הרכיבים מתאימים את עצמם בזמן אמת.

רכיב כרטיס רספונסיבי

הכרטיס הזה עובר בין layout אנכי (מוערם) ל-layout אופקי (זה לצד זה) בהתאם לרוחב הקונטיינר שלו. ה-breakpoint הוא ב-420px.

Responsive Card
Container Width 460px
Featured
Container Queries
Components that adapt to their available space, not the viewport.

ניווט סיידבר אדפטיבי

הניווט הזה מציג רק אייקונים כשהוא צר ומתרחב להציג תוויות כשהקונטיינר רחב מספיק. אותו רכיב עובד בסיידבר מכווץ של 60px או בסיידבר מלא של 240px – בלי breakpoints של viewport.

Adaptive Navigation
Sidebar Width 180px

ווידג'ט דשבורד

ווידג'ט סטטיסטיקות שמציג layout קומפקטי (מספר בלבד) בקונטיינרים קטנים ומתרחב לכלול מיני גרף עמודות כשיש מספיק מקום.

Dashboard Widget
Widget Width 320px
Revenue +12%
$48,250

יחידות אורך של Container Queries

Container Queries מציגים גם סט של יחידות אורך יחסיות לממדי הקונטיינר, בדומה ליחידות viewport אבל בטווח מקומי:

יחידהמשמעותמקבילה ב-Viewport
cqw1% מרוחב הקונטיינרvw
cqh1% מגובה הקונטיינרvh
cqi1% מגודל ה-inline של הקונטיינרvi
cqb1% מגודל ה-block של הקונטיינרvb
cqminהקטן מבין cqi ו-cqbvmin
cqmaxהגדול מבין cqi ו-cqbvmax

היחידות האלה שימושיות לטיפוגרפיה ו-spacing דינמיים שמתאימים את עצמם לקונטיינר:

.card-title {
    font-size: clamp(14px, 10px + 1.5cqi, 22px);
    padding: clamp(0.5rem, 5cqi, 1.5rem);
}

אם לא קיים קונטיינר מתאים ב ancestor tree, היחידות האלה חוזרות ליחידות ה-viewport הקטנות המקבילות.

מלכודות ומגבלות

ל-Container Queries יש כמה ״מלכודות״ שמפתחי CSS בתחילת דרכם נוטים ליפול בהן:

קונטיינרים לא יכולים לעצב את עצמם. אתם יכולים לעצב רק צאצאים בתוך ה @container. אלמנט הקונטיינר עצמו מחוץ לתחום.

קונטיינרים חייבים לקבל את הגודל שלהם מבחוץ. הגדרת container-type: inline-size יוצרת size containment. כלומר הרוחב של הקונטיינר מחושב תוך התעלמות מהילדים שלו. הקונטיינר צריך לקבל את הגודל שלו מהקשר ה-layout – תא של CSS Grid, הורה Flexbox, או רוחב מפורש.

אי אפשר להשתמש ב-var() בתנאי השאילתה. זה למשל לא יעבוד:

/* This is invalid and will be ignored */
@container (min-width: var(--breakpoint)) {
    .card { flex-direction: row; }
}

container-type: size דורש גובה מפורש. אם אתם צריכים לבצע שאילתה על הרוחב והגובה יחדיו, אז לקונטיינר חייב להיות גובה מפורש. ברוב המקרים, inline-size זה כל מה שאתם צריכים.

הימנעו מלהפוך את <html> או <body> לקונטיינרים. החלת container-type על אלמנטי שורש יכולה לגרום להתנהגות layout לא צפויה. השתמשו באלמנטים סמנטיים כמו <main>, <aside>, או div-ים עוטפים במקום.

תמיכת דפדפנים

ל-Container size queries יש תמיכת דפדפנים מצוינת נכון ל-2026:

דפדפןנתמך מאז
Chrome106+ (ספטמבר 2022)
Edge106+ (ספטמבר 2022)
Firefox110+ (פברואר 2023)
Safari16.0+ (ספטמבר 2022)
Safari iOS16.0+

ל-Container size queries יש בערך 96% תמיכה גלובלית והם נחשבים מוכנים לפרודקשן. אין צורך ב-polyfill לפרויקטים מודרניים.

שאלות נפוצות

שאלות נפוצות על CSS Container Queries:

האם Container Queries מחליפים Media Queries?
לא. Container Queries ו-Media Queries משרתים מטרות שונות. השתמשו ב-Media Queries להחלטות layout ברמת הדף ולהעדפות משתמש כמו prefers-color-scheme או prefers-reduced-motion. השתמשו ב-Container Queries לרספונסיביות ברמת הרכיב, כשאלמנטים צריכים להתאים את עצמם לשטח הזמין.
אפשר לקנן Container Queries?
כן. אתם יכולים לקנן כללי @container. שאילתה מקוננת מכוונת לקונטיינר האב הקרוב ביותר שמתאים. אם אתם נותנים שמות לקונטיינרים, השאילתה הפנימית מכוונת לקונטיינר בעל השם בעוד השאילתה החיצונית מכוונת לאחר. זה שימושי לרכיבים בתוך רכיבים שכל אחד מהם צריך התנהגות רספונסיבית משלו.
אפשר להשתמש ב-Container Queries עם Flexbox ו-Grid?
כן. Container Queries עובדים עם כל שיטת layout. למעשה, Flexbox ו-Grid הם אידיאליים לספק את הגודל החיצוני שקונטיינרים צריכים. דפוס נפוץ הוא להפוך את העוטף של תא Grid או פריט Flex לקונטיינר, ואז לשאול עליו בתוך הרכיב.
מה קורה אם לא הוגדר קונטיינר בעץ האבות?
אם לאף אב אין container-type מוגדר, שאילתות @container ללא שם לא ימצאו התאמה והסגנונות שלהן לא יחולו. יחידות אורך של Container Queries כמו cqi יחזרו ליחידות viewport קטנות מקבילות (svi). תמיד ודאו שקונטיינר מוגדר איפשהו בשרשרת האבות.
מה זה Container Style Queries?
Style Queries מאפשרים להחיל סגנונות בהתבסס על ערכי custom properties של קונטיינר באמצעות @container style(--theme: dark). בניגוד ל-size queries, כל אלמנט הוא באופן מרומז style container - אין צורך ב-container-type. נכון ל-2026, style queries עבור custom properties עובדים ב-Chrome, Edge ו-Safari, אבל עדיין לא ב-Firefox.
האם קונטיינר יכול לעצב את עצמו עם Container Queries?
לא. כלל @container יכול לעצב רק את הצאצאים של הקונטיינר, לעולם לא את אלמנט הקונטיינר עצמו. אם אתם צריכים לעצב את הקונטיינר בהתבסס על הגודל שלו, הוסיפו אלמנט עוטף פנימי והפכו את האלמנט החיצוני לקונטיינר.

סיכום

Container Queries מאפשרים לרכיבים שלכם להגיב לשטח הזמין להם במקום ל-viewport. הגדירו קונטיינר עם container-type: inline-size, שאלו עליו עם @container, והרכיב שלכם מתאים את עצמו בכל מקום שהוא ממוקם – סיידבר, תוכן ראשי, מודל, גריד דשבורד.

בשילוב עם CSS Grid ו-Flexbox ל-layout, Container Queries משלימים את התמונה לבניית רכיבים רספונסיביים וניתנים לשימוש חוזר באמת.

דיון ותגובות
0 תגובות  ]

השאירו תגובה

הוסיפו קוד באמצעות הכפתורים מטה. למשל, בכדי להוסיף PHP לחצו על הכפתור PHP והוסיפו את הקוד בתוך השורטקוד. מצאתם שגיאה בפוסט? עדכנו אותנו...

Savvy WordPress Development official logo