- Breakpoint System עם CSS Custom Properties — 5 breakpoints (
--bp-sm: 640pxעד--bp-2xl: 1536px) כ-design tokens, כולל שימוש ב-@media, דוגמאות שלmin-widthבלבד (mobile-first), ו-decision guide לבחירת breakpoint ל-content-driven layouts - Responsive Image Component —
<picture>מלא — קוד העתק-הדבק עם 3 מקורות (AVIF → WebP → JPEG fallback), srcset עם 3 רזולוציות (1x, 2x, 3x), sizes attribute מחושב, ו-loading="lazy"conditional לפי מיקום ב-fold - Checklist: 10 דברים לבדוק במובייל — רשימה מודפסת לכל השקה: viewport meta, touch targets 44px+, hero LCP, טקסט לפחות 16px, ללא horizontal scroll, hamburger עובד, forms על מובייל, תמונות לא גולשות, RTL עובד, מהירות על 4G
- Container Queries Component — אותו card שמתנהג שונה ב-sidebar (stacked) מול main (horizontal) — עם קוד מלא של
container-type: inline-sizeו-@containerqueries - Responsive Spacing System עם clamp() — 5 custom properties (
--pad-section,--pad-cardוכו') שמשתמשים ב-clamp(min, preferred, max)— גדלים זורמים בלי breakpoints - Stack-as-Cards Table Pattern — טבלה שהופכת לכרטיסים במובייל באמצעות
display: block+data-labelattributes — עם קוד CSS מלא ודוגמה ל-pricing table - Responsive Audit Prompt + Mobile-First Site Template Prompt — שני פרומפטים באנגלית שמכריחים את AI לבנות mobile-first עם breakpoints ספציפיים, touch targets, RTL, responsive images — מוכנים להעתקה
- מילון 15 מונחי Responsive Design — mobile-first, breakpoints, Container Queries, srcset, sizes, picture, viewport meta, touch targets, hamburger patterns, responsive tables ועוד
- תוכלו להנחות AI לבנות mobile-first במקום desktop-first — עם פרומפט מפורש שמגדיר base styles ל-320px ולמעלה,
min-widthbreakpoints בלבד, וסדר CSS שמהקטן לגדול; תדעו להסביר למה זה חוסך CSS bundle ומאיץ רינדור - תוכלו להגדיר breakpoints נכונים ולבחור בין media queries ל-Container Queries — עם Decision Framework ברור: שלד אתר = media queries, רכיבים לשימוש חוזר = container queries; תבנו card שמגיב לגודל ה-container ולא לגודל ה-viewport
- תוכלו לבדוק responsive behavior בכלי הדפדפן ועל מכשירים אמיתיים — עם workflow של 3 שכבות: DevTools responsive mode (מהיר), BrowserStack (coverage), מכשיר אמיתי בידיים (scroll, touch, performance); תדעו אילו באגים רק המכשיר האמיתי תופס
- תוכלו לבקש מ-AI responsive images ו-touch targets בגודל נכון — עם
<picture>מלא (AVIF/WebP/JPEG), srcset עם 3 רזולוציות, sizes מחושב,loading="lazy"נכון (לא על hero LCP), ו-touch targets 44×44px מינימום עם spacing 8px בין לחצנים
- פרקים קודמים: פרק 1 (Anti-AI Checklist — סימן 9 "predictable layouts" ו-"identical padding" קשורים ישירות לחוסר responsive), ופרק 5 (Layout Mastery — CSS Grid, Flexbox,
auto-fit,gap, ומערכת ה-8px spacing — כולם חוזרים כאן). מומלץ גם פרק 6 (Modern CSS) לעומק של Container Queries - מושגים שיחזרו: Container Queries (פרק 6), CSS Grid (פרק 5), Flexbox (פרק 5),
auto-fit/auto-fill(פרק 5),clamp()(פרק 4), whitespace ו-8px grid (פרק 5) - כלים: Chrome/Edge/Firefox DevTools (Responsive Mode — מקש F12 ואז Ctrl+Shift+M), מכשיר אמיתי (iPhone או Android — לא אמולטור), חשבון Squoosh.app (חינם — להמרת תמונות ל-WebP/AVIF), וכלי AI לבניית אתרים
- אופציונלי: חשבון BrowserStack (14 יום חינם) לבדיקה על מכשירים שאין לכם פיזית, ו-Lighthouse (מובנה ב-Chrome DevTools) לבדיקת mobile score
- זמן משוער: 120-150 דקות (כולל 4 התרגילים)
לאורך הקורס אתם בונים את היכולת להפוך אתר גנרי שAI בנה לאתר שנראה כמו עבודת סטודיו — ה-capstone בפרק 13. עד כה: פרקים 1-2 (זיהוי גנריות + premium anatomy), פרק 3 (פלטת צבעים + design tokens), פרק 4 (טיפוגרפיה), פרק 5 (Layout + 8px grid + whitespace), פרק 6 (Modern CSS — Container Queries, :has()), פרקים 7-8 (Scroll-driven + View Transitions), פרק 9 (Glassmorphism + Aurora). בפרק הזה (10) — תוסיפו את השכבה הקריטית ביותר שהאתר ייראה מקצועי גם ב-375px ולא רק ב-1920px: Responsive Design mobile-first. זו לא תוספת "בסוף", זו שכבה שחייבת להיות בכל החלטת layout שעשיתם עד כה. בפרק הבא (11 — Performance & Core Web Vitals) ניקח את ה-responsive images, srcset ו-lazy loading מכאן, ונחבר אותם ל-LCP, CLS ו-INP. פרק 10 הוא דרישת-קדם חובה לפרק 11 — כי responsive images הם אחד משני המקורות הגדולים ביותר לבעיות LCP באתרי ישראל, יחד עם פונטים עבריים.
| מונח (English) | תרגום | הגדרה בשורה אחת |
|---|---|---|
| Mobile-First | מובייל-תחילה | גישת עיצוב/CSS שמתחילה מ-320px כ-base ומוסיפה שכבות ל-desktop, במקום להיפך |
| Breakpoints | נקודות שבירה | רוחבי viewport שבהם ה-layout משתנה (דוגמאות Tailwind: 640, 768, 1024, 1280, 1536) |
| Media Queries | שאילתות מדיה | בדיקת CSS לגודל ה-viewport (החלון) — @media (min-width: 768px) |
| Container Queries | שאילתות קונטיינר | בדיקת CSS לגודל הקונטיינר של הרכיב — @container (min-width: 400px); התשובה המודרנית לרכיבים לשימוש חוזר |
| Responsive Images | תמונות מגיבות | תמונות שהדפדפן בוחר מהן את הגודל/פורמט הנכון לפי מסך, עם srcset, sizes, ו-<picture> |
| srcset | סט-מקורות | רשימת תמונות באותו תוכן בגדלים שונים — הדפדפן בוחר את הקטן ביותר שמספיק |
| sizes | גדלים | רמז לדפדפן איזה רוחב התמונה תתפוס ב-layout — קריטי לבחירה נכונה ב-srcset |
| <picture> element | אלמנט תמונה | HTML container שמאפשר art direction (crop שונה למובייל) וגם fallback chain של פורמטים (AVIF → WebP → JPEG) |
| WebP / AVIF | פורמטי תמונה מודרניים | WebP — 50% קטן מ-JPEG; AVIF — 80% קטן מ-JPEG; שניהם נתמכים ברוב הדפדפנים ב-2026 |
| Touch Targets | יעדי מגע | אזור שאפשר להקיש עליו באצבע — מינימום 44×44px (Apple HIG) / 48×48px (Material) |
| Viewport Meta | מטא ויופורט | תג HTML קריטי: <meta name="viewport" content="width=device-width, initial-scale=1.0"> — בלעדיו המובייל יציג את האתר כ-980px מוקטן |
| Hamburger Menu | תפריט המבורגר | אייקון של 3 קווים שפותח ניווט במובייל; 3 patterns: drawer, overlay, bottom tab bar |
| Responsive Tables | טבלאות מגיבות | 3 patterns: horizontal scroll (מהיר), stack-as-cards (הכי נקי), hide columns (פשרה) |
| CSS Logical Properties | תכונות לוגיות ב-CSS | תכונות ללא-כיוון כמו margin-inline-start ו-padding-block-end — עובדות נכון ב-LTR וב-RTL בלי שכפול CSS |
| Real Device Testing | בדיקה במכשיר אמיתי | הרצה על iPhone/Android פיזי, לא DevTools — הדרך היחידה להרגיש touch latency, scroll jank, ו-thermal throttling |
10.1 למה מובייל הוא לא "גרסה משנית" — הסטטיסטיקה הישראלית
תפתחו את Google Analytics של כל אתר ישראלי ותסתכלו על "Device Category". המספר שיחזור כמעט תמיד: 60-70% מהגולשים על מובייל, 25-35% על desktop, 3-5% על טאבלט. באתרי ecommerce ישראליים, במיוחד כאלה שמבקרים דרך Instagram או TikTok, אחוז המובייל מגיע ל-75-85%. באתרי B2B וכלי פרודוקטיביות (SaaS) — נהפוך הוא: 55-65% desktop כי אנשים עובדים מול מחשב. אבל גם שם, ה-mobile traffic הוא הקנייה-הראשונית: אנשים גולשים לאתר ב-LinkedIn בנייד, ואז חוזרים ב-desktop להחליט.
המסקנה: לבנות אתר שנראה נהדר ב-1920px ולא בודק מה קורה ב-375px — זה לבנות אתר שלא יוצג נכון לרוב המשתמשים. זה לא דעה, זה מתמטיקה של Analytics.
- Ecommerce ישראלי: 70-85% mobile, 15-25% desktop
- תוכן ומדיה (חדשות, בלוגים): 65-75% mobile
- Landing pages מ-Facebook/Instagram Ads: 85-92% mobile
- SaaS / B2B tools: 35-55% mobile (הוא נמוך יותר אבל עדיין משמעותי)
- Government / בנקאות: 50-65% mobile
האחוזים משתנים לפי ערוץ הפצה, סוג התוכן ו-audience. הדרך היחידה לדעת את המספר האמיתי שלכם: Google Analytics → Reports → Tech → Device Category.
מה זה אומר כשמפתח/AI מתייחס למובייל כ-afterthought
"Mobile afterthought" הוא השם המדויק לבעיה: בונים ל-desktop, ואז "מתאימים" את המובייל כתוספת. הסימנים המובהקים של אתר עם mobile afterthought:
- טקסט גדול מדי או קטן מדי במובייל (hero שעובד ב-desktop נראה כמו קיר טקסט ב-375px)
- כפתורים קטנים מדי — פחות מ-44×44px, ואז משתמש מקיש ולוחץ על כפתור שכן
- Horizontal scroll בלתי רצוי — משהו גולש מעבר ל-viewport ומופיע פס גלילה אופקי
- תמונות ענקיות שנטענות גם כשהמשתמש על 4G (תמונה של 2MB בשביל hero שמוצג ב-375×250px)
- Navigation דסקטופי דחוס (7 קישורים אופקיים) שמתכווץ למובייל ונראה כמו ערימה
- Forms עם
type="text"במקוםtype="email"/type="tel"— keyboard לא נכון במובייל - Modals ו-popups שלא נסגרים במובייל, או שה-X שלהם קטן מדי
פתחו Google Analytics (או Plausible/Fathom) של האתר העיקרי שלכם. לכו ל-Reports → Tech → Device Category. רשמו את ה-%:
- Mobile: ____ %
- Desktop: ____ %
- Tablet: ____ %
אם Mobile מעל 50% — כל דקה שאתם משקיעים ב-responsive מוכפלת בערכה. אם אין לכם Analytics עדיין, הניחו 65% mobile כ-baseline ישראלי והמשיכו.
Vibe Coders רבים מתייחסים ל-responsive design כאל "עוד פיצ'ר" — משהו שמוסיפים אחרי שה-desktop מוכן. זו אותה טעות כמו לחשוב ש-accessibility הוא bonus. ב-2026, responsive זה לא feature — זה תנאי סף לאתר שעובד. תחשבו על זה כך: אם 70% מהמשתמשים שלכם יראו את האתר נשבר, האם אפשר לקרוא לו "עובד"? התשובה: לא. מה לעשות במקום: תחשבו על mobile-first כבר בפרומפט הראשון ל-AI, לא בתיקון השלישי.
10.2 למה AI בונה desktop-first ולמה זה נשבר במובייל
כשאתם כותבים "build me a landing page for a SaaS product" לכל כלי AI (Bolt, Lovable, v0, Claude, Cursor), סביר ב-80%+ שתקבלו קוד כזה:
.hero {
padding: 120px 80px;
display: grid;
grid-template-columns: 1fr 1fr;
gap: 64px;
font-size: 64px;
}
@media (max-width: 768px) {
.hero {
grid-template-columns: 1fr;
padding: 60px 20px;
font-size: 36px;
}
}
שימו לב ל-3 דברים בקוד הזה — כל אחד מהם תסמין של desktop-first:
- ה-base styles (מחוץ ל-
@media) הם desktop. 120px padding, 64px font-size, grid של 2 עמודות — כל זה מיועד ל-1440px ולמעלה. המובייל מקבל "תיקון" שמבטל את ה-base. - שימוש ב-
max-widthבמקוםmin-width. זה הסימן הכי מובהק ל-desktop-first.max-width: 768pxאומר "בגודל מסך קטן מ-768 — החליפי את ה-default".min-width: 768pxאומר "בגודל מסך גדול מ-768 — שדרגי מה-mobile base". - ה-mobile נראה כמו גרסה מוקטנת של ה-desktop. אותן 2 עמודות שהפכו ל-1, אותו padding שהתכווץ. לא נחשב מה האמת היא צריכה להיות במובייל — למשל, מיקום שונה של ה-CTA, הסרת תמונה דקורטיבית, או תצוגת headline אחרת.
למה AI עושה את זה
שתי סיבות מבניות:
- Training data: רוב הקוד ש-AI ראה במאגרי GitHub הוא desktop-first מתקופת 2012-2020. ה-convention הזה השתנתה בענף ב-2018-2020, אבל training data ישן עדיין משפיע על ברירת המחדל.
- Default device של AI-generated UI: כשמבקשים "landing page", ה-AI מדמיין דף בגדול — כי זו הצורה שהוא ראה הכי הרבה בצילומי מסך ב-training. מובייל הוא adaptation, לא default.
המסקנה: אם לא אומרים ל-AI "mobile-first" מפורשות בפרומפט, בברירת-מחדל תקבלו desktop-first. "make it responsive" לא מספיק — זה רק גורם ל-AI להוסיף @media (max-width: 768px) בסוף. כדי לקבל mobile-first אמיתי, צריך פרומפט ספציפי. לזה נגיע ב-section 10.14.
פתחו את הקובץ .css הראשי של פרויקט אחד שבניתם עם AI. חפשו את המחרוזת max-width ו-min-width בתוך @media. ספרו:
- כמה
@media (max-width: ...): ____ - כמה
@media (min-width: ...): ____
אם יש יותר max-width מ-min-width — ה-AI בנה לכם desktop-first. זה לא אסון, אבל זה מה שצריך לתקן.
10.3 Mobile-First — הפילוסופיה והקוד
Mobile-first זו לא דוגמה של "איך לכתוב CSS". זו גישה. המשמעות: ה-default של האתר הוא מובייל, וכל שאר הגדלים הם "שכבות שיפור" (progressive enhancement) שמתווספות לבסיס הזה. בקוד, זה מתורגם לשלושה כללים:
- Base styles = mobile styles. כל CSS שכתוב מחוץ ל-
@mediaצריך לעבוד ב-320px. - רק
@media (min-width: ...), לעולם לאmax-width. זה מאלץ אתכם לחשוב "מה מתווסף בגודל הזה ומעלה", במקום "מה אני צריך לבטל". - Progressive enhancement. בכל breakpoint מוסיפים או משפרים — לא מבטלים או מכסים. אם אתם מוצאים את עצמכם כותבים
display: noneבתוך media query גדול כדי "להסתיר" משהו ש-mobile לא צריך — זה סימן שה-default שלכם כבר לא mobile-first.
הקוד השיקולי — לפני ואחרי
/* ======== Desktop-First (שגוי) ======== */
.hero {
padding: 120px 80px;
grid-template-columns: 1fr 1fr;
font-size: 64px;
}
@media (max-width: 768px) {
.hero {
padding: 40px 16px;
grid-template-columns: 1fr;
font-size: 36px;
}
}
/* ======== Mobile-First (נכון) ======== */
.hero {
padding: 40px 16px;
display: grid;
grid-template-columns: 1fr;
font-size: 36px;
}
@media (min-width: 640px) {
.hero {
padding: 64px 32px;
font-size: 44px;
}
}
@media (min-width: 1024px) {
.hero {
padding: 120px 80px;
grid-template-columns: 1fr 1fr;
font-size: 64px;
}
}
שימו לב לסדר: base → 640 → 1024. המובייל הוא הבסיס, כל breakpoint נוסף מרחיב את מה שהיה. זו הגישה של Tailwind CSS (ש-AI מכיר היטב), ולכן אם תגידו ל-AI "use Tailwind mobile-first conventions" — זה יתרגם ישירות לסגנון הזה.
למה mobile-first הוא גם טוב ל-performance
- CSS Bundle קטן יותר במובייל: בצורה לוגית — ה-default כבר עושה את העבודה, וכל ה-
@media (min-width)נשארים "רדומים" ב-parse במובייל. בפועל ההבדל לא ענק (CSS parsing מהיר), אבל קונספטואלית זה נכון. - Render קריטי מהיר יותר: ה-browser לא מחשב rules שעכשיו מבוטלות — הוא מחשב את הנכונים מההתחלה.
- חשיבה "minimum viable" של מובייל: כשמתחילים מה-mobile view, אתם מכריחים את עצמכם להחליט מה באמת חשוב. אתר desktop-first ממשיך להעמיס אלמנטים כי "יש מקום". אתר mobile-first מאלץ priority.
זו אחת האמירות הקלאסיות של Luke Wroblewski (שטבע את המונח "Mobile First" ב-2011). מובייל זה לא "desktop קטן יותר". זה קונטקסט שונה: משתמש בתנועה, על 4G, עם אצבע, עם יד אחת, עם תשומת-לב מפוצלת. לכן גם התוכן לפעמים צריך להיות שונה — לא רק הגודל. למשל: ב-desktop אפשר להציג 3 טיפים, במובייל אולי עדיף טיפ אחד עם "קרא עוד".
פתחו קובץ CSS אחד מהפרויקט שלכם. מצאו @media (max-width: ...) אחד. תרגיל ההמרה:
- העתיקו את מה שבתוך
@media (max-width)החוצה — הופך ל-base style. - מה שהיה ב-base מחוץ ל-@media — העתיקו אותו לתוך
@media (min-width: ...)חדש. - מחקו את ה-
max-widthquery הישן.
שמרו, רעננו את הדפדפן, בדקו שהאתר נראה זהה. אם כן — מזל טוב, עשיתם המרה mobile-first אחת. אם לא — בדקו שהתוכן עבר נכון.
10.4 Breakpoint System — 640, 768, 1024, 1280, 1536
Breakpoints הם הרוחבים שבהם ה-layout שלכם "מחליט" לעשות משהו שונה. השאלה הגדולה: מאיפה להביא את המספרים? יש שתי גישות:
- לעקוב אחרי סטנדרט תעשייתי (Tailwind, Bootstrap) — פחות חשיבה, יותר עקביות, AI מכיר את המספרים.
- לקבוע לפי ה-content breaks שלכם — יותר מדויק, יותר עבודה, תלוי בעיצוב ספציפי.
המלצה: השתמשו ב-Tailwind defaults כ-baseline, והוסיפו breakpoints custom רק אם ה-content שלכם "נשבר" במקום ספציפי.
Tailwind Breakpoints — הסטנדרט של 2026
| שם | Min-width | טיפוסי מכשיר | שימוש |
|---|---|---|---|
sm | 640px | מובייל גדול (iPhone Plus, Android landscape) | לעבור מ-single column ל-2 columns ב-cards קטנים |
md | 768px | טאבלט portrait (iPad Mini) | הוספת sidebar, הצגת navigation dektop |
lg | 1024px | טאבלט landscape, לפטופים קטנים | full desktop layout, 3 columns |
xl | 1280px | לפטופ רגיל | wider hero, more whitespace |
2xl | 1536px | מסך דסקטופ גדול | max content width, grand spacing |
CSS Custom Properties ל-breakpoints
CSS לא תומך ב-var(--bp-md) בתוך @media — זה מגבלה של ה-spec. אבל אפשר להגדיר breakpoints כ-custom properties כ-documentation ולשימוש עם PostCSS/Tailwind config, או לשימוש ב-JS/React. הערך הפרקטי: יש לכם מקום אחד ששולט על המספרים.
:root {
--bp-sm: 640px;
--bp-md: 768px;
--bp-lg: 1024px;
--bp-xl: 1280px;
--bp-2xl: 1536px;
/* Container max-widths — שימוש אמיתי ב-CSS */
--container-sm: 640px;
--container-md: 768px;
--container-lg: 1024px;
--container-xl: 1280px;
}
.container {
width: 100%;
max-width: var(--container-lg);
margin-inline: auto;
padding-inline: 16px;
}
@media (min-width: 768px) {
.container {
padding-inline: 32px;
}
}
@media (min-width: 1024px) {
.container {
padding-inline: 48px;
}
}
Custom breakpoints — מתי לשבור מהסטנדרט
הכלל הזהב: לא לבחור breakpoint לפי מכשיר, לבחור לפי content break. אם ה-hero שלכם מפסיק להיראות טוב ב-840px (בין md ל-lg של Tailwind), אל תגבילו את עצמכם — תוסיפו breakpoint שם.
תהליך מעשי לבחירת custom breakpoint:
- פתחו DevTools במצב responsive.
- גררו את ה-viewport לאט-לאט מ-320 עד 1920.
- שימו לב לרגעים שבהם משהו "נראה רע" — טקסט נחתך, כפתור מתכווץ מדי, תמונה נשברת.
- בכל רגע כזה, רשמו את ה-width. זה breakpoint מועמד.
- אם ה-width קרוב (±20px) ל-breakpoint של Tailwind — השתמשו ב-Tailwind one. אם לא — הוסיפו custom.
| אם... | השתמשו ב... | למה |
|---|---|---|
| בונים עם Tailwind / AI שמכיר Tailwind | Tailwind defaults (sm/md/lg/xl/2xl) | AI מפיק קוד עקבי; צוות יכול לחלוק conventions |
| בונים vanilla CSS, פרויקט קטן-בינוני | Tailwind defaults כ-CSS custom properties | מקבלים את הסטנדרט בלי ה-framework |
| עיצוב מורכב עם content breaks ספציפיים | Custom breakpoints + Container Queries לרכיבים | מדויק יותר, אבל דורש תחזוקה ו-documentation |
| רכיבים לשימוש חוזר בהקשרים שונים | Container Queries במקום breakpoints | הרכיב מגיב לקונטיינר שלו, לא למסך — ראו section 10.5 |
| פרויקט שהזנבות שלו כבדים (גם smartwatch, גם 4K) | להוסיף xs: 480 ו-3xl: 1920 |
המספרים ה-defaults לא מכסים את הקצוות |
פתחו קובץ CSS של פרויקט. חפשו את כל המספרים ב-@media. כתבו אותם ברשימה. השוו ל-Tailwind defaults (640/768/1024/1280/1536). אם יש מספרים "מוזרים" כמו 680 או 990 — בדקו: האם זה content break מכוון, או ש-AI זרק מספר אקראי? בדרך כלל זה השני. שנו אותם ל-breakpoints סטנדרטיים אלא אם יש סיבה ספציפית לשמור.
מעצב אומר לכם "iPhone 12 הוא 390px רוחב", ואתם כותבים @media (max-width: 390px). זו טעות. ה-iPhone 12 הוא אולי 390, אבל iPhone 13 Mini הוא 375, Samsung Galaxy S21 הוא 360, Pixel 7 הוא 412. אתם לא כותבים "ל-iPhone 12" — אתם כותבים "לטווח קטן של מכשירים ניידים". השתמשו ב-breakpoints עם ranges נדיבים (כמו 640 ו-768) ולא במספרים ספציפיים של מכשיר. מה לעשות במקום: תחשבו ב-ranges (< 640, 640-768, > 768) במקום במכשירים.
10.5 Media Queries vs Container Queries — התשובה של 2026
Media Queries קיימים מ-2012. Container Queries קיבלו full browser support ב-2023. מה ההבדל, ומתי להשתמש בכל אחד?
| Media Queries | Container Queries | |
|---|---|---|
| מגיב ל: | גודל ה-viewport (החלון) | גודל הקונטיינר של הרכיב |
| Syntax: | @media (min-width: 768px) | @container (min-width: 400px) |
| דוגמה לשימוש נכון: | שלד האתר — hero, navigation, layout ראשי | Card שנמצא גם ב-sidebar וגם ב-main |
| חסרון: | רכיב לא יודע איפה הוא נמצא | דורש הגדרת container-type בהורה |
| Browser support (2026): | 100% (15+ שנים) | 93%+ (Chrome/Edge 105+, Safari 16+, Firefox 110+) |
הכלל המעשי
שלד האתר ← Media Queries. רכיבים לשימוש חוזר ← Container Queries.
למה? כי ה-hero, ה-navigation, וה-footer קשורים ל-viewport (הם חלק מה-frame של הדף). לעומת זאת, כרטיס מוצר יכול להיות גם ב-sidebar של 300px, גם ב-main של 800px, גם ב-modal של 500px. הוא לא צריך לדעת מה גודל ה-viewport — הוא צריך לדעת מה גודל ה-slot שבו הוא יושב.
דוגמת קוד מלאה — אותו card, שני הקשרים
<!-- Layout עם sidebar ו-main -->
<div class="layout">
<aside class="sidebar">
<article class="product-card">...</article>
</aside>
<main class="main">
<article class="product-card">...</article>
</main>
</div>
/* Layout ב-media queries (מגיב ל-viewport) */
.layout {
display: grid;
grid-template-columns: 1fr;
gap: 24px;
}
@media (min-width: 1024px) {
.layout {
grid-template-columns: 300px 1fr;
}
}
/* Product Card — container queries (מגיב ל-slot) */
.sidebar,
.main {
container-type: inline-size;
container-name: card-slot;
}
.product-card {
/* Base — stacked layout, תמיד מתחיל מה-narrow */
display: grid;
gap: 12px;
}
.product-card img {
width: 100%;
aspect-ratio: 1/1;
}
/* כשהקונטיינר רחב מ-400px — horizontal layout */
@container card-slot (min-width: 400px) {
.product-card {
grid-template-columns: 120px 1fr;
align-items: center;
}
.product-card img {
aspect-ratio: 1/1;
width: 120px;
}
}
מה שקורה כאן: ב-sidebar (רוחב 300px) — ה-card יהיה stacked. ב-main (רוחב 800px+) — ה-card יהיה horizontal. הכל אותו קומפוננט, אותו HTML, אותו CSS. פשוט הוא מגיב לקונטיינר שלו במקום למסך.
שאלו את עצמכם 3 שאלות על הרכיב:
- האם הרכיב מופיע רק במקום אחד בדף? (למשל hero, footer, navigation). אם כן ← Media Queries. הוא קשור ישירות ל-viewport.
- האם הרכיב מופיע במספר הקשרים עם רוחבים שונים? (למשל card שנמצא גם ב-sidebar, main, ו-modal). אם כן ← Container Queries.
- האם אני בונה ספריית קומפוננטים? (Design System, component library). אם כן ← Container Queries כברירת-מחדל. הקומפוננט לא יודע איפה ישתמשו בו.
הסיכום: רוב האתרים משתמשים בשילוב — media queries ל-80% (שלד), container queries ל-20% (רכיבים שנודדים). זה לא או-או.
פתחו את האתר הנוכחי שלכם. חפשו רכיב שמופיע במספר מקומות — למשל, אותו card שנמצא גם ברשת של 3 עמודות, גם בודד ב-hero, וגם ב-sidebar אם יש לכם. רשמו את שמו: ____ . זה המועמד המושלם ל-Container Query. בתרגיל 1 תמירו אותו.
10.6 Responsive Images — srcset, sizes, picture, WebP, AVIF
התמונות הן בדרך כלל 60-80% ממשקל האתר. תמונה לא מותאמת למובייל היא הסיבה #1 לטעינה איטית, ל-LCP גבוה, ול-bounce rate של 60%+ במובייל. הכלי המרכזי לפתרון: responsive images עם 4 רכיבים: srcset, sizes, <picture>, ופורמטים מודרניים (WebP, AVIF).
srcset + sizes — הפתרון הבסיסי
srcset זו רשימה של אותה תמונה בגדלים שונים. sizes זה רמז לדפדפן כמה רחבה התמונה תהיה ב-layout. הדפדפן שולף את הקטנה ביותר שעדיין מספיקה.
<img
src="hero-800.jpg"
srcset="hero-400.jpg 400w,
hero-800.jpg 800w,
hero-1200.jpg 1200w,
hero-1600.jpg 1600w"
sizes="(min-width: 1024px) 1200px,
(min-width: 640px) 800px,
100vw"
alt="תיאור אמיתי של התמונה"
width="1200"
height="800"
/>
הסבר על השדות:
src— fallback לדפדפנים ישנים שלא תומכים ב-srcset. תמונה בגודל "סביר".srcset— רשימת ("url", "רוחב בפיקסלים"). ה-400wאומר "התמונה הזו רחבה 400 פיקסלים אמיתיים".sizes— לכל viewport breakpoint, מה יהיה הרוחב של התמונה ב-layout. הדפדפן משתמש בזה לחשב איזו תמונה מ-srcset הכי מתאימה.widthו-height— חובה! בלעדיהם יש CLS (Layout Shift) כשהתמונה נטענת. הערכים הם aspect ratio, לא גודל תצוגה.
<picture> — art direction + format fallback
<picture> הוא לשני use cases:
- Art direction: crop שונה למובייל ול-desktop (למשל, במובייל מקרבים את הפנים של האדם בתמונה, ב-desktop מראים את כל הסצנה).
- Format fallback chain: AVIF → WebP → JPEG. הדפדפן בוחר את הראשון שהוא תומך.
הקוד המלא המומלץ (העתק-הדבק ל-hero image):
<picture>
<!-- AVIF — הקטן ביותר (80% חיסכון), נתמך ב-2026 ב-90%+ דפדפנים -->
<source
type="image/avif"
srcset="hero-400.avif 400w,
hero-800.avif 800w,
hero-1200.avif 1200w"
sizes="(min-width: 1024px) 1200px,
(min-width: 640px) 800px,
100vw"
/>
<!-- WebP — חיסכון של 50%, נתמך ב-97%+ דפדפנים -->
<source
type="image/webp"
srcset="hero-400.webp 400w,
hero-800.webp 800w,
hero-1200.webp 1200w"
sizes="(min-width: 1024px) 1200px,
(min-width: 640px) 800px,
100vw"
/>
<!-- JPEG — fallback אוניברסלי -->
<img
src="hero-800.jpg"
srcset="hero-400.jpg 400w,
hero-800.jpg 800w,
hero-1200.jpg 1200w"
sizes="(min-width: 1024px) 1200px,
(min-width: 640px) 800px,
100vw"
alt="תיאור שימושי לקורא מסך"
width="1200"
height="800"
loading="eager"
fetchpriority="high"
/>
</picture>
פורמטים מודרניים — כמה חוסכים באמת
| פורמט | חיסכון מ-JPEG | Browser support 2026 | שימוש מומלץ |
|---|---|---|---|
| JPEG | baseline | 100% | fallback אוניברסלי |
| WebP | 25-35% | 97%+ | ברירת מחדל לכל תמונה |
| AVIF | 50-80% | 90%+ | עדיפות ראשונה כשאפשר |
| PNG | גדול יותר מ-JPEG | 100% | רק לתמונות עם שקיפות או עריכה ללא-אובדן |
איך ממירים תמונות: Squoosh.app (חינם, מבית Google) או cwebp/avifenc command line. ב-workflow תקני: העלו תמונה JPEG, הריצו ב-Squoosh, ייצאו 3 רזולוציות (400, 800, 1200) ב-3 פורמטים (AVIF, WebP, JPEG) = 9 קבצים לתמונה.
loading="lazy" — מתי כן ומתי לא
loading="lazy" אומר לדפדפן "אל תטען את התמונה עד שהמשתמש ייגלל קרוב אליה". חוסך bandwidth ו-LCP. אבל יש מקום אחד שאסור להשתמש בו: תמונת ה-hero / LCP.
- ✓ Lazy loading: כל תמונה מתחת ל-fold, תמונות ב-articles ארוכים, thumbnails ברשימות.
- ✗ אסור lazy: hero image, כל תמונה ב-"above the fold" (נראית מיד בטעינה). השתמשו ב-
loading="eager"+fetchpriority="high".
AI לפעמים מוסיף loading="lazy" לכל <img> בגוף. זו טעות עבור תמונת ה-hero. כשמשתמש נוחת על הדף — התמונה הגדולה למעלה היא ה-LCP (Largest Contentful Paint). אם היא lazy, הדפדפן מחכה איתה, וה-LCP שלכם יכול לעלות מ-1.8s ל-3.5s — מעבר לקצה האדום של Core Web Vitals. מה לעשות במקום: על hero image מפורשות loading="eager" fetchpriority="high". אל תסמכו על ברירת המחדל של AI.
פתחו את האתר שלכם. DevTools → Network → Filter: Img. רענו את הדף. רשמו:
- כמה תמונות נטענו: ____
- המשקל הגדול ביותר: ____ KB
- המשקל הכולל: ____ KB
כל תמונה מעל 200KB במובייל היא candidate לאופטימיזציה. סכום כולל מעל 1MB — חובה לטפל. כל תמונה ב-JPEG רגיל (לא WebP/AVIF) — candidate להמרה ב-Squoosh.
10.7 Touch Targets — 44×44px, ו-hit-area expansion
כפתור של 30×30px נראה בסדר ב-DevTools, אבל במובייל אמיתי המשתמש מקיש עליו ולחוץ על הכפתור השכן. זו הסיבה הראשונה לנטישה במובייל — יותר מעומס או עיצוב מכוער. Apple HIG ו-Material Design הגיעו לאותו מסקנה משתי דרכים שונות: אזור אינטראקטיבי חייב להיות לפחות 44×44pt (Apple) / 48×48dp (Material).
איפה זה חשוב במיוחד
- כפתורי CTA (Add to Cart, Submit, Send)
- אייקונים בניווט (close, menu, back)
- form inputs — checkbox, radio, toggle
- Links בתוך paragraphs — קל לפספס עם אצבע
- pagination arrows
Hit-area expansion — כשעיצוב דורש אייקון קטן
לפעמים אתם צריכים אייקון 16×16 מטעמי עיצוב (למשל, Close X בפינת modal). אל תגדילו את האייקון — הרחיבו את אזור הלחיצה באמצעות pseudo-element:
.small-icon-button {
width: 16px;
height: 16px;
position: relative;
cursor: pointer;
}
/* אזור לחיצה של 44×44, לא נראה, אבל קליק */
.small-icon-button::before {
content: "";
position: absolute;
inset: -14px; /* מרחיב 14px לכל כיוון = 44×44 */
/* הערה: אפשר גם להוסיף padding גדול ו-negative margin */
}
התוצאה: אייקון ויזואלי של 16×16, אבל המשתמש יכול להקיש על שטח של 44×44 סביבו. זה הטריק שמציל אתרים עם עיצוב מינימליסטי.
Spacing בין touch targets
שני כפתורים של 44×44 שצמודים — עדיין יקשו על אצבע גדולה. ההמלצה: לפחות 8px spacing בין אזורי לחיצה. זה gap: 8px ב-flex/grid, או margin על הכפתור.
.button-group {
display: flex;
gap: 8px; /* spacing מינימלי בין touch targets */
flex-wrap: wrap;
}
.button {
min-width: 44px;
min-height: 44px;
padding: 12px 20px;
/* הערה: padding-based sizing נותן גמישות */
}
פתחו את האתר שלכם ב-DevTools responsive mode, 375px width. מצב inspect. הקישו על כל כפתור/קישור וראו את המידות:
- כפתורים שמתחת ל-44×44: ____
- אייקונים שמתחת ל-44×44: ____
- Links בתוך טקסט שמתחת ל-44×44: אם זה links רגילים בתוך פסקה — בסדר; אם זה "קרא עוד" או CTA — בעיה
כל כפתור/אייקון שנמצא בעייתי — רשמו אותו. בתרגיל 3 תתקנו את כולם.
10.8 Hamburger Menu — 3 patterns ומתי כל אחד
ה-"Hamburger Menu" (האייקון של 3 קווים שפותח ניווט) הוא הסטנדרט הדה-פקטו של ניווט במובייל. אבל יש 3 patterns עיקריים של איך הוא מתנהג כשלוחצים — ולכל אחד יש use case שונה.
Pattern 1: Slide-in Drawer
המקובל ביותר. התפריט מחליק מהצד (ימין ב-LTR, שמאל ב-RTL) ומכסה כ-70-80% מהרוחב. שאר המסך נהיה overlay חצי-שקוף.
- מתי: אתרי תוכן רגילים, ecommerce, רוב ה-SaaS landing pages.
- יתרון: המשתמש עדיין "רואה" את הדף מאחורי ה-drawer, תחושה של context.
- חיסרון: מקום מוגבל ל-navigation — אם יש לכם 15 קישורים זה צפוף.
Pattern 2: Full-Screen Overlay
התפריט מכסה 100% מהמסך. רקע מלא (לרוב dark ומאותגר עיצובית), type גדול, נתונים נוספים (תמונות, micro-copy).
- מתי: אתרי פרימיום, agency portfolios, Luxury brands — כשהניווט הוא חלק מהחוויה.
- יתרון: המון מקום לעיצוב, מרגיש "יוקרתי", מכריח את המשתמש לפוקוס.
- חיסרון: מנתק מהדף — אם המשתמש "הלך לאיבוד" בתפריט הוא איבד את ההקשר של איפה הוא היה.
Pattern 3: Bottom Tab Bar
לא hamburger במלוא המובן — יש 4-5 אייקונים בתחתית המסך, קבועים, נגישים תמיד. כמו אפליקציה native.
- מתי: אתרי תוכן דינמיים שמשתמשים חוזרים אליהם הרבה (social, news, music apps), או PWAs שרוצים תחושה של אפליקציה.
- יתרון: ניווט תמיד נגיש, האצבע בתחתית המסך (thumb zone), תחושה native.
- חיסרון: רק 4-5 פריטים מקסימום. לא מתאים לאתרים עם navigation מורכב.
| סוג האתר | מספר קישורים | Pattern מומלץ |
|---|---|---|
| SaaS / Marketing Site | 5-8 | Slide-in Drawer |
| Ecommerce | 10-20 (קטגוריות) | Slide-in Drawer עם accordion |
| Agency / Portfolio | 3-6 | Full-Screen Overlay |
| News / Content | 5-7 main | Bottom Tab Bar + drawer ל-more |
| B2B / Dashboard | 15+ | Slide-in Drawer עם search + accordion |
| App-like PWA | 3-5 core | Bottom Tab Bar |
מתי לשמור על navigation רגיל גם במובייל
לפעמים hamburger הוא over-engineering. אם יש לכם 3 קישורים בלבד (Home, Services, Contact), שמרו אותם גלויים גם במובייל — רק הקטינו את הגודל. לחוויה טובה יותר: אל תחביאו ניווט פשוט מאחורי hamburger.
חשבו על האתר הנוכחי. ענו:
- כמה קישורים בניווט הראשי: ____
- סוג האתר (SaaS / Ecommerce / Portfolio / News / Other): ____
- Pattern מומלץ לפי ה-framework: ____
אם האתר הנוכחי משתמש ב-pattern אחר — שקלו שינוי. אם הוא מתאים — מצוין, תמשיכו.
10.9 טבלאות Responsive — horizontal scroll, stack-as-cards
טבלאות הן הבעיה הקלאסית של responsive. טבלה של 6 עמודות בת 10 שורות נראית מושלמת ב-desktop, ובמובייל זה או horizontal scroll מעצבן, או squeeze שהופך את הטקסט ללא קריא. יש 3 patterns:
Pattern 1: Horizontal Scroll — פשוט, לפעמים מספיק
עוטפים את הטבלה ב-<div> עם overflow-x: auto. הטבלה נשארת רגילה אבל המשתמש מגלל אופקית.
<div class="table-wrap">
<table>...</table>
</div>
.table-wrap {
overflow-x: auto;
-webkit-overflow-scrolling: touch;
/* visual hint שאפשר לגלול */
background:
linear-gradient(to left, rgba(0,0,0,0.1), transparent) right / 20px 100% no-repeat;
}
- מתי: Data tables לניתוח (spreadsheet-like). המשתמש רוצה לראות את כל העמודות.
- לא טוב ל: pricing tables, comparison tables — המשתמש לא רוצה לגלול, הוא רוצה לקרוא.
Pattern 2: Stack-as-Cards — הפתרון הנקי ביותר
במובייל, הטבלה "מתפרקת" — כל שורה הופכת לכרטיס שבו כל תא הוא label:value. זה דורש קצת יותר CSS אבל נותן חוויה מצוינת.
<table class="responsive-table">
<thead>
<tr><th>חבילה</th><th>מחיר</th><th>משתמשים</th><th>תמיכה</th></tr>
</thead>
<tbody>
<tr>
<td data-label="חבילה">Basic</td>
<td data-label="מחיר">₪99</td>
<td data-label="משתמשים">עד 5</td>
<td data-label="תמיכה">אימייל</td>
</tr>
<tr>
<td data-label="חבילה">Pro</td>
<td data-label="מחיר">₪299</td>
<td data-label="משתמשים">עד 20</td>
<td data-label="תמיכה">צ'אט + אימייל</td>
</tr>
</tbody>
</table>
/* Base — מובייל: stack-as-cards */
.responsive-table thead {
display: none; /* ב-mobile ה-headers מוחבאים, משתמשים ב-data-label */
}
.responsive-table tr {
display: block;
margin-bottom: 16px;
border: 1px solid var(--border);
border-radius: 12px;
padding: 16px;
background: var(--card-bg);
}
.responsive-table td {
display: flex;
justify-content: space-between;
padding: 8px 0;
border-bottom: 1px solid var(--border-subtle);
}
.responsive-table td:last-child {
border-bottom: none;
}
.responsive-table td::before {
content: attr(data-label);
font-weight: 600;
color: var(--text-secondary);
}
/* Desktop — טבלה רגילה */
@media (min-width: 768px) {
.responsive-table thead {
display: table-header-group;
}
.responsive-table tr {
display: table-row;
margin: 0;
border-radius: 0;
padding: 0;
}
.responsive-table td {
display: table-cell;
padding: 12px 16px;
}
.responsive-table td::before {
display: none;
}
}
התוצאה: ב-desktop נראה כמו טבלה רגילה, במובייל כל שורה היא כרטיס שקריא מצוין עם label+value לכל עמודה. זו חוויית ה-mobile הכי טובה ל-pricing/comparison tables.
Pattern 3: Hide Columns Progressively
מסתירים עמודות פחות חשובות בגדלים קטנים יותר. אפשר לעשות זאת עם CSS:
/* במובייל — רק עמודות 1 ו-2 */
@media (max-width: 767px) {
table th:nth-child(n+3),
table td:nth-child(n+3) {
display: none;
}
}
/* בטאבלט — 1, 2, 3 */
@media (min-width: 768px) and (max-width: 1023px) {
table th:nth-child(n+4),
table td:nth-child(n+4) {
display: none;
}
}
- מתי: טבלאות עם מידע hierarchy ברור — עמודה 1 היא זיהוי, שאר הן פרטים נוספים.
- חיסרון: המשתמש לא יודע שיש מידע נוסף. דורש UI כמו "See more columns" או accordion.
אם יש באתר שלכם טבלה: בדקו מה קורה ב-375px. האם המשתמש צריך לגלול ימינה? האם הטקסט קריא? רשמו את ה-pattern הנוכחי שלכם (בדרך כלל "אין — פשוט מתכווצת"). בחרו את ה-pattern המתאים מהשלושה (בתרגיל 4 תמירו).
10.10 Responsive Spacing Scale — clamp(), ולמה spacing צריך לגדול
טעות שחוזרת בכל אתר AI: spacing זהה בכל המסכים. 48px padding בין sections ב-desktop — 48px גם במובייל. זה קטסטרופה. ב-desktop זה נראה "אוויר", במובייל זה 48px מתוך 667 (iPhone SE) = 7% מהגובה שבוזבז. Spacing חייב להיות responsive — גדל עם המסך.
הסולם המומלץ
| viewport | Section padding (אנכי) | Container padding (אופקי) | Card padding |
|---|---|---|---|
| Mobile (< 640) | 48px | 16px | 16-20px |
| Tablet (640-1023) | 64-80px | 24-32px | 24px |
| Desktop (1024-1535) | 96-120px | 32-48px | 24-32px |
| Wide (≥ 1536) | 120-160px | 48-80px | 32-40px |
שיטה 1: breakpoints מפורשים
.section {
padding-block: 48px;
padding-inline: 16px;
}
@media (min-width: 640px) {
.section {
padding-block: 64px;
padding-inline: 24px;
}
}
@media (min-width: 1024px) {
.section {
padding-block: 96px;
padding-inline: 48px;
}
}
שיטה 2: clamp() — fluid spacing בלי breakpoints
זו השיטה המודרנית. clamp(min, preferred, max) מאפשר spacing שגדל ביחס לרוחב המסך, בין min ל-max:
:root {
/* fluid spacing — גדל חלק עם המסך */
--pad-section-y: clamp(48px, 8vw, 160px);
--pad-section-x: clamp(16px, 4vw, 80px);
--pad-card: clamp(16px, 2.5vw, 32px);
--gap-grid: clamp(16px, 3vw, 48px);
}
.section {
padding-block: var(--pad-section-y);
padding-inline: var(--pad-section-x);
}
.card {
padding: var(--pad-card);
}
.grid {
display: grid;
gap: var(--gap-grid);
}
היופי של clamp: ב-320px רוחב, 8vw = 25.6px, אבל ה-min הוא 48px — אז זה 48. ב-1920px, 8vw = 153.6px, אבל ה-max הוא 160px — אז זה 153. בין לבין, זה נע באופן חלק. לא צריך breakpoints.
היתרון: spacing נראה טבעי בכל גודל מסך, ללא "קפיצות" ב-breakpoints. החיסרון: פחות שליטה מדויקת, ודורש הבנה של vw units.
המלצה: השתמשו ב-clamp() ל-spacing כללי (section padding, gaps), ו-ב-breakpoints מפורשים ל-layout decisions (1 column vs 2 columns). זה שילוב אופטימלי של פשטות ושליטה.
10.11 Content Max-Width — 640/960/1600 ומה מתאים למה
ה-max-width של תוכן היא אחת ההחלטות הכי חשובות בעיצוב responsive. יותר מדי רחב — אי אפשר לקרוא. צר מדי — מרגיש לא יעיל. הכלל: 45-75 תווים לשורה אופטימלי לקריאות (זו Research ישנה של Baymard Institute).
הסולם המומלץ
| סוג תוכן | Max-Width | למה |
|---|---|---|
| Blog / Article / פסקת טקסט ארוכה | 640-760px (40-48rem) | 45-75 תווים לשורה — אופטימלי לקריאה ברצף |
| Landing Page Content | 960-1140px (60-71rem) | מקום ל-multi-column content, forms, CTAs |
| Dashboard / App Content | 1280-1440px (80-90rem) | צריך מקום לרכיבים מרובים במקביל |
| Hero images / Full-bleed | 1600-2560px | דרמה ויזואלית — התמונה צריכה לתפוס את העין |
| ללא הגבלה (full-bleed) | 100vw | backgrounds, gradients, סרטונים דקורטיביים |
הקוד המעשי
:root {
--width-prose: 40rem; /* 640px — טקסט ארוך */
--width-content: 64rem; /* 1024px — landing content */
--width-wide: 80rem; /* 1280px — dashboards, wide layouts */
--width-container: 90rem; /* 1440px — מכסה max של container */
}
.prose {
max-width: var(--width-prose);
margin-inline: auto;
}
.content {
max-width: var(--width-content);
margin-inline: auto;
padding-inline: var(--pad-section-x);
}
פתחו את האתר שלכם ב-desktop מלא (1920px). לכו לפסקה ארוכה של טקסט. ספרו תווים בשורה אחת ארוכה. רשמו: ____ תווים לשורה. אם מעל 85 — הטקסט רחב מדי, הוסיפו max-width: 40rem לפסקאות. אם מתחת ל-40 — הטקסט צר מדי, הרחיבו.
10.12 RTL Responsive — אתגרים ייחודיים לעברית
בניית אתר responsive בעברית מוסיפה שכבה של מורכבות. הנה 5 אתגרים ש-AI לא מטפל בהם בברירת-מחדל, וה-CSS ששובר אותם.
1. dir="rtl" + Flexbox — סדר מתהפך טבעית
כשה-HTML יש לו dir="rtl", flexbox מתהפך אוטומטית: justify-content: flex-start = ימין בעברית, שמאל באנגלית. זה עובד מצוין עם flex-direction: row. אבל: אם יש לכם אלמנט שחייב להיות תמיד משמאל (כמו logo חברה לועזית), השתמשו ב-flex-direction: row-reverse או ב-logical properties.
2. CSS Logical Properties — margin-inline-start במקום margin-left
זה השינוי הכי חשוב ל-RTL. במקום margin-left: 24px, השתמשו ב-margin-inline-start: 24px. ב-LTR זה שמאל, ב-RTL זה ימין — הכל אוטומטי.
| Physical (רע ל-RTL) | Logical (טוב לכל) |
|---|---|
margin-left | margin-inline-start |
margin-right | margin-inline-end |
padding-left | padding-inline-start |
left: 0 | inset-inline-start: 0 |
border-left | border-inline-start |
text-align: left | text-align: start |
Browser support ב-2026: 96%+ לכל ה-logical properties. אין סיבה לכתוב margin-left בפרויקט חדש.
3. Hebrew text overflow — אין hyphenation
באנגלית, כשטקסט ארוך, הדפדפן יכול לחלק מילה באמצע עם מקף (hyphens: auto). בעברית — זה לא עובד. אין hyphenation רשמי בעברית. מה זה אומר: מילה ארוכה כמו "הפגנה-ראווה-משותפת" יכולה לגלוש מחוץ לקונטיינר ב-narrow screens.
הפתרון: word-break: break-word + overflow-wrap: anywhere.
.prose,
.card-title {
word-break: break-word;
overflow-wrap: anywhere;
hyphens: none; /* מפורשות לעברית */
}
4. Layout flip issues — אייקונים ו-gradients
בעיה: חץ שמצביע ימינה (→) ב-LTR צריך להצביע שמאלה (←) ב-RTL. במקום 2 SVGs, השתמשו ב-transform: scaleX(-1) או ב-CSS rotate.
[dir="rtl"] .arrow-icon {
transform: scaleX(-1);
}
דוגמאות נוספות: gradients שנעים משמאל לימין (linear-gradient(to right, ...)), drop-shadows עם offset ימני (box-shadow: 8px 0 ...). כל זה צריך להתהפך ב-RTL.
5. Mixed content: עברית + אנגלית + מספרים
ב-landing page עברי, יש טקסט כמו "הכירו את ChatGPT-4 ב-$20 לחודש". המספרים והשמות הלועזיים צריכים להישאר LTR בתוך טקסט RTL. הדפדפן בדרך כלל עושה את זה אוטומטית עם Unicode bidi algorithm, אבל לפעמים צריך לעזור לו:
/* בכוח LTR לקטעים ספציפיים */
.ltr-text {
direction: ltr;
unicode-bidi: embed;
}
/* או ב-inline — <span dir="ltr">$20</span> */
AI לפעמים כותב CSS של:
margin-left: 24px ואז
[dir="rtl"] { margin-left: 0; margin-right: 24px; } — כלומר מכפיל את כל ה-CSS פעמיים. זה כבד, קשה לתחזוקה, ומוביל לטעויות. מה לעשות במקום: כתבו margin-inline-start: 24px פעם אחת, והדפדפן יתרגם אוטומטית לפי dir. חיסכון של 30-50% שורות CSS באתרי RTL.
10.13 Testing Workflow — DevTools, BrowserStack, מכשיר אמיתי
בדיקת responsive היא תהליך של 3 שכבות, לא חד-פעמי. כל שכבה תופסת baggage שונים.
שכבה 1: Chrome/Edge/Firefox DevTools Responsive Mode
הכי מהיר, הכי נגיש. Ctrl+Shift+M (Windows) / Cmd+Option+M (Mac) פותח את ה-responsive mode.
- מה שהוא תופס: שבירות layout, text overflow, breakpoints שלא עובדים, גדלים כלליים.
- מה שלא תופס: touch latency, scroll jank, thermal throttling, real network conditions, צבעים אמיתיים, battery drain.
- tip: השתמשו ב-Device Mode עם throttling של 4G, לא Wi-Fi. זה מדמה תנאי מובייל אמיתיים.
שכבה 2: BrowserStack / LambdaTest / Real Device Cloud
שירותים שנותנים לכם גישה ל-2000+ מכשירים אמיתיים בענן. BrowserStack לא חינם (מ-$29/חודש), אבל יש 14 יום trial, ולפני launch זה שווה את זה.
- מה שהוא תופס: באגים ספציפיים ל-iOS Safari vs Chrome Android vs Samsung Internet. בעיות של touch events, WebKit quirks.
- מה שלא תופס: תחושה אמיתית של אצבע על מסך, איך scroll מרגיש במכשיר שיש בו פחות RAM, thermal.
שכבה 3: מכשיר אמיתי בידיים
הדרך היחידה לתפוס חווית משתמש אמיתית. אין תחליף.
- מה שרק הוא תופס: scroll performance (FPS), touch latency (האם הכפתור מרגיש "לא מגיב"?), thermal throttling (האחרי 5 דקות שימוש CPU מאט), חיי סוללה (אנימציות כבדות שורפות אנרגיה), באגים של keyboard (iOS keyboard פותח מעל הדף ומסתיר inputs).
- workflow מעשי: אחרי כל session של עבודה — 5 דקות בדיקה על iPhone או Android. לפני launch — 30 דקות מקיפות על iPhone + מכשיר Android + מכשיר ישן (4+ שנים) אם אפשר.
| שלב בפרויקט | כלי עיקרי | זמן |
|---|---|---|
| תוך כדי פיתוח (כל שעה) | DevTools Responsive Mode | 1-2 דקות |
| בסוף יום עבודה | מכשיר אמיתי שבידיים (iPhone/Android) | 5-10 דקות |
| לפני deploy לstaging | BrowserStack (5-7 מכשירים עיקריים) | 30 דקות |
| לפני launch production | 2+ מכשירים אמיתיים + BrowserStack coverage | 60-90 דקות |
| רגרסיה חודשית | Lighthouse CI + DevTools | 10-15 דקות |
קחו את הטלפון שלכם. פתחו את האתר בדפדפן. עברו ב-3 עמודים עיקריים. רשמו:
- האם ה-hero LCP נטען תוך 2.5 שניות? (ספרו "אחת, שתיים, שתיים וחצי")
- האם אפשר להקיש על כל כפתור בלי לפגוע בשכן? (נסו עם יד אחת)
- האם יש horizontal scroll לא רצוי? (גלגלו ימינה-שמאלה)
- האם הטקסט קריא? לפחות 16px?
- האם scroll חלק? (גלגלו מהר למעלה ולמטה)
רשמו איזה עמוד יש לו את הבעיה הכי גדולה. זה המועמד הראשון לתיקון.
10.14 Responsive Audit Prompt + Mobile-First Site Template
שני פרומפטים שכל Vibe Coder צריך בכיס. הראשון — לאודיט של אתר קיים. השני — לבנייה חדשה מאפס.
Prompt 1: Responsive Audit Prompt
קופץ לאתר שכבר קיים, מוצא את הבעיות. העתקו את הפרומפט הבא, הדביקו ל-Claude/Cursor, והצמידו את קוד ה-CSS + HTML.
Please audit this website for mobile-first responsive design issues.
Check for and report:
1. MOBILE-FIRST CHECK: Are media queries using @media (min-width)
or @media (max-width)? Count each. If max-width dominates,
this is desktop-first and needs refactoring.
2. VIEWPORT META: Is <meta name="viewport"
content="width=device-width, initial-scale=1.0"> present?
3. BREAKPOINTS: List all breakpoint values. Flag any that aren't
standard (640, 768, 1024, 1280, 1536) without clear reason.
4. TOUCH TARGETS: Find all interactive elements (buttons, links,
inputs, icons). Flag any with width or height under 44px.
5. RESPONSIVE IMAGES: Find all <img> tags. Flag any missing
srcset, sizes, or loading attributes. Flag hero images with
loading="lazy" (this hurts LCP).
6. HORIZONTAL SCROLL: Check if any element has
width > 100vw or overflow issues at 320px viewport.
7. RTL LOGICAL PROPERTIES: If site is Hebrew/Arabic (dir="rtl"),
flag usage of margin-left/right, padding-left/right, left/right
positioning. Should use margin-inline-start/end,
padding-inline-start/end, inset-inline-start/end instead.
8. CONTAINER QUERIES OPPORTUNITY: Find components that appear
in multiple contexts (e.g., same .card in sidebar AND main).
These are candidates for @container queries.
9. SPACING RESPONSIVENESS: Check if section padding is responsive
(different values or clamp()). Fixed padding of 96px+ on mobile
is wasteful.
10. FONT SIZE ON MOBILE: Flag body text under 16px on mobile —
zooming required, hurts accessibility and bounce rate.
Output: Prioritized list of issues (Critical / Warning / Nice-to-have)
with specific line numbers and suggested fixes.
Prompt 2: Mobile-First Site Template Prompt
לבנייה חדשה, מאפס. הוסיפו אותו אחרי הפרומפטים של פרקים 1, 3, 4, 5 (colors, typography, layout).
Build this site mobile-first with the following
non-negotiable responsive specs:
=== BASE APPROACH ===
- Start all styles at 320px viewport as the default
- Use ONLY @media (min-width: X) — never max-width
- Progressive enhancement: add complexity at larger sizes
=== BREAKPOINTS (Tailwind defaults) ===
- sm: 640px — dual-column cards
- md: 768px — show sidebar, desktop navigation
- lg: 1024px — full desktop layout
- xl: 1280px — wider content max-width
- 2xl: 1536px — max spacing and container
=== RESPONSIVE SPACING (use clamp) ===
- Section padding-block: clamp(48px, 8vw, 160px)
- Section padding-inline: clamp(16px, 4vw, 80px)
- Card padding: clamp(16px, 2.5vw, 32px)
- Grid gap: clamp(16px, 3vw, 48px)
=== CONTENT MAX-WIDTHS ===
- Prose (article): 40rem (640px)
- Content (landing): 64rem (1024px)
- Wide (dashboard): 80rem (1280px)
=== TOUCH TARGETS ===
- All buttons and interactive elements: min-height: 44px, min-width: 44px
- 8px minimum gap between tap targets
- Use padding-based sizing on buttons, not width/height
=== RESPONSIVE IMAGES ===
- Every <img> must have srcset with at least 3 widths
(400w, 800w, 1200w) and sizes attribute
- Use <picture> with AVIF + WebP sources and JPEG fallback
- Hero / above-fold images: loading="eager" fetchpriority="high"
- Below-fold images: loading="lazy"
- Always include width and height attributes (prevents CLS)
=== NAVIGATION ===
- Mobile: slide-in drawer pattern (hamburger menu)
- Desktop (768px+): horizontal nav bar
- Ensure hamburger button is 44x44px minimum
=== CONTAINER QUERIES ===
- Use @container for reusable components (cards, article items)
- Use @media for layout shell (header, hero, footer)
=== RTL SUPPORT (if Hebrew/Arabic) ===
- Add dir="rtl" to <html>
- Use CSS logical properties: margin-inline-start,
padding-inline-end, inset-inline-start
- NEVER use margin-left/right directly
- Flip directional icons with transform: scaleX(-1) under [dir="rtl"]
=== VIEWPORT META (required) ===
<meta name="viewport" content="width=device-width, initial-scale=1.0">
=== TESTING CHECKLIST ===
After build, confirm:
- 320px width: no horizontal scroll
- All buttons are tap-able with adult thumb
- Hero image loads first (eager + high priority)
- Body text is 16px+ on mobile
- Section padding responsive (not fixed 96px everywhere)
העתיקו את Responsive Audit Prompt למעלה. פתחו את האתר הנוכחי שלכם. הדביקו את ה-HTML + CSS לתוך Claude/Cursor עם הפרומפט. קבלו את רשימת הבעיות. רשמו את 3 הבעיות הגדולות ביותר שהוא זיהה: 1. ___ 2. ___ 3. ___ . אלה ה-priorities שלכם לתיקון בפרק הבא.
10.15 תרגילים מעשיים
- בחרו דף אחד מהאתר הנוכחי שלכם (hero + 1-2 sections).
- פתחו את ה-CSS הרלוונטי. חפשו כל
@media (max-width: ...). - לכל
max-widthquery שמצאתם: (א) העתיקו את ה-rules שבתוכו, (ב) הפכו אותם ל-base styles (מחוץ ל-media), (ג) העבירו את ה-base הישן לתוך@media (min-width: ...)חדש עם ה-breakpoint המתאים (640/768/1024). - ודאו שה-base styles (ללא media) עובדים ב-320px רוחב. אם לא — חסרו אלמנטים נדרשים.
- רענו את הדפדפן ב-DevTools ב-3 גדלים: 320, 768, 1440. האתר צריך להיראות זהה לפני ואחרי — הנקודה היא רק שהקוד הפך ל-mobile-first.
- הוסיפו הערה בראש הקובץ:
/* Mobile-first: base = 320px, enhancements via min-width */. - התבוננו: ה-base style עכשיו משקף את ה-"minimum viable" של הדף. האם יש אלמנטים מיותרים גם במובייל? שקלו אם הם צריכים להופיע רק ב-md+.
מה צריך להיות בסוף: קובץ CSS מרופקטר ב-mobile-first, עם 0 max-width queries, 3+ min-width queries, וצילומי מסך של הדף ב-320/768/1440 שמראים שלא נשברו דברים.
- בחרו את ה-hero image של האתר שלכם (או תמונה מרכזית אחרת).
- פתחו Squoosh.app. העלו את התמונה המקורית.
- ייצאו את התמונה ב-3 פורמטים (AVIF, WebP, JPEG) × 3 רזולוציות (400w, 800w, 1200w) = 9 קבצים. שמות:
hero-400.avif,hero-400.webp,hero-400.jpg,hero-800.avifוכו'. - העלו את כל 9 הקבצים ל-public folder / CDN שלכם.
- החליפו את ה-
<img>הקיים ב-<picture>מלא לפי הדוגמה ב-section 10.6 (3<source>tags +<img>fallback). - ודאו ש: (א) יש
widthו-heightattributes (מונעים CLS), (ב)loading="eager"ו-fetchpriority="high"על hero, (ג)sizesattribute נכון לפי ה-layout. - בדקו ב-DevTools → Network → Img: (א) איזה פורמט נטען (ידידותי ל-Chrome/Edge: AVIF); (ב) איזה רוחב (ב-375px viewport צריך להיות 400w); (ג) המשקל — האם קטן ב-50%+ מהמקורי?
- הריצו Lighthouse (DevTools → Lighthouse → Mobile). רשמו את ה-LCP לפני ואחרי השיפור.
מה צריך להיות בסוף: <picture> component מוכן בקוד, 9 קבצי תמונה ב-CDN, ו-before/after של Lighthouse LCP (צריך ירידה של 0.5-1.5 שניות אם המקורי היה JPEG כבד).
- פתחו את האתר ב-DevTools, responsive mode, 375px width. הפעילו Inspect.
- רשמו כל כפתור/קישור/אייקון אינטראקטיבי שמופיע באתר. לכל אחד: רשמו width × height.
- סמנו את כל מה שמתחת ל-44×44 ב-❌.
- לכל element שסומן: (א) אם הוא כפתור/CTA — הוסיפו
min-width: 44px; min-height: 44px; padding: 12px 20px; (ב) אם הוא אייקון שחייב להישאר קטן ויזואלית — השתמשו ב-hit-area expansion עם::beforepseudo-element (ראו section 10.7). - בדקו את ה-spacing בין touch targets. אם יש 2 כפתורים צמודים (כמו "Accept/Decline cookies") — ודאו שיש gap של לפחות 8px ביניהם.
- טסטו על מכשיר אמיתי (האייפון/אנדרואיד בכיס). האם אפשר להקיש על כל כפתור בלי לפגוע בשכן?
- תקנו כל בעיה שנמצאה. רשמו: כמה כפתורים תוקנו? כמה אייקונים קיבלו hit-area?
מה צריך להיות בסוף: טבלה של כל ה-interactive elements עם מידות before/after, רשימת תיקונים (X כפתורים, Y אייקונים), ו-video/GIF של 5 שניות שמראה בדיקה על מכשיר אמיתי.
- בחרו טבלה באתר שלכם (pricing, comparison, features, data). אם אין — צרו pricing table של 3 חבילות × 6 שורות.
- העתיקו את הקוד המלא של "Pattern 2: Stack-as-Cards" מ-section 10.9.
- הוסיפו
data-labelattribute לכל<td>עם שם ה-column (לדוגמה:<td data-label="מחיר">₪99</td>). - העתיקו את ה-CSS של
.responsive-table— כולל ה-base mobile styles וה-@media (min-width: 768px)ל-desktop. - בדקו ב-DevTools ב-375px: האם כל שורה הפכה לכרטיס? האם ה-label מופיע משמאל והערך מימין (או הפוך ב-RTL)? האם הכרטיסים מרווחים זה מזה?
- בדקו ב-768px ומעלה: האם הטבלה חזרה להיות טבלה רגילה? האם ה-headers מופיעים? האם ה-data-labels לא מופיעים פעמיים?
- הריצו על 3 viewport widths: 375, 768, 1440. צלמו מסך של כל אחד.
- אופציונלי: הוסיפו hover state על כרטיסים במובייל (
:activeוגם:focus-within), border accent לכרטיס "מומלץ" (.featured).
מה צריך להיות בסוף: Stack-as-Cards table שעובד, HTML + CSS מלאים, 3 screenshots (375/768/1440), ותגובה כנה — האם ה-UX במובייל טוב יותר מאשר טבלה עם horizontal scroll? (התשובה: כן, משמעותית.)
| תדירות | מה לעשות | כמה זמן |
|---|---|---|
| יומי | בסוף כל session של פיתוח — בדקו את העמוד ב-DevTools ב-375px, ואז קחו את הטלפון שלכם ובדקו את הדף ב-Chrome/Safari אמיתי. 3 דברים בלבד: horizontal scroll? Touch targets? LCP מהיר? | 5 דקות |
| שבועי | הריצו את Responsive Audit Prompt (section 10.14) על הפרויקט הפעיל. תקנו את 3 ה-Critical issues הראשונים. בנוסף לשגרה מפרק 5 — בדקו שה-spacing system עדיין עקבי, גם במובייל. | 30 דקות |
| חודשי | הריצו Lighthouse Mobile על 3 עמודים עיקריים. רשמו את LCP, CLS, INP. השוו לחודש שעבר. אם LCP עלה — ה-image optimization שבר. אם CLS עלה — כנראה שוכנע missing width/height על תמונות חדשות. | 45 דקות |
קחו את הפרומפט "Mobile-First Site Template Prompt" מ-section 10.14, ושמרו אותו כ-snippet/note שאליו אתם מתייחסים בכל פרויקט חדש עם AI. הוא מכריח את AI להשתמש ב-min-width, ב-breakpoints סטנדרטיים, ב-touch targets 44×44, ב-responsive images, וב-RTL logical properties — מההתחלה. זה לבדו מכסה 80% מהבעיות ש-AI בונה בברירת-מחדל. 5 דקות של הכנת הפרומפט חוסכות 5 שעות של תיקונים ב-responsive בכל פרויקט. אם אתם עושים רק את זה — הרווחתם.
- למה
min-widthעדיף עלmax-widthב-media queries? תנו 3 סיבות. (רמז: mobile-first philosophy, CSS bundle במובייל, סדר החשיבה "base + enhancements") - מתי משתמשים ב-Container Queries ומתי ב-Media Queries? תנו דוגמה לכל אחד. (רמז: שלד אתר / רכיב לשימוש חוזר; hero / card שנמצא ב-sidebar וב-main)
- למה אסור
loading="lazy"על תמונת hero? מה זה שובר? (רמז: LCP, above the fold, Core Web Vitals) - מה המינימום של touch target size, ולמה דווקא 44px? איך מרחיבים את ה-hit area של אייקון קטן? (רמז: Apple HIG, אצבע גדולה,
::beforepseudo-element עםinset: -14px) - למה עברית דורשת
overflow-wrap: anywhere? במה זה שונה מאנגלית? (רמז: אין hyphenation בעברית, מילים ארוכות יכולות לגלוש)
בפרק הזה עברתם מ-"אתר שעובד ב-1920px ומתקרס ב-375px" לגישה מקיפה של responsive design mobile-first. הבנתם שהנתון של 60-70% mobile traffic בישראל הוא לא סטטיסטיקה לגיטית להתעלמות — זה המציאות שבה בנוי רוב המסעות של המשתמשים שלכם. ראיתם שהבעיה הבסיסית של AI היא @media (max-width) בברירת-מחדל, ושההמרה ל-@media (min-width) היא לא רק syntax — זו שינוי בדרך החשיבה.
בניתם Breakpoint System מבוסס Tailwind standards (640/768/1024/1280/1536) עם CSS custom properties ל-container max-widths. למדתם את ה-Decision Framework המרכזי של 2026: Media Queries לשלד, Container Queries לרכיבים. בניתם card שמתנהג שונה ב-sidebar מול main — אותו קוד, התנהגות שונה לפי קונטיינר. זו טכניקה שAI עדיין לא מציע ברירת-מחדל, ואתם עכשיו יכולים לבקש אותה.
השלמתם את Responsive Image Component המלא — <picture> עם AVIF, WebP, ו-JPEG fallback, srcset עם 3 רזולוציות, sizes מחושב, ו-loading attribute מותאם למיקום ב-fold. ראיתם למה תמונות הן הסיבה #1 ל-LCP גרוע ולמה Squoosh.app חוסך עד 80% במשקל. הבנתם את הטעות הקלאסית של loading="lazy" על hero image — שלכאורה משפרת, בפועל הורסת LCP.
תיקנתם Touch Targets לפי תקן 44×44px, למדתם את טכניקת ה-hit-area expansion עם pseudo-element לאייקונים קטנים, ובחרתם את ה-Hamburger Pattern הנכון (Slide-in Drawer / Full-Screen Overlay / Bottom Tab Bar) לפי סוג האתר שלכם. המרתם טבלה ל-Stack-as-Cards במובייל — ה-UX הנקי ביותר לנתונים ניתנים להשוואה.
הוספתם שכבת RTL Responsive קריטית לכל אתר בעברית: CSS logical properties (margin-inline-start במקום margin-left), טיפול ב-Hebrew text overflow (overflow-wrap: anywhere), flip של אייקונים דקורטיביים ב-dir="rtl", וניהול mixed Hebrew-English-numbers content. זו שכבה שAI לא מחזיק by default — ועכשיו יש לכם פרומפט שמכריח את זה.
יש לכם עכשיו 8 deliverables מוחשיים: (1) Breakpoint System עם custom properties, (2) Responsive Image Component, (3) "10 דברים לבדוק במובייל" checklist, (4) Container Queries Component, (5) Responsive Spacing עם clamp(), (6) Stack-as-Cards Table Pattern, (7) Responsive Audit Prompt + Mobile-First Site Template, ו-(8) מילון 15 מונחים. יחד עם Layout System מפרק 5, Colors מפרק 3, Typography מפרק 4 ו-Modern CSS מפרק 6 — יש לכם 80% מה-toolkit של מעצב web מקצועי ב-2026.
הגשר לפרק הבא: בפרק 10 בניתם את התשתית של responsive design. בפרק 11 — "Performance ו-Core Web Vitals — מהיר = מקצועי" — תחברו את זה למדידות קונקרטיות. תכירו את LCP (Largest Contentful Paint — יעד מתחת ל-2.5s), CLS (Cumulative Layout Shift — מתחת ל-0.1), ו-INP (Interaction to Next Paint — מתחת ל-200ms). ה-responsive images שבניתם כאן הם אחד משני ההשפעות הגדולות ביותר על LCP בישראל (השני הוא פונטים עבריים). ה-width/height attributes שלימדתם עצמכם לשים על כל תמונה — אלה מה שמונע CLS. תלמדו להריץ Lighthouse, לפרש את התוצאה (מה ירוק, מה אדום), ולבקש מ-AI אופטימיזציות ספציפיות: content-visibility: auto, contain: paint, critical CSS, font loading strategies. פרק 11 לוקח את ה-responsive מ"עובד" ל"מהיר", וזה ההבדל בין אתר מקצועי לאתר שהמשתמשים נוטשים לפני שהוא נטען.
- יש
<meta name="viewport" content="width=device-width, initial-scale=1.0">ב-<head> - אין
@media (max-width)— רק@media (min-width)(mobile-first) - ה-base styles עובדים ב-viewport של 320px (אי-פד mini בתצוגה מזערית)
- כל הכפתורים/קישורים האינטראקטיביים הם לפחות 44×44px
- יש gap של 8px מינימום בין touch targets סמוכים
- תמונת ה-hero יש לה
loading="eager"ו-fetchpriority="high" - כל התמונות מתחת ל-fold יש להן
loading="lazy" - תמונות מרכזיות משתמשות ב-
<picture>עם AVIF/WebP/JPEG fallback - כל
<img>יש לוwidthו-heightattributes (מונעים CLS) - טקסט body הוא 16px+ במובייל (לא דורש zoom)
- אין horizontal scroll ב-320px, 375px, 414px
- ב-RTL — משתמשים ב-
margin-inline-startולאmargin-left - יש
overflow-wrap: anywhereעל פסקאות ארוכות (לטיפול במילים עבריות ארוכות) - טבלאות עם 3+ עמודות משתמשות ב-stack-as-cards או horizontal scroll מתועד
- נבדק במכשיר אמיתי (לא רק DevTools) — iPhone או Android