10 שלב בניית היכולות

Responsive Design — Mobile First, לא Mobile Afterthought

בפרק הזה תהפכו את הגישה שלכם לגמרי: במקום לבנות ל-desktop ו"לתקן את המובייל בסוף" — תבנו מ-320px למעלה. תבינו למה 60-70% מהגולשים בישראל על מובייל, ולמה AI בונה ברירת-מחדל הפוך מזה. תבנו breakpoint system מבוסס CSS custom properties, תכירו את ההבדל בין media queries (לשלד) ל-Container Queries (לרכיבים) — התשובה של 2026 לresponsive components. תבנו responsive image component מלא עם <picture>, WebP, AVIF, srcset ו-sizes — שחוסך 50-80% משקל. תתקנו touch targets קטנים מ-44×44, תבחרו את ה-hamburger pattern הנכון, ותמירו טבלאות לכרטיסים במובייל. יהיו לכם פרומפט Responsive Audit + Mobile-First Site Template שיגרמו ל-AI לבנות mobile-first באמת.

מה יהיה לך בסוף הפרק הזה
מה תוכלו לעשות בסוף הפרק הזה
דרישות קדם
הפרויקט שלך

לאורך הקורס אתם בונים את היכולת להפוך אתר גנרי ש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 באתרי ישראל, יחד עם פונטים עבריים.

מילון מונחים — 15 מושגים מרכזיים בפרק
מונח (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
מתחיל 8 דקות חינם מושג

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.

נתוני מובייל בישראל (אומדן 2025-2026, דורש אימות לפרויקט ספציפי)

האחוזים משתנים לפי ערוץ הפצה, סוג התוכן ו-audience. הדרך היחידה לדעת את המספר האמיתי שלכם: Google Analytics → Reports → Tech → Device Category.

מה זה אומר כשמפתח/AI מתייחס למובייל כ-afterthought

"Mobile afterthought" הוא השם המדויק לבעיה: בונים ל-desktop, ואז "מתאימים" את המובייל כתוספת. הסימנים המובהקים של אתר עם mobile afterthought:

Do-Now: בדיקת ה-Mobile Traffic שלכם 3 דקות

פתחו Google Analytics (או Plausible/Fathom) של האתר העיקרי שלכם. לכו ל-Reports → Tech → Device Category. רשמו את ה-%:

אם Mobile מעל 50% — כל דקה שאתם משקיעים ב-responsive מוכפלת בערכה. אם אין לכם Analytics עדיין, הניחו 65% mobile כ-baseline ישראלי והמשיכו.

טעות נפוצה: להתבלבל בין "nice to have" לבין "חלק מהעיצוב"

Vibe Coders רבים מתייחסים ל-responsive design כאל "עוד פיצ'ר" — משהו שמוסיפים אחרי שה-desktop מוכן. זו אותה טעות כמו לחשוב ש-accessibility הוא bonus. ב-2026, responsive זה לא feature — זה תנאי סף לאתר שעובד. תחשבו על זה כך: אם 70% מהמשתמשים שלכם יראו את האתר נשבר, האם אפשר לקרוא לו "עובד"? התשובה: לא. מה לעשות במקום: תחשבו על mobile-first כבר בפרומפט הראשון ל-AI, לא בתיקון השלישי.

מתחיל 7 דקות חינם ניתוח

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:

  1. ה-base styles (מחוץ ל-@media) הם desktop. 120px padding, 64px font-size, grid של 2 עמודות — כל זה מיועד ל-1440px ולמעלה. המובייל מקבל "תיקון" שמבטל את ה-base.
  2. שימוש ב-max-width במקום min-width. זה הסימן הכי מובהק ל-desktop-first. max-width: 768px אומר "בגודל מסך קטן מ-768 — החליפי את ה-default". min-width: 768px אומר "בגודל מסך גדול מ-768 — שדרגי מה-mobile base".
  3. ה-mobile נראה כמו גרסה מוקטנת של ה-desktop. אותן 2 עמודות שהפכו ל-1, אותו padding שהתכווץ. לא נחשב מה האמת היא צריכה להיות במובייל — למשל, מיקום שונה של ה-CTA, הסרת תמונה דקורטיבית, או תצוגת headline אחרת.

למה AI עושה את זה

שתי סיבות מבניות:

המסקנה: אם לא אומרים ל-AI "mobile-first" מפורשות בפרומפט, בברירת-מחדל תקבלו desktop-first. "make it responsive" לא מספיק — זה רק גורם ל-AI להוסיף @media (max-width: 768px) בסוף. כדי לקבל mobile-first אמיתי, צריך פרומפט ספציפי. לזה נגיע ב-section 10.14.

Do-Now: פתחו את הפרויקט הנוכחי שלכם ב-DevTools 4 דקות

פתחו את הקובץ .css הראשי של פרויקט אחד שבניתם עם AI. חפשו את המחרוזת max-width ו-min-width בתוך @media. ספרו:

אם יש יותר max-width מ-min-width — ה-AI בנה לכם desktop-first. זה לא אסון, אבל זה מה שצריך לתקן.

מתחיל 10 דקות חינם מושג

10.3 Mobile-First — הפילוסופיה והקוד

Mobile-first זו לא דוגמה של "איך לכתוב CSS". זו גישה. המשמעות: ה-default של האתר הוא מובייל, וכל שאר הגדלים הם "שכבות שיפור" (progressive enhancement) שמתווספות לבסיס הזה. בקוד, זה מתורגם לשלושה כללים:

  1. Base styles = mobile styles. כל CSS שכתוב מחוץ ל-@media צריך לעבוד ב-320px.
  2. רק @media (min-width: ...), לעולם לא max-width. זה מאלץ אתכם לחשוב "מה מתווסף בגודל הזה ומעלה", במקום "מה אני צריך לבטל".
  3. 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

טיפ זהב: "Mobile isn't a small desktop"

זו אחת האמירות הקלאסיות של Luke Wroblewski (שטבע את המונח "Mobile First" ב-2011). מובייל זה לא "desktop קטן יותר". זה קונטקסט שונה: משתמש בתנועה, על 4G, עם אצבע, עם יד אחת, עם תשומת-לב מפוצלת. לכן גם התוכן לפעמים צריך להיות שונה — לא רק הגודל. למשל: ב-desktop אפשר להציג 3 טיפים, במובייל אולי עדיף טיפ אחד עם "קרא עוד".

Do-Now: המירו @media אחד 5 דקות

פתחו קובץ CSS אחד מהפרויקט שלכם. מצאו @media (max-width: ...) אחד. תרגיל ההמרה:

  1. העתיקו את מה שבתוך @media (max-width) החוצה — הופך ל-base style.
  2. מה שהיה ב-base מחוץ ל-@media — העתיקו אותו לתוך @media (min-width: ...) חדש.
  3. מחקו את ה-max-width query הישן.

שמרו, רעננו את הדפדפן, בדקו שהאתר נראה זהה. אם כן — מזל טוב, עשיתם המרה mobile-first אחת. אם לא — בדקו שהתוכן עבר נכון.

בינוני 10 דקות חינם הקמה

10.4 Breakpoint System — 640, 768, 1024, 1280, 1536

Breakpoints הם הרוחבים שבהם ה-layout שלכם "מחליט" לעשות משהו שונה. השאלה הגדולה: מאיפה להביא את המספרים? יש שתי גישות:

  1. לעקוב אחרי סטנדרט תעשייתי (Tailwind, Bootstrap) — פחות חשיבה, יותר עקביות, AI מכיר את המספרים.
  2. לקבוע לפי ה-content breaks שלכם — יותר מדויק, יותר עבודה, תלוי בעיצוב ספציפי.

המלצה: השתמשו ב-Tailwind defaults כ-baseline, והוסיפו breakpoints custom רק אם ה-content שלכם "נשבר" במקום ספציפי.

Tailwind Breakpoints — הסטנדרט של 2026

שםMin-widthטיפוסי מכשירשימוש
sm640pxמובייל גדול (iPhone Plus, Android landscape)לעבור מ-single column ל-2 columns ב-cards קטנים
md768pxטאבלט portrait (iPad Mini)הוספת sidebar, הצגת navigation dektop
lg1024pxטאבלט landscape, לפטופים קטניםfull desktop layout, 3 columns
xl1280pxלפטופ רגילwider hero, more whitespace
2xl1536pxמסך דסקטופ גדול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:

  1. פתחו DevTools במצב responsive.
  2. גררו את ה-viewport לאט-לאט מ-320 עד 1920.
  3. שימו לב לרגעים שבהם משהו "נראה רע" — טקסט נחתך, כפתור מתכווץ מדי, תמונה נשברת.
  4. בכל רגע כזה, רשמו את ה-width. זה breakpoint מועמד.
  5. אם ה-width קרוב (±20px) ל-breakpoint של Tailwind — השתמשו ב-Tailwind one. אם לא — הוסיפו custom.
מסגרת החלטה: באיזה Breakpoint System להשתמש
אם...השתמשו ב...למה
בונים עם 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 לא מכסים את הקצוות
Do-Now: מעבר על ה-breakpoints שלכם 4 דקות

פתחו קובץ CSS של פרויקט. חפשו את כל המספרים ב-@media. כתבו אותם ברשימה. השוו ל-Tailwind defaults (640/768/1024/1280/1536). אם יש מספרים "מוזרים" כמו 680 או 990 — בדקו: האם זה content break מכוון, או ש-AI זרק מספר אקראי? בדרך כלל זה השני. שנו אותם ל-breakpoints סטנדרטיים אלא אם יש סיבה ספציפית לשמור.

טעות נפוצה: breakpoints ב-px ספציפיים במקום ranges

מעצב אומר לכם "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) במקום במכשירים.

בינוני 12 דקות חינם מושג

10.5 Media Queries vs Container Queries — התשובה של 2026

Media Queries קיימים מ-2012. Container Queries קיבלו full browser support ב-2023. מה ההבדל, ומתי להשתמש בכל אחד?

Media QueriesContainer 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. פשוט הוא מגיב לקונטיינר שלו במקום למסך.

מסגרת החלטה: Media Queries או Container Queries

שאלו את עצמכם 3 שאלות על הרכיב:

  1. האם הרכיב מופיע רק במקום אחד בדף? (למשל hero, footer, navigation). אם כן ← Media Queries. הוא קשור ישירות ל-viewport.
  2. האם הרכיב מופיע במספר הקשרים עם רוחבים שונים? (למשל card שנמצא גם ב-sidebar, main, ו-modal). אם כן ← Container Queries.
  3. האם אני בונה ספריית קומפוננטים? (Design System, component library). אם כן ← Container Queries כברירת-מחדל. הקומפוננט לא יודע איפה ישתמשו בו.

הסיכום: רוב האתרים משתמשים בשילוב — media queries ל-80% (שלד), container queries ל-20% (רכיבים שנודדים). זה לא או-או.

Do-Now: זהו רכיב מועמד ל-Container Query 3 דקות

פתחו את האתר הנוכחי שלכם. חפשו רכיב שמופיע במספר מקומות — למשל, אותו card שנמצא גם ברשת של 3 עמודות, גם בודד ב-hero, וגם ב-sidebar אם יש לכם. רשמו את שמו: ____ . זה המועמד המושלם ל-Container Query. בתרגיל 1 תמירו אותו.

בינוני 15 דקות חינם הקמה

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"
/>

הסבר על השדות:

<picture> — art direction + format fallback

<picture> הוא לשני use cases:

  1. Art direction: crop שונה למובייל ול-desktop (למשל, במובייל מקרבים את הפנים של האדם בתמונה, ב-desktop מראים את כל הסצנה).
  2. 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>

פורמטים מודרניים — כמה חוסכים באמת

פורמטחיסכון מ-JPEGBrowser support 2026שימוש מומלץ
JPEGbaseline100%fallback אוניברסלי
WebP25-35%97%+ברירת מחדל לכל תמונה
AVIF50-80%90%+עדיפות ראשונה כשאפשר
PNGגדול יותר מ-JPEG100%רק לתמונות עם שקיפות או עריכה ללא-אובדן

איך ממירים תמונות: 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 על תמונת hero — LCP נהרס

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.

Do-Now: בדיקת משקל התמונות שלכם 4 דקות

פתחו את האתר שלכם. DevTools → Network → Filter: Img. רענו את הדף. רשמו:

כל תמונה מעל 200KB במובייל היא candidate לאופטימיזציה. סכום כולל מעל 1MB — חובה לטפל. כל תמונה ב-JPEG רגיל (לא WebP/AVIF) — candidate להמרה ב-Squoosh.

מתחיל 8 דקות חינם הקמה

10.7 Touch Targets — 44×44px, ו-hit-area expansion

כפתור של 30×30px נראה בסדר ב-DevTools, אבל במובייל אמיתי המשתמש מקיש עליו ולחוץ על הכפתור השכן. זו הסיבה הראשונה לנטישה במובייל — יותר מעומס או עיצוב מכוער. Apple HIG ו-Material Design הגיעו לאותו מסקנה משתי דרכים שונות: אזור אינטראקטיבי חייב להיות לפחות 44×44pt (Apple) / 48×48dp (Material).

איפה זה חשוב במיוחד

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 נותן גמישות */
}
Do-Now: Touch Target Audit 5 דקות

פתחו את האתר שלכם ב-DevTools responsive mode, 375px width. מצב inspect. הקישו על כל כפתור/קישור וראו את המידות:

כל כפתור/אייקון שנמצא בעייתי — רשמו אותו. בתרגיל 3 תתקנו את כולם.

בינוני 10 דקות חינם אסטרטגיה

10.8 Hamburger Menu — 3 patterns ומתי כל אחד

ה-"Hamburger Menu" (האייקון של 3 קווים שפותח ניווט) הוא הסטנדרט הדה-פקטו של ניווט במובייל. אבל יש 3 patterns עיקריים של איך הוא מתנהג כשלוחצים — ולכל אחד יש use case שונה.

Pattern 1: Slide-in Drawer

המקובל ביותר. התפריט מחליק מהצד (ימין ב-LTR, שמאל ב-RTL) ומכסה כ-70-80% מהרוחב. שאר המסך נהיה overlay חצי-שקוף.

Pattern 2: Full-Screen Overlay

התפריט מכסה 100% מהמסך. רקע מלא (לרוב dark ומאותגר עיצובית), type גדול, נתונים נוספים (תמונות, micro-copy).

Pattern 3: Bottom Tab Bar

לא hamburger במלוא המובן — יש 4-5 אייקונים בתחתית המסך, קבועים, נגישים תמיד. כמו אפליקציה native.

מסגרת החלטה: איזה Hamburger Pattern לבחור
סוג האתרמספר קישוריםPattern מומלץ
SaaS / Marketing Site5-8Slide-in Drawer
Ecommerce10-20 (קטגוריות)Slide-in Drawer עם accordion
Agency / Portfolio3-6Full-Screen Overlay
News / Content5-7 mainBottom Tab Bar + drawer ל-more
B2B / Dashboard15+Slide-in Drawer עם search + accordion
App-like PWA3-5 coreBottom Tab Bar

מתי לשמור על navigation רגיל גם במובייל

לפעמים hamburger הוא over-engineering. אם יש לכם 3 קישורים בלבד (Home, Services, Contact), שמרו אותם גלויים גם במובייל — רק הקטינו את הגודל. לחוויה טובה יותר: אל תחביאו ניווט פשוט מאחורי hamburger.

Do-Now: בחרו pattern לאתר שלכם 3 דקות

חשבו על האתר הנוכחי. ענו:

אם האתר הנוכחי משתמש ב-pattern אחר — שקלו שינוי. אם הוא מתאים — מצוין, תמשיכו.

בינוני 12 דקות חינם הקמה

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;
}

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;
    }
}
Do-Now: בחרו pattern לטבלה שלכם 3 דקות

אם יש באתר שלכם טבלה: בדקו מה קורה ב-375px. האם המשתמש צריך לגלול ימינה? האם הטקסט קריא? רשמו את ה-pattern הנוכחי שלכם (בדרך כלל "אין — פשוט מתכווצת"). בחרו את ה-pattern המתאים מהשלושה (בתרגיל 4 תמירו).

בינוני 8 דקות חינם הקמה

10.10 Responsive Spacing Scale — clamp(), ולמה spacing צריך לגדול

טעות שחוזרת בכל אתר AI: spacing זהה בכל המסכים. 48px padding בין sections ב-desktop — 48px גם במובייל. זה קטסטרופה. ב-desktop זה נראה "אוויר", במובייל זה 48px מתוך 667 (iPhone SE) = 7% מהגובה שבוזבז. Spacing חייב להיות responsive — גדל עם המסך.

הסולם המומלץ

viewportSection padding (אנכי)Container padding (אופקי)Card padding
Mobile (< 640)48px16px16-20px
Tablet (640-1023)64-80px24-32px24px
Desktop (1024-1535)96-120px32-48px24-32px
Wide (≥ 1536)120-160px48-80px32-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.

החלטה מעשית: שיטה 1 או שיטה 2?

המלצה: השתמשו ב-clamp() ל-spacing כללי (section padding, gaps), ו-ב-breakpoints מפורשים ל-layout decisions (1 column vs 2 columns). זה שילוב אופטימלי של פשטות ושליטה.

מתחיל 6 דקות חינם הקמה

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 Content960-1140px (60-71rem)מקום ל-multi-column content, forms, CTAs
Dashboard / App Content1280-1440px (80-90rem)צריך מקום לרכיבים מרובים במקביל
Hero images / Full-bleed1600-2560pxדרמה ויזואלית — התמונה צריכה לתפוס את העין
ללא הגבלה (full-bleed)100vwbackgrounds, 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);
}
Do-Now: מדידת line-length באתר שלכם 3 דקות

פתחו את האתר שלכם ב-desktop מלא (1920px). לכו לפסקה ארוכה של טקסט. ספרו תווים בשורה אחת ארוכה. רשמו: ____ תווים לשורה. אם מעל 85 — הטקסט רחב מדי, הוסיפו max-width: 40rem לפסקאות. אם מתחת ל-40 — הטקסט צר מדי, הרחיבו.

מתקדם 10 דקות חינם מושג

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-leftmargin-inline-start
margin-rightmargin-inline-end
padding-leftpadding-inline-start
left: 0inset-inline-start: 0
border-leftborder-inline-start
text-align: lefttext-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> */
טעות נפוצה: שכפול CSS לכל כיוון במקום logical properties

AI לפעמים כותב CSS של: margin-left: 24px ואז [dir="rtl"] { margin-left: 0; margin-right: 24px; } — כלומר מכפיל את כל ה-CSS פעמיים. זה כבד, קשה לתחזוקה, ומוביל לטעויות. מה לעשות במקום: כתבו margin-inline-start: 24px פעם אחת, והדפדפן יתרגם אוטומטית לפי dir. חיסכון של 30-50% שורות CSS באתרי RTL.

מתחיל 8 דקות freemium כלי

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.

שכבה 2: BrowserStack / LambdaTest / Real Device Cloud

שירותים שנותנים לכם גישה ל-2000+ מכשירים אמיתיים בענן. BrowserStack לא חינם (מ-$29/חודש), אבל יש 14 יום trial, ולפני launch זה שווה את זה.

שכבה 3: מכשיר אמיתי בידיים

הדרך היחידה לתפוס חווית משתמש אמיתית. אין תחליף.

מסגרת החלטה: מתי כל כלי testing
שלב בפרויקטכלי עיקריזמן
תוך כדי פיתוח (כל שעה)DevTools Responsive Mode1-2 דקות
בסוף יום עבודהמכשיר אמיתי שבידיים (iPhone/Android)5-10 דקות
לפני deploy לstagingBrowserStack (5-7 מכשירים עיקריים)30 דקות
לפני launch production2+ מכשירים אמיתיים + BrowserStack coverage60-90 דקות
רגרסיה חודשיתLighthouse CI + DevTools10-15 דקות
Do-Now: בדיקה במכשיר אמיתי 5 דקות

קחו את הטלפון שלכם. פתחו את האתר בדפדפן. עברו ב-3 עמודים עיקריים. רשמו:

רשמו איזה עמוד יש לו את הבעיה הכי גדולה. זה המועמד הראשון לתיקון.

בינוני 15 דקות חינם אסטרטגיה

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)
Do-Now: הריצו את Audit Prompt 7 דקות

העתיקו את Responsive Audit Prompt למעלה. פתחו את האתר הנוכחי שלכם. הדביקו את ה-HTML + CSS לתוך Claude/Cursor עם הפרומפט. קבלו את רשימת הבעיות. רשמו את 3 הבעיות הגדולות ביותר שהוא זיהה: 1. ___ 2. ___ 3. ___ . אלה ה-priorities שלכם לתיקון בפרק הבא.

10.15 תרגילים מעשיים

בינוני 90 דקות (כל ה-4 תרגילים) חינם תרגול
תרגיל 1: Mobile-First Refactor 25 דקות
  1. בחרו דף אחד מהאתר הנוכחי שלכם (hero + 1-2 sections).
  2. פתחו את ה-CSS הרלוונטי. חפשו כל @media (max-width: ...).
  3. לכל max-width query שמצאתם: (א) העתיקו את ה-rules שבתוכו, (ב) הפכו אותם ל-base styles (מחוץ ל-media), (ג) העבירו את ה-base הישן לתוך @media (min-width: ...) חדש עם ה-breakpoint המתאים (640/768/1024).
  4. ודאו שה-base styles (ללא media) עובדים ב-320px רוחב. אם לא — חסרו אלמנטים נדרשים.
  5. רענו את הדפדפן ב-DevTools ב-3 גדלים: 320, 768, 1440. האתר צריך להיראות זהה לפני ואחרי — הנקודה היא רק שהקוד הפך ל-mobile-first.
  6. הוסיפו הערה בראש הקובץ: /* Mobile-first: base = 320px, enhancements via min-width */.
  7. התבוננו: ה-base style עכשיו משקף את ה-"minimum viable" של הדף. האם יש אלמנטים מיותרים גם במובייל? שקלו אם הם צריכים להופיע רק ב-md+.

מה צריך להיות בסוף: קובץ CSS מרופקטר ב-mobile-first, עם 0 max-width queries, 3+ min-width queries, וצילומי מסך של הדף ב-320/768/1440 שמראים שלא נשברו דברים.

תרגיל 2: Responsive Image Component מלא 30 דקות
  1. בחרו את ה-hero image של האתר שלכם (או תמונה מרכזית אחרת).
  2. פתחו Squoosh.app. העלו את התמונה המקורית.
  3. ייצאו את התמונה ב-3 פורמטים (AVIF, WebP, JPEG) × 3 רזולוציות (400w, 800w, 1200w) = 9 קבצים. שמות: hero-400.avif, hero-400.webp, hero-400.jpg, hero-800.avif וכו'.
  4. העלו את כל 9 הקבצים ל-public folder / CDN שלכם.
  5. החליפו את ה-<img> הקיים ב-<picture> מלא לפי הדוגמה ב-section 10.6 (3 <source> tags + <img> fallback).
  6. ודאו ש: (א) יש width ו-height attributes (מונעים CLS), (ב) loading="eager" ו-fetchpriority="high" על hero, (ג) sizes attribute נכון לפי ה-layout.
  7. בדקו ב-DevTools → Network → Img: (א) איזה פורמט נטען (ידידותי ל-Chrome/Edge: AVIF); (ב) איזה רוחב (ב-375px viewport צריך להיות 400w); (ג) המשקל — האם קטן ב-50%+ מהמקורי?
  8. הריצו Lighthouse (DevTools → Lighthouse → Mobile). רשמו את ה-LCP לפני ואחרי השיפור.

מה צריך להיות בסוף: <picture> component מוכן בקוד, 9 קבצי תמונה ב-CDN, ו-before/after של Lighthouse LCP (צריך ירידה של 0.5-1.5 שניות אם המקורי היה JPEG כבד).

תרגיל 3: Touch Target Audit + Fix 20 דקות
  1. פתחו את האתר ב-DevTools, responsive mode, 375px width. הפעילו Inspect.
  2. רשמו כל כפתור/קישור/אייקון אינטראקטיבי שמופיע באתר. לכל אחד: רשמו width × height.
  3. סמנו את כל מה שמתחת ל-44×44 ב-❌.
  4. לכל element שסומן: (א) אם הוא כפתור/CTA — הוסיפו min-width: 44px; min-height: 44px; padding: 12px 20px; (ב) אם הוא אייקון שחייב להישאר קטן ויזואלית — השתמשו ב-hit-area expansion עם ::before pseudo-element (ראו section 10.7).
  5. בדקו את ה-spacing בין touch targets. אם יש 2 כפתורים צמודים (כמו "Accept/Decline cookies") — ודאו שיש gap של לפחות 8px ביניהם.
  6. טסטו על מכשיר אמיתי (האייפון/אנדרואיד בכיס). האם אפשר להקיש על כל כפתור בלי לפגוע בשכן?
  7. תקנו כל בעיה שנמצאה. רשמו: כמה כפתורים תוקנו? כמה אייקונים קיבלו hit-area?

מה צריך להיות בסוף: טבלה של כל ה-interactive elements עם מידות before/after, רשימת תיקונים (X כפתורים, Y אייקונים), ו-video/GIF של 5 שניות שמראה בדיקה על מכשיר אמיתי.

תרגיל 4: Stack-as-Cards Table 25 דקות
  1. בחרו טבלה באתר שלכם (pricing, comparison, features, data). אם אין — צרו pricing table של 3 חבילות × 6 שורות.
  2. העתיקו את הקוד המלא של "Pattern 2: Stack-as-Cards" מ-section 10.9.
  3. הוסיפו data-label attribute לכל <td> עם שם ה-column (לדוגמה: <td data-label="מחיר">₪99</td>).
  4. העתיקו את ה-CSS של .responsive-table — כולל ה-base mobile styles וה-@media (min-width: 768px) ל-desktop.
  5. בדקו ב-DevTools ב-375px: האם כל שורה הפכה לכרטיס? האם ה-label מופיע משמאל והערך מימין (או הפוך ב-RTL)? האם הכרטיסים מרווחים זה מזה?
  6. בדקו ב-768px ומעלה: האם הטבלה חזרה להיות טבלה רגילה? האם ה-headers מופיעים? האם ה-data-labels לא מופיעים פעמיים?
  7. הריצו על 3 viewport widths: 375, 768, 1440. צלמו מסך של כל אחד.
  8. אופציונלי: הוסיפו hover state על כרטיסים במובייל (:active וגם :focus-within), border accent לכרטיס "מומלץ" (.featured).

מה צריך להיות בסוף: Stack-as-Cards table שעובד, HTML + CSS מלאים, 3 screenshots (375/768/1440), ותגובה כנה — האם ה-UX במובייל טוב יותר מאשר טבלה עם horizontal scroll? (התשובה: כן, משמעותית.)

שגרת עבודה: שמירה על Responsive Quality
תדירותמה לעשותכמה זמן
יומי בסוף כל 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 בכל פרויקט. אם אתם עושים רק את זה — הרווחתם.

בדקו את עצמכם — 5 שאלות
  1. למה min-width עדיף על max-width ב-media queries? תנו 3 סיבות. (רמז: mobile-first philosophy, CSS bundle במובייל, סדר החשיבה "base + enhancements")
  2. מתי משתמשים ב-Container Queries ומתי ב-Media Queries? תנו דוגמה לכל אחד. (רמז: שלד אתר / רכיב לשימוש חוזר; hero / card שנמצא ב-sidebar וב-main)
  3. למה אסור loading="lazy" על תמונת hero? מה זה שובר? (רמז: LCP, above the fold, Core Web Vitals)
  4. מה המינימום של touch target size, ולמה דווקא 44px? איך מרחיבים את ה-hit area של אייקון קטן? (רמז: Apple HIG, אצבע גדולה, ::before pseudo-element עם inset: -14px)
  5. למה עברית דורשת 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 מ"עובד" ל"מהיר", וזה ההבדל בין אתר מקצועי לאתר שהמשתמשים נוטשים לפני שהוא נטען.

צ'קליסט — 15 דברים לבדוק במובייל לפני launch