למה אנימציה זהה יכולה להרגיש רובוטית או קסומה — והתשובה היא לא הקוד, אלא העקומה. בפרק הזה תלמדו את המדע מאחורי תנועה טבעית — easing curves, spring physics, timing, stagger, choreography — ותצאו עם כלים שהופכים כל אנימציה "שעובדת" לאנימציה "שמרגישה נכון"
בפרק 2 בניתם 8 אנימציות CSS מאפס — fade-in, slide-up, bounce ועוד. בפרק הזה תלמדו להפוך אותן מ"עובדות" ל"מרגישות נכון" — עם easing, timing ו-choreography שהופכים תנועה מכנית לתנועה טבעית. בפרק 4 תשתמשו ב-GSAP כדי לקחת את עקרונות ה-easing שלמדתם ולבנות timelines מורכבים שלא ניתנים ב-CSS בלבד.
| מונח (English) | תרגום | הגדרה |
|---|---|---|
| Easing | עקומת האצה | פונקציה שמגדירה את הקצב שבו אנימציה מתקדמת — במקום מהירות אחידה, מאיצה או מאטה |
| Cubic-bezier | בזיה מעוקבת | פונקציה מתמטית עם 4 פרמטרים ששולטת בצורת עקומת ה-easing |
| Spring | קפיץ | מודל פיזיקלי שמדמה התנהגות קפיצית — bounce, overshoot, settle |
| Stagger | עיכוב מדורג | הפרש זמן קבוע בין הפעלת אנימציה על סדרת אלמנטים |
| Duration | משך | כמה זמן (במילישניות) האנימציה נמשכת |
| Delay | עיכוב | זמן המתנה לפני שהאנימציה מתחילה |
| Choreography | כוריאוגרפיה | תיאום בין אנימציות מרובות — סדר, תזמון, ויחסים ביניהן |
| Linear | ליניארי | easing שבו המהירות קבועה — נראה מכני ולא טבעי |
| Ease-in-out | האצה-האטה | מתחיל איטי, מאיץ באמצע, מאט בסוף — הדפוס הטבעי ביותר |
| Bounce | קפיצה | easing שמדמה חפץ שנופל ומקפץ לפני שנח |
| Elastic | גמיש | easing עם overshoot — האלמנט חורג מהיעד וחוזר, כמו גומייה |
| Damping | ריסון | פרמטר ב-spring שקובע כמה מהר התנודות נרגעות |
| Stiffness | קשיחות | פרמטר ב-spring שקובע את עוצמת הכוח — stiffness גבוה = תנועה מהירה וחדה |
| Overshoot | חריגה | כשאלמנט עובר את נקודת היעד ואז חוזר — מוסיף תחושת אנרגיה |
נתחיל עם שאלה פשוטה: למה אנימציה ב-PowerPoint מרגישה "זולה", אבל אנימציה באתר של Apple מרגישה "יוקרתית"? שניהם עושים fade-in. שניהם מזיזים אלמנטים ממקום למקום. ההבדל הוא לא מה זז — אלא איך זה זז. PowerPoint משתמש ב-easing גנרי (או גרוע מזה — linear). Apple מכיילת כל עקומה, כל duration, כל delay בקפדנות. זה ההבדל בין תנועה מכנית לתנועה שמרגישה "חיה".
ב-1981 פרסמו פרנק תומאס ואולי ג'ונסטון, שני אנימטורים ותיקים של דיסני, את הספר The Illusion of Life. בתוכו הם תיארו 12 עקרונות אנימציה שהנחו את דיסני מאז שנות ה-30. שלושה מתוך 12 העקרונות עוסקים ישירות ב-timing ו-easing:
המסקנה: האנימציה עצמה (מה זז) היא רק חצי מהסיפור. איך זה זז — המהירות, ההאצה, ההאטה — זה מה שקובע אם זה מרגיש אמיתי או מזויף.
שאר 9 העקרונות של דיסני גם רלוונטיים לאנימציית web, אבל שלושת אלה הם הליבה. בואו נראה איך הם מתרגמים ל-CSS:
| עקרון דיסני | תרגום ל-CSS/JS | דוגמה פרקטית |
|---|---|---|
| Slow In / Slow Out | ease-in-out או cubic-bezier מותאם | כרטיס שנכנס למסך — מתחיל איטי, מאיץ, מאט לפני שנח |
| Timing | duration — 100ms vs 800ms | tooltip שמופיע ב-150ms (קל) vs מודאל שנפתח ב-400ms (כבד) |
| Secondary Action | אנימציות מקבילות עם delay | מודאל נפתח + רקע מיטשטש + overlay fade — שלוש אנימציות מתואמות |
| Anticipation | תנועה קטנה לכיוון ההפוך לפני התנועה העיקרית | כפתור שמצטמק ב-2px לפני שמתרחב — "מתכונן לקפוץ" |
| Follow Through | overshoot ב-cubic-bezier | אלמנט שחורג מהיעד ב-5% וחוזר — תחושת מומנטום |
| Squash & Stretch | scaleX + scaleY לא-אחיד | כדור שנופל: מתמתח לאורך בנפילה, מתרחב לרוחב בנגיעה |
אתם לא צריכים לזכור את כל 12 העקרונות. הנקודה היא: אנימטורים מקצועיים הבינו כבר ב-1930 שתזמון ועקומות הם הלב של תנועה משכנעת. 90 שנה אחרי, אותם עקרונות עובדים בדפדפן. כל הפרק הזה הוא בעצם תרגום של העקרונות האלה ל-CSS ו-JavaScript.
הנה דוגמה קונקרטית. קחו כפתור פשוט עם hover effect:
/* גרסה בסיסית — עובד אבל "מת" */
.btn:hover {
transform: scale(1.05);
transition: transform 200ms linear;
}
/* גרסה עם anticipation + follow-through — חי */
.btn {
transition: transform 300ms cubic-bezier(0.34, 1.56, 0.64, 1);
}
.btn:hover {
transform: scale(1.05);
}
.btn:active {
transform: scale(0.95); /* anticipation — "מתכונן לקפוץ" */
transition: transform 100ms ease-in;
}
ההבדל: הגרסה הראשונה פשוט מגדילה את הכפתור. הגרסה השנייה נותנת תחושה של "הכפתור מגיב לי" — הוא מצטמק בלחיצה (anticipation), מתרחב (action), חורג קצת מעבר ל-1.05 וחוזר (overshoot/follow-through). שלושה עקרונות דיסני בשלוש שורות CSS.
זו בדיוק הסיבה שאתם פה. בפרק 2 בניתם אנימציות שעובדות. בפרק הזה תלמדו לגרום להן להרגיש נכון.
פתחו easings.net. העבירו את העכבר מעל 3 עקומות שונות וצפו באנימציה. שימו לב: אותה תנועה (משמאל לימין) מרגישה שונה לחלוטין בכל easing. רשמו את השמות של 3 שהכי "הרגישו נכון" לכם — תחזרו אליהם בהמשך הפרק.
ברירת המחדל של כל דבר בעולם הדיגיטלי היא linear — מהירות קבועה מהתחלה ועד הסוף. הבעיה: שום דבר בעולם האמיתי לא זז כך. כשאתם זורקים כדור, הוא מאיץ (כוח משיכה) ומאט (חיכוך אוויר). כשאתם פותחים דלת, היא מתחילה לאט (אינרציה) ומאיצה. כשאתם בולמים מכונית, ההאטה הדרגתית.
linear = רובוט. easing = חיים.
חשבו על זה ככה: כשאתם נוסעים במכונית, אתם לא מגיעים מ-0 ל-100 קמ"ש באופן מיידי ונוסעים ב-100 קמ"ש קבוע עד שאתם עוצרים באופן מיידי. יש האצה הדרגתית, מהירות שיט, והאטה לפני העצירה. זה מה שeasing עושה לאנימציה — נותן לה "משקל" ו"פיזיקה". בלי easing, כל דבר באתר שלכם מרגיש כמו רכבת הרים שמתחילה ונעצרת בלי אזהרה.
ההשלכה לעבודה עם AI היא ברורה: כשאתם מבקשים מ-AI "add animation", הוא בדרך כלל נותן ease כברירת מחדל — שזה בסדר אבל גנרי. כמו להגיד "תבשל אוכל" במקום "תבשל פסטה ברוטב עגבניות צלויות עם בזיליקום טרי". ככל שתהיו ספציפיים יותר לגבי ה-easing, התוצאה תהיה טובה יותר — וזו בדיוק המיומנות שהפרק הזה מלמד.
הנה ההבדל בקוד:
/* רובוטי — מהירות קבועה */
.box-linear {
transition: transform 400ms linear;
}
/* טבעי — מאיץ בהתחלה, מאט בסוף */
.box-natural {
transition: transform 400ms ease-in-out;
}
/* שניהם עושים את אותו הדבר: מזיזים קופסה 200px ימינה.
אבל ההרגשה שונה לחלוטין. */
.box-linear:hover,
.box-natural:hover {
transform: translateX(200px);
}
אם תנסו את שני הקודים זה לצד זה, תראו שה-linear נראה כמו שולחן שמישהו גורר במהירות קבועה — מכני, צפוי, לא מעניין. ה-ease-in-out נראה כמו חפץ שמישהו זרק — יש לו מומנטום, יש לו עצירה חינוכית. זה ההבדל בין אתר שמרגיש כמו PowerPoint ובין אתר שמרגיש כמו אפליקציה.
פתחו CodePen חדש. צרו שני מלבנים (div) — אחד עם transition: transform 400ms linear ואחד עם transition: transform 400ms ease-in-out. הוסיפו :hover { transform: translateX(200px); } לשניהם. העבירו עכבר ושימו לב להבדל. איזה מרגיש "יותר נכון"?
לא לציין easing = linear. ב-CSS, ברירת המחדל של transition היא ease (לא linear). אבל ב-JavaScript — הרבה ספריות (כולל אנימציות ישנות) משתמשות ב-linear כברירת מחדל. אם אתם מבקשים מ-AI "add a transition" בלי לציין easing — בדקו מה הוא נתן. אם זה linear, שנו ל-ease או ease-in-out.
CSS מגיע עם 5 ערכי easing מובנים. ארבעה מהם שימושיים (ואחד — linear — כבר הבנתם למה פחות):
| שם | cubic-bezier | התנהגות | מתי להשתמש |
|---|---|---|---|
| ease | cubic-bezier(0.25, 0.1, 0.25, 1.0) | מאיץ מהר, מאט בהדרגה | ברירת מחדל טובה לרוב ה-transitions. אם לא בטוחים — תשתמשו בזה |
| ease-in | cubic-bezier(0.42, 0, 1.0, 1.0) | מתחיל איטי, מאיץ | אלמנטים שיוצאים מהמסך (exit animations). "הולך ונעלם" — מתחיל בעדינות ומאיץ החוצה |
| ease-out | cubic-bezier(0, 0, 0.58, 1.0) | מתחיל מהר, מאט | אלמנטים שנכנסים למסך (enter animations). "מגיע ונעצר" — נכנס עם אנרגיה ומתייצב |
| ease-in-out | cubic-bezier(0.42, 0, 0.58, 1.0) | איטי → מהיר → איטי | תנועות שמתחילות ומסתיימות באותו מקום (toggle, accordion, drawer) |
ease-out לכניסה, ease-in ליציאה, ease-in-out למעבר. זה ההיפך ממה שהאינטואיציה אומרת — "ease-in" נשמע כמו "נכנס" אבל בפועל הוא הכי מתאים ל"יוצא". הסיבה: ease-in מתחיל איטי ומאיץ, מה שנותן תחושה של "הולך ונעלם". ease-out מתחיל מהר ומאט, מה שנותן תחושה של "הגיע ונח במקום".
חזרו לאנימציית ה-fade-in מפרק 2. שנו את ה-easing שלה מ-ease (ברירת מחדל) ל-ease-out. שימו לב: ה-fade-in עכשיו מרגיש יותר "מגיע למקום" במקום "פשוט מופיע". זה ההבדל בין אנימציה סבירה לאנימציה טובה.
| מה קורה? | Easing מומלץ | למה |
|---|---|---|
| אלמנט נכנס למסך (fade-in, slide-in) | ease-out | מגיע עם אנרגיה, מתייצב — מרגיש כמו "הגעתי" |
| אלמנט יוצא מהמסך (fade-out, slide-out) | ease-in | מתחיל בעדינות, מאיץ החוצה — "הולך ונעלם" |
| אלמנט עובר ממצב למצב (toggle, expand) | ease-in-out | שניהם קיימים — צריך התחלה וסוף חלקים |
| לא בטוחים / ברירת מחדל | ease | מאוזן, עובד כמעט תמיד |
| אנימציה אינסופית (spinner, pulse) | linear | היוצא מהכלל: ספינר צריך מהירות קבועה כדי להרגיש "רץ" |
ארבעת ה-easing הבסיסיים הם shortcuts ל-cubic-bezier — פונקציה מתמטית שמתארת עקומה עם 4 מספרים. כל easing ב-CSS הוא בסך הכל cubic-bezier(x1, y1, x2, y2) — שתי נקודות שליטה שמגדירות את צורת העקומה.
הנה מה שכל מספר עושה:
כמה עקומות שימושיות מעבר לבסיסיות:
/* Snappy — מהיר ונחרץ, מצוין לתגובה ללחיצה */
.snappy {
transition: transform 250ms cubic-bezier(0.2, 0, 0, 1);
}
/* Smooth — עדין וחלק, מצוין לתפריטים */
.smooth {
transition: transform 400ms cubic-bezier(0.4, 0, 0.2, 1);
}
/* Overshoot — חורג מהיעד וחוזר, מצוין ל-popovers */
.overshoot {
transition: transform 500ms cubic-bezier(0.34, 1.56, 0.64, 1);
}
/* Dramatic — תנועה דרמטית עם undershoot + overshoot */
.dramatic {
transition: transform 600ms cubic-bezier(0.68, -0.55, 0.27, 1.55);
}
פתחו cubic-bezier.com. גררו את שתי נקודות השליטה ושימו לב לשינוי באנימציה בזמן אמת. נסו ליצור: (1) עקומה עם overshoot (גררו נקודה מעל הקו העליון), (2) עקומה עם undershoot (גררו נקודה מתחת לקו התחתון). העתיקו את ערכי ה-cubic-bezier שקיבלתם — תשתמשו בהם בתרגיל.
:hover { transform: translateX(300px); }תוצר: ספריית easing אישית עם 10 עקומות, דמו חי, ומסמך reference.
שימו לב לדפוס: ה-cubic-bezier values שאתם רואים לעיל הם לא מספרים אקראיים. הם תוצר של שנים של ניסוי וטעייה על ידי צוותי עיצוב בחברות כמו Google, Apple, ו-Material Design. הנה ה-"greatest hits" — עקומות שהופיעו שוב ושוב באתרים premium:
| שם מקובל | cubic-bezier | מקור | מתי להשתמש |
|---|---|---|---|
| Material Standard | cubic-bezier(0.4, 0, 0.2, 1) | Google Material Design | ברירת מחדל מומלצת לכל מעבר — מאוזן, מקצועי, חלק |
| Material Decelerate | cubic-bezier(0, 0, 0.2, 1) | Google Material Design | אלמנטים שנכנסים — מאט בחינניות כשמגיע ליעד |
| Material Accelerate | cubic-bezier(0.4, 0, 1, 1) | Google Material Design | אלמנטים שיוצאים — מאיץ ונעלם |
| Apple Ease | cubic-bezier(0.25, 0.1, 0.25, 1) | Apple Human Interface | מעברים עדינים, מרגיש "premium Apple" |
| Expo Out | cubic-bezier(0.16, 1, 0.3, 1) | Framer / Design Studios | כניסות דרמטיות — מהירות ונעצרות בחדות |
| Back Out | cubic-bezier(0.34, 1.56, 0.64, 1) | Robert Penner / easings.net | overshoot עדין — כפתורים, popovers, badges |
| Smooth Power | cubic-bezier(0.22, 1, 0.36, 1) | GSAP power2.out | כניסות גדולות — hero, sections, page transitions |
טיפ: שמרו את הטבלה הזו. כשאתם מבקשים מ-AI "add animation", הוסיפו "use easing: cubic-bezier(0.4, 0, 0.2, 1)" — תקבלו תוצאה טובה פי 10 מ-"ease" הגנרי.
| סוג הפרויקט | Easing מומלץ | למה |
|---|---|---|
| SaaS / Dashboard | Material Standard (0.4, 0, 0.2, 1) | מקצועי, לא מסיח, עקבי |
| Landing page / Marketing | Expo Out (0.16, 1, 0.3, 1) + Back Out לפרטים | דרמטי, מושך תשומת לב |
| E-commerce | Material Decelerate (0, 0, 0.2, 1) | מהיר ונעים, לא מעכב קנייה |
| Portfolio / Creative | Smooth Power (0.22, 1, 0.36, 1) + springs | מראה מיומנות טכנית, מרגיש custom |
| Mobile-first | Material Standard + durations קצרים (150-250ms) | אצבעות מצפות לתגובה מיידית |
שימוש באותו easing לכל דבר. ברגע שמצאתם easing שאתם אוהבים (נניח Material Standard), המפתה להשתמש בו לכל אנימציה. אבל hover על כפתור דורש easing שונה מ-page transition. כלל: micro-interactions (hover, click, toggle) = easing מהיר ופשוט. macro-animations (page transitions, hero reveals, scroll) = easing דרמטי יותר. ערבוב נכון של שניים-שלושה easing curves יוצר hierarchy of motion — בדיוק כמו שיש לכם hierarchy of typography.
Cubic-bezier מכסה 90% מהצרכים. הוא מהיר (GPU-accelerated, CSS native, אפס JavaScript), קל להבנה (4 מספרים), ויש לו כלים מצוינים (cubic-bezier.com, easings.net). אבל יש משהו אחד שהוא לא יכול לעשות: תנודות.
ב-cubic-bezier, האנימציה תמיד מתקדמת מנקודה A לנקודה B. היא יכולה לעשות overshoot (לחרוג מעבר ל-B ולחזור), אבל זה overshoot חד-פעמי. כדור שנופל ומקפץ פעמיים לפני שנח? תפריט שנפתח עם bounce קל, חוזר, bounce עדין יותר, ונח? אלה דורשים spring physics — מודל מתמטי שמדמה את ההתנהגות של קפיץ אמיתי.
למה spring מרגיש כל כך טבעי? כי כמעט כל תנועה בעולם האמיתי היא spring. כשאתם מושכים דלת — היא נפתחת, חוזרת קצת, ונחה. כשאתם לוחצים על כפתור פיזי — הוא שוקע, קופץ חזרה, ומתייצב. כשאתם מתקפלים על ספה — הקפיצים דוחפים אתכם קצת למעלה לפני שאתם מתייצבים. הגוף שלנו מכיר spring מהלידה — ולכן spring animation מרגישה "נכונה" באופן אינטואיטיבי.
spring מוגדר על ידי 3 פרמטרים:
| פרמטר | מה הוא עושה | ערך נמוך | ערך גבוה |
|---|---|---|---|
| stiffness | עוצמת הכוח שמחזיר את האלמנט למקום | תנועה איטית ועדינה (כמו ג'לי) | תנועה מהירה וחדה (כמו גומייה מתוחה) |
| damping | כמה מהר התנודות נעצרות | bounce הרבה (כדור פינג-פונג) | כמעט בלי bounce (דלת עם בולם) |
| mass | "משקל" האלמנט | קל ומהיר (נוצה) | כבד ואיטי (סלע) |
ב-CSS אין תמיכה native ב-spring (נכון לאפריל 2026 — יש הצעה של CSS Spring Easing ב-draft, אבל היא עדיין לא זמינה בשום דפדפן). Spring דורש JavaScript — דרך ספריות כמו Framer Motion (React), GSAP, או Motion One.
ההבדל בין הספריות:
ease: "elastic.out(1, 0.3)" או ease: "bounce.out". לא spring אמיתי (פיזיקלי) אלא פונקציה מתמטית שמדמה spring. עובד בכל framework.הנה איך spring נראה בשתי הספריות הפופולריות:
// React + Framer Motion
<motion.div
animate={{ x: 200 }}
transition={{
type: "spring",
stiffness: 300, // כוח חזרה — גבוה = חד
damping: 20, // ריסון — נמוך = יותר bounce
mass: 1 // משקל — גבוה = איטי יותר
}}
/>
// GSAP
gsap.to(".box", {
x: 200,
duration: 0.8,
ease: "elastic.out(1, 0.3)"
// 1 = amplitude (גובה הקפיצה)
// 0.3 = period (מהירות התנודה)
});
כשאתם מבקשים spring מ-AI, השתמשו בשפה הזו:
damping נמוך מדי = אנימציה אינסופית. אם תגדירו damping של 2-3, האלמנט יקפוץ קדימה ואחורה במשך שניות ארוכות. זה מעצבן, לא מרשים. כלל אצבע: damping של 15-25 נותן 1-2 bounces וזה מספיק. מתחת ל-10 — רק אם אתם רוצים אפקט קומי מכוון.
איך עקרונות ה-spring מתרגמים לפועל? הנה טבלת המרה שימושית:
| רוצים להרגיש | stiffness | damping | mass | תוצאה |
|---|---|---|---|---|
| Button click | 500-700 | 25-35 | 0.5-1 | תגובה מיידית עם bounce קטנטן אחד — "snappy" |
| Modal open | 300-400 | 20-25 | 1 | כניסה אלגנטית עם overshoot עדין — "smooth arrival" |
| Notification pop | 400-600 | 12-18 | 0.8 | bounce בולט אבל קצר — "attention grab" |
| Page transition | 200-300 | 25-30 | 1.2 | תנועה כבדה ומשמעותית — "something big is happening" |
| Playful / Fun | 150-250 | 8-12 | 1 | הרבה bounces, אנרגטי — "wobbly jelly" |
| Drag release | 400-600 | 30-40 | 0.5 | חוזר למקום מהר ובלי bounce — "rubber band" |
כשאתם מבקשים spring מ-AI, היו ספציפיים. במקום "add spring animation", תגידו:
/* פרומפט גרוע: */
"Add a spring animation to the modal"
/* פרומפט טוב: */
"Add a spring animation to the modal using Framer Motion.
Config: type: 'spring', stiffness: 350, damping: 22, mass: 1.
The modal should scale from 0.85 to 1 (not translate — scale feels
more natural for modals). The backdrop should fade in with
duration: 200ms, ease: 'ease-out', starting 30ms before the
modal spring begins. Include prefers-reduced-motion: the modal
should appear immediately at scale 1 with no animation."
שימו לב לנוסחה: (1) ספרייה ספציפית (Framer Motion), (2) מספרים מדויקים (stiffness: 350, damping: 22), (3) סוג התנועה (scale, not translate), (4) תיאום עם אלמנטים אחרים (backdrop timing), (5) reduced motion fallback. חמשת המרכיבים האלה הם ההבדל בין אנימציה גנרית לאנימציה מקצועית.
בקשו מ-AI שלכם (Claude / Cursor): "Create a React component with a button that triggers a spring animation using Framer Motion. Use stiffness: 300, damping: 15. The box should move 200px right on click." שימו לב ל-bounce. שנו את ה-damping ל-5 ותראו את ההבדל.
אחד האפקטים הכי מרשימים שאפשר ליצור עם כמעט אפס מאמץ הוא stagger — כשסדרת אלמנטים (כרטיסים, פריטי רשימה, אייקונים) נכנסים אחד אחרי השני עם הפרש זמן קבוע. במקום שכולם מופיעים בבת אחת (=שעמום), כל אחד מגיע חצי שנייה אחרי הקודם (=מרשים).
Stagger ב-CSS טהור:
/* כל כרטיס מקבל delay שגדל */
.card {
opacity: 0;
transform: translateY(30px);
animation: fadeUp 500ms ease-out forwards;
}
.card:nth-child(1) { animation-delay: 0ms; }
.card:nth-child(2) { animation-delay: 100ms; }
.card:nth-child(3) { animation-delay: 200ms; }
.card:nth-child(4) { animation-delay: 300ms; }
.card:nth-child(5) { animation-delay: 400ms; }
@keyframes fadeUp {
to { opacity: 1; transform: translateY(0); }
}
/* דרך יותר אלגנטית עם custom properties: */
.card {
animation-delay: calc(var(--i, 0) * 100ms);
}
/* ב-HTML: style="--i: 0", style="--i: 1", etc. */
Stagger ב-GSAP (הרבה יותר פשוט):
gsap.from(".card", {
y: 30,
opacity: 0,
duration: 0.5,
ease: "power2.out",
stagger: 0.1 // 100ms בין כל אלמנט
});
שורה אחת של stagger: 0.1 ב-GSAP מחליפה את כל ה-nth-child selectors. זו אחת הסיבות שספריות JS שוות את המשקל — כשיש סדרת אלמנטים.
יש כמה סודות לstagger שנראה מקצועי:
מהניסיון — 80-120ms הוא ה-sweet spot לרוב המקרים. הנה למה:
כלל אצבע: חשבו על ה-stagger total time: delay × (items - 1). אם יש 8 כרטיסים עם 100ms stagger, סך ה-stagger הוא 700ms. מעל שנייה = קצרו את ההפרש.
ב-grid, stagger יכול לרוץ בכמה כיוונים:
stagger: { each: 0.1, from: "random" }/* GSAP — stagger מתקדם */
// מהמרכז החוצה:
gsap.from(".card", {
y: 30, opacity: 0, duration: 0.5,
stagger: { each: 0.1, from: "center" }
});
// אקראי:
gsap.from(".card", {
y: 30, opacity: 0, duration: 0.5,
stagger: { each: 0.1, from: "random" }
});
// Grid 2D (שורות + עמודות):
gsap.from(".card", {
y: 30, opacity: 0, duration: 0.5,
stagger: { each: 0.08, grid: [3, 4], from: "start" }
});
חזרו לאתר שבניתם בפרק 2 (או פתחו CodePen). מצאו סדרה של 3+ אלמנטים דומים (כרטיסים, פריטי תפריט, אייקונים). הוסיפו stagger CSS עם animation-delay ו-nth-child. הפרש מומלץ: 80-120ms. צפו בתוצאה — ההבדל דרמטי.
תוצר: גלריית כרטיסים עם stagger מכוייל שנראה premium.
אחת השאלות הכי נפוצות שתלמידים שואלים היא "כמה זמן צריכה להימשך אנימציה?" — והתשובה הקצרה היא: תלוי בגודל ובהקשר. אנימציות קטנות (hover state, tooltip) צריכות להיות כמעט מיידיות — 100-200ms. אנימציות גדולות (page transition, hero reveal) יכולות לקחת יותר זמן — 500-800ms — כי העין צריכה לעקוב אחרי תנועה גדולה יותר.
הטעות הנפוצה ביותר של מתחילים: אנימציות ארוכות מדי. כשאתם לומדים easing ורואים bounces יפים, המפתה להשתמש ב-duration של שנייה ויותר כדי "להראות" את ה-easing. אבל בחוויית משתמש, כל מילישנייה מעל הנדרש היא מילישנייה של "המשתמש מחכה". אנימציה טובה היא כזו שהמשתמש מרגיש אבל לא מחכה לה.
אין תשובה אחת, אבל יש מדריך שעובד ב-90% מהמקרים:
| קטגוריה | Duration | דוגמאות | למה |
|---|---|---|---|
| Micro | 100-200ms | hover states, button clicks, tooltip appear, toggle switch | תגובה צריכה להיות מיידית — כל מה שמעל 200ms מרגיש "איטי" לתגובת משתמש |
| Small | 200-300ms | dropdown open, fade-in of small element, tab switch | מהיר מספיק שלא מעכב, איטי מספיק שאפשר לראות את המעבר |
| Medium | 300-500ms | modal open, sidebar slide, card expand, accordion | אלמנטים גדולים צריכים יותר זמן כדי שהתנועה תיראה טבעית |
| Large | 500-800ms | page transition, hero animation, full-screen overlay | תנועות גדולות שמכסות הרבה שטח מסך |
| Dramatic | 800-1200ms | onboarding animation, first-load hero, storytelling scroll | רק לרגעים מיוחדים שבהם רוצים למשוך תשומת לב |
| שאלה | אם כן | אם לא |
|---|---|---|
| האם זו תגובה ישירה ללחיצה/hover? | 100-200ms (micro) | המשיכו לשאלה הבאה |
| האם האלמנט קטן (כפתור, tooltip, badge)? | 200-300ms (small) | המשיכו |
| האם האלמנט בינוני (מודאל, sidebar, card)? | 300-500ms (medium) | המשיכו |
| האם זו תנועה שמכסה רוב המסך? | 500-800ms (large) | 300-500ms כברירת מחדל |
| האם זה רגע "WOW" חד-פעמי (hero, onboarding)? | 800-1200ms (dramatic) | עד 800ms מקסימום |
אנימציות ארוכות מדי = מתסכלות. אם תפריט צד לוקח שנייה שלמה להיפתח, המשתמש ירגיש שהאתר איטי. כלל: אם המשתמש ממתין לאנימציה שתסתיים כדי לעשות פעולה — היא ארוכה מדי. אנימציה טובה היא כזו שהמשתמש כמעט לא שם לב אליה, אבל בלעדיה המעבר מרגיש "קטוע".
animation-delay ו-transition-delay מוסיפים זמן המתנה לפני שהאנימציה מתחילה. Delay הוא כלי חשוב אבל מסוכן — שימוש נכון יוצר choreography אלגנטי, שימוש לא נכון גורם לאתר להרגיש שבור או איטי.
Delay שימושי ב-3 מקרים:
Delay מתסכל כש:
כלל אצבע: delay על כניסה — בסדר. delay על תגובה לאינטראקציה — כמעט תמיד רע.
הנה דוגמה של שימוש נכון ב-delay ליצירת "waterfall" effect:
/* Waterfall entry — hero section */
.hero-bg { animation: fadeIn 800ms ease-out; }
.hero-title { animation: slideUp 500ms ease-out 200ms both; }
.hero-sub { animation: slideUp 500ms ease-out 400ms both; }
.hero-cta { animation: popIn 400ms cubic-bezier(0.34, 1.56, 0.64, 1) 600ms both; }
/* הפירוק:
0ms — רקע מתחיל fade-in (800ms)
200ms — כותרת מתחילה slide-up (500ms) — הרקע כבר נראה
400ms — כותרת משנה — הכותרת הראשית כבר במקום
600ms — כפתור CTA — הכל מוכן, הכפתור "קופץ" עם overshoot
סה"כ: 600ms + 400ms = 1000ms — הכל נגיש תוך שנייה.
"both" = animation-fill-mode: both — שומר opacity: 0 לפני ו-opacity: 1 אחרי */
שימו לב לערך both (= animation-fill-mode: both). בלי זה, האלמנטים עם delay יהיו visible לפני שהאנימציה מתחילה — ו"ייעלמו" כשהאנימציה מתחילה. both אומר: שמור את ה-initial state (opacity: 0) לפני שהאנימציה מתחילה, ושמור את ה-final state (opacity: 1) אחרי שהיא נגמרת.
שכחתם animation-fill-mode: both עם delay. אם יש delay של 400ms על אנימציית fade-in, בלי both האלמנט יהיה visible (opacity: 1) במשך 400ms, ואז ייעלם (opacity: 0 — תחילת ה-keyframe), ואז יופיע שוב בfade. זה נראה כמו "הבהוב" מוזר. תמיד הוסיפו both או forwards כשיש delay.
בקשו מ-AI: "Add a tooltip that appears on hover with a 300ms delay to prevent flickering, using CSS only". בדקו שה-delay מרגיש נכון — 300ms מונע flicker בלי להרגיש איטי.
כשיש בדף 5 אנימציות שרצות בו-זמנית, יש שני תרחישים: (1) כולן מתוזמנות ומרגישות כמו ריקוד מתואם, או (2) כל אחת רצה לבד והדף מרגיש כמו זירת קרקס. ההבדל הוא choreography — תכנון מכוון של סדר, תזמון, ויחסים בין אנימציות.
שלושה דפוסים:
אנימציה A מסתיימת → אנימציה B מתחילה → C מתחילה. כל אחת ממתינה לקודמתה. הסדר חשוב — אלמנט B מסתמך על ההקשר שאלמנט A נתן. מתאים ל: hero sections (רקע → כותרת → CTA), onboarding flows (צעד 1 → צעד 2 → צעד 3), storytelling בגלילה.
יתרון: שולט בסדר הקריאה של המשתמש — אתם מחליטים מה הוא רואה ראשון. חיסרון: הסך הכולל ארוך — אם יש 5 אלמנטים ב-sequence עם 300ms כל אחד, עוברות 1.5 שניות עד שהאחרון נראה.
אנימציות A, B, C, D מתחילות עם הפרש קבוע (למשל 100ms). כולן רצות "כמעט ביחד" אבל לא בדיוק — כמו כרטיסי דומינו שנופלים. ההפרש הקטן יוצר תחושה של "גל" שזורם דרך הרשימה.
יתרון: מהיר (כולם נראים תוך ~700ms גם אם יש 8 אלמנטים), מרשים ויזואלית, קל לממש. חיסרון: לא שולט בסדר תשומת הלב — המשתמש רואה "קבוצה מופיעה" ולא "אלמנט X ואז Y".
כמה אנימציות רצות בו-זמנית על אותו אלמנט. opacity משתנה מ-0 ל-1, translateY משתנה מ-30px ל-0, ו-scale משתנה מ-0.95 ל-1 — הכל בבת אחת. התוצאה: כניסה "עשירה" שמרגישה כמו דבר אחד מורכב, לא שלושה דברים נפרדים.
יתרון: מהיר (הכל קורה ב-duration אחד), מרגיש "שלם". חיסרון: אם יש יותר מדי properties שמשתנים בו-זמנית, זה יכול להרגיש "כאוטי". כלל: 2-3 properties ב-parallel מקסימום.
בפועל, רוב ה-choreographies משלבים את שלושת הדפוסים. למשל, hero section טיפוסי:
המפתח הוא ההיררכיה: parallel בתוך אלמנטים, sequence בין קבוצות, stagger בתוך קבוצות של אלמנטים דומים.
תוצר: Hero section עם choreography מתוכנן של 4 אלמנטים.
איך בוחרים בין sequence, stagger, ו-parallel? זה תלוי במה שרוצים לתקשר:
הטעות הנפוצה ביותר ב-choreography: לערבב stagger עם sequence. אם כותרת נכנסת ב-sequence (אחרי הרקע) ואז הכרטיסים נכנסים ב-stagger, זה עובד. אבל אם כותרת נכנסת ב-stagger (אות אחרי אות) ואז הכרטיסים גם ב-stagger — הדף מרגיש כמו שהכל "מטפטף" בלי סוף. כלל: stagger אחד בכל viewport. אם ה-hero משתמש ב-stagger, ה-section שאחריו צריך sequence או parallel.
הנה דוגמה מלאה של choreography מתוכנן ל-landing page:
/* Landing Page Choreography Plan:
================================
0ms — Hero background: fade-in + subtle scale(1.02→1), 800ms, ease-out
200ms — Logo: fade-in, 300ms, ease-out
350ms — Headline: slide-up 20px + fade-in, 500ms, cubic-bezier(0.22, 1, 0.36, 1)
550ms — Subheadline: slide-up 20px + fade-in, 500ms, same easing
750ms — CTA buttons: fade-in + scale(0.95→1), 400ms, cubic-bezier(0.34, 1.56, 0.64, 1)
[scroll to features section]
0ms — Section title: fade-in, 400ms, ease-out
100ms — Feature card 1: slide-up + fade, 500ms, ease-out ← stagger starts
200ms — Feature card 2: same
300ms — Feature card 3: same
NOTES:
- Hero uses SEQUENCE (items depend on each other)
- Features use STAGGER (equal items in a group)
- No two staggers visible at the same time
- Total hero sequence: 750ms until interactive ← under 1 second
*/
Hero שלוקח יותר משנייה עד שהכפתור נגיש. אם ה-CTA button מופיע רק אחרי 1.5 שניות של sequence, חלק מהמשתמשים כבר ינסו לגלול. כלל: ה-primary CTA חייב להיות נגיש (visible + clickable) תוך 1 שנייה מטעינת הדף. אם ה-choreography ארוך — קצרו את ה-delays, או הפכו את הכפתור ל-visible מיידית והוסיפו רק אנימציה עדינה (fade-in ב-200ms בלי delay).
פתחו אתר שאתם אוהבים (Stripe, Linear, Vercel). צפו ב-hero section. פתחו DevTools → Animation tab. שימו לב: כמה אנימציות רצות? באיזה סדר? מה ה-delay בין אחת לשנייה? רשמו את ה-pattern — תשתמשו בו כהשראה.
חלק מהמשתמשים סובלים מרגישות לתנועה (vestibular disorders) — אנימציות עלולות לגרום להם לסחרחורת, בחילה, או כאב ראש. זה לא מקרה שולי: לפי WebAIM, כ-15-20% מהאוכלוסייה חווים רגישות כלשהי לתנועה. לכן כל דפדפן מודרני תומך ב-prefers-reduced-motion — הגדרה ברמת מערכת ההפעלה שאומרת "אני רוצה פחות תנועה".
מה זה אומר בפועל? כשמשתמש מפעיל reduced motion במכשיר שלו, ה-media query @media (prefers-reduced-motion: reduce) נהיה אמיתי, ואתם יכולים לבטל או למתן אנימציות. זו לא אופציה — זו חובה. באתר ישראלי: חוק שוויון זכויות לאנשים עם מוגבלות דורש נגישות דיגיטלית. אנימציות בלי fallback הן הפרה פוטנציאלית.
/* גישה 1: ביטול ספציפי — מומלץ */
@media (prefers-reduced-motion: reduce) {
.card {
animation: none; /* ביטול כניסה מונפשת */
transition-duration: 0.01ms; /* transitions "מיידיים" */
}
}
/* גישה 2: ביטול גורף — לשימוש זהיר */
@media (prefers-reduced-motion: reduce) {
*, *::before, *::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
scroll-behavior: auto !important;
}
}
המלצה: השתמשו בגישה 1 (ביטול ספציפי). גישה 2 (גורפת) שוברת לפעמים דברים — למשל, tooltips שמסתמכים על transition כדי לעבוד, או CSS-only hamburger menus שמשתמשים ב-transition על checkbox hack.
בכל מקרה, שלושה כללים:
הנה גישה שלישית — "motion-safe" — שהופכת את הלוגיקה: במקום לבטל אנימציות ב-reduced-motion, מוסיפים אנימציות רק כש-reduced-motion לא פעיל:
/* גישה 3: motion-safe — הפוך ובטוח */
.card {
/* ברירת מחדל: visible, no animation */
opacity: 1;
transform: none;
}
@media (prefers-reduced-motion: no-preference) {
/* רק אם המשתמש לא ביקש reduced motion — הוסף אנימציה */
.card {
opacity: 0;
transform: translateY(30px);
animation: fadeUp 500ms ease-out forwards;
}
}
/* היתרון: אם שכחתם לטפל באלמנט — הוא visible כברירת מחדל.
בגישות 1-2, אם שכחתם — הוא invisible (opacity: 0 בלי אנימציה). */
גישה 3 היא הבטוחה ביותר כי היא fail-safe: אם שכחתם לכסות מקרה — האלמנט פשוט visible בלי אנימציה (טוב), במקום invisible בלי אנימציה (רע). שקלו לאמץ אותה כברירת מחדל.
וכשאתם מבקשים מ-AI ליצור אנימציות, תמיד הוסיפו בסוף הפרומפט:
"Use the motion-safe pattern: elements should be visible by default
(opacity: 1, no transform). Only add animation inside
@media (prefers-reduced-motion: no-preference). This ensures
that if reduced-motion is on, all content is visible immediately
without any animation."
AI ישמח לבצע את ההנחייה הזו — הוא פשוט צריך שתגידו לו. בלי ההנחייה, הוא ייצור אנימציות "רגילות" עם opacity: 0 כ-initial state, בלי reduced-motion fallback, ומשתמשים עם רגישות לתנועה יראו דף ריק. פרומפט טוב = נגישות אוטומטית.
עוד נקודה חשובה: בדיקה. הפעילו reduced motion במחשב שלכם פעם בשבוע ושיטטו באתר שלכם. כל אלמנט שנעלם, כל layout שנשבר, כל interaction שלא עובד — זה באג. טפלו בו כמו בכל באג אחר. הדרך הכי קלה: Chrome DevTools → Rendering tab → Emulate CSS media: prefers-reduced-motion: reduce. אפילו לא צריכים לשנות הגדרות במערכת ההפעלה.
שוכחים opacity: 0 ב-initial state. אם האלמנט מתחיל ב-opacity: 0 ומסתמך על אנימציה כדי להגיע ל-opacity: 1 — ביטול האנימציה ישאיר אותו שקוף! הפתרון: ב-reduced-motion, הגדירו opacity: 1 ישירות.
הפעילו reduced motion במערכת ההפעלה שלכם (macOS: System Settings → Accessibility → Display → Reduce Motion / Windows: Settings → Accessibility → Visual Effects → Animation Effects: Off). חזרו לאתר שבניתם — האם האנימציות נעלמו? אם כן — מצוין. אם לא — חסר לכם ה-media query.
| כלי | מה הוא עושה | מתי להשתמש |
|---|---|---|
| cubic-bezier.com | עורך ויזואלי לעקומות bezier — גוררים נקודות ורואים תצוגה מקדימה בזמן אמת | כשרוצים ליצור easing מותאם אישית ולראות איך הוא מרגיש לפני שמטמיעים |
| easings.net | ספריית 30+ עקומות easing מוכנות — hover כדי לראות דמו, קליק להעתקת קוד | כשרוצים לבחור easing מוכן מתוך אוסף — reference מהיר |
| easing.dev | כלי אינטראקטיבי מתקדם עם השוואה בין עקומות ותצוגת spring | כשרוצים להשוות בין כמה אפשרויות זו-לצד-זו |
| Chrome DevTools → Animation | בדיקת אנימציות חיות — timeline, easing curve, duration | כשרוצים לדבג אנימציה קיימת או ללמוד מאתר אחר |
פתחו easings.net. בחרו 3 easing curves שנראות לכם מעניינות. העתיקו את ערכי ה-cubic-bezier שלהן. הוסיפו אותן לספריית ה-easing מתרגיל 1 (עם שם ותיאור).
הבעיה הגדולה: כשאתם מבקשים מ-AI "add animation", הוא נותן לכם transition: all 0.3s ease — ברירת מחדל גנרית שלא מרגישה כלום. כדי לקבל אנימציה שמרגישה ספציפית, אתם צריכים שפה מדויקת.
למה? כי ל-AI אין "טעם". הוא לא יודע אם אתם רוצים אנימציה שמרגישה כמו Apple או כמו TikTok. הוא פשוט נותן את הממוצע הסטטיסטי — ו"ממוצע" באנימציה זה "גנרי". כדי לשבור את ברירת המחדל, אתם צריכים לדבר בשפה שה-AI מבין: מספרים, שמות של easing curves, durations, ו-choreography instructions.
ה-5 פרומפטים הבאים הם תבניות שאפשר להעתיק ולהתאים. כל אחד מכוון ל"תחושה" שונה:
הנה 5 פרומפטים מוכנים:
"Add an entrance animation to these cards. Each card should slide up 30px and fade in. Use ease: cubic-bezier(0.34, 1.56, 0.64, 1) for a slight overshoot effect — the card should go slightly past its final position and bounce back. Duration: 500ms. Stagger: 100ms between cards. Include prefers-reduced-motion fallback."
"Make all hover transitions feel snappy and responsive. Use transition: all 200ms cubic-bezier(0.2, 0, 0, 1). This easing starts fast and decelerates quickly — it should feel like the element is reacting instantly to the cursor. Apply to buttons, cards, and links. Include reduced-motion fallback."
"Add a smooth sidebar transition. The sidebar should slide in from the right with ease: cubic-bezier(0.4, 0, 0.2, 1) — Google's Material Design standard easing. Duration: 350ms. The overlay behind it should fade in with duration: 250ms. The sidebar animation should start 50ms after the overlay starts (slight sequence, not parallel)."
"Create a page transition animation. The current page should scale down to 0.95 and fade out (300ms, ease-in). Then the new page should slide up from the bottom with a heavy, deliberate feel: duration 600ms, cubic-bezier(0.16, 1, 0.3, 1). The movement should feel like something substantial is arriving — not floating, but landing."
"Using Framer Motion, add a spring animation to this modal. When it opens, it should scale from 0.8 to 1 with spring config: stiffness 300, damping 20. This gives 1-2 subtle bounces before settling. The backdrop should fade in with duration 200ms, starting 50ms before the modal spring begins. Add prefers-reduced-motion: show modal immediately without animation."
תוצר: 3 גרסאות של אותה אנימציה, עם תיעוד של מה שינוי ה-easing עושה לתחושה.
כמה עצות נוספות לנוסח פרומפטים של אנימציה ל-AI:
תבנית כללית לפרומפט אנימציה:
/* תבנית פרומפט אנימציה */
"Add [TYPE] animation to [ELEMENT].
[ELEMENT] should [MOVEMENT] from [START] to [END].
Duration: [X]ms.
Easing: [cubic-bezier / spring config].
[COORDINATION with other elements if needed].
Include prefers-reduced-motion fallback."
/* דוגמה מלאה: */
"Add entrance animation to the feature cards grid.
Each card should slide up 30px and fade in from opacity 0 to 1.
Duration: 450ms per card.
Easing: cubic-bezier(0.22, 1, 0.36, 1).
Stagger: 100ms between cards, starting from the first card.
Use IntersectionObserver to trigger only when cards enter viewport.
Include prefers-reduced-motion: show cards immediately at
opacity 1, transform none, no animation."
תיאוריה זה נחמד, אבל הדרך הטובה ביותר ללמוד easing היא לנתח אתרים שעשו את זה נכון. הנה 5 אתרים שכדאי לנתח, ומה תלמדו מכל אחד:
Stripe משתמשים ב-easing עקבי — כמעט הכל מבוסס על Material Standard (0.4, 0, 0.2, 1) עם durations של 200-400ms. הם לא משתמשים ב-bounce או spring — הכל חלק, שקט, מקצועי. זה מתאים למוצר פיננסי שצריך לשדר "אנחנו אמינים".
מה ללמוד: עקביות ב-easing = עקביות ב-branding. Stripe לא "מפגינים" אנימציה — הם משתמשים בה כדי שהמעברים ירגישו חלקים. אם הקהל שלכם מקצועי/B2B — זו הגישה.
Linear בחרו בגישה הפוכה: הכל מהיר. hover states ב-100-150ms, מודאלים ב-200ms, אף אנימציה לא נמשכת יותר מ-300ms. ה-easing תמיד aggressive — cubic-bezier שמגיעים מהר ליעד. זה משדר: "הכלי הזה מהיר כמוך".
מה ללמוד: duration קצר + easing מהיר = תחושת "responsive". אם אתם בונים כלי פרודוקטיביות — העתיקו את הגישה הזו.
Apple היא המלכה של choreography. בdפי מוצר, כל אלמנט נכנס בתזמון מדויק — כותרת, תמונה, מפרט, כפתור — כל אחד עם delay ספציפי שיוצר רצף שמוביל את העין. ה-easing בדרך כלל ease-out עדין עם durations של 400-600ms.
מה ללמוד: Choreography נכון הופך דף סטטי לסיפור. Apple מראים שה-סדר שבו דברים מופיעים חשוב לא פחות מ-איך הם מופיעים.
Vercel (יוצרי Next.js) משתמשים ב-spring animations במקומות ספציפיים — כפתורי hover עם bounce קל, מודאלים עם overshoot עדין. אבל הם לא מגזימים — רוב המעברים הם CSS transitions רגילים. Spring שמור ל"רגעים" מיוחדים.
מה ללמוד: Spring הוא תבלין, לא מנה עיקרית. השתמשו בו נקודתית כדי לסמן אלמנטים חשובים — כפתור CTA, notification, hover state מיוחד.
Framer (יוצרי Framer Motion) הם showcase של מה שאפשר לעשות עם spring physics. כל דבר באתר שלהם זז — לא רק כניסות, אלא גם תגובות לעכבר, scroll effects, ומעברי דף. ה-springs מכוילים בקפידה: stiffness ו-damping ספציפיים לכל סוג אינטראקציה.
מה ללמוד: אם אתם בונים אתר creative/portfolio — זו ההשראה. אבל אזהרה: מה שעובד ל-Framer (שהקהל שלהם הוא מעצבים שאוהבים אנימציה) לא בהכרח עובד לאתר e-commerce ישראלי.
כשאתם מנתחים את חמשת האתרים האלה, תשימו לב ל-4 דפוסים שחוזרים:
כשאתם בונים את הפרויקט שלכם, שאלו: "מה ה-Stripe/Linear/Apple של ה-niche שלי?" ולכו לנתח את ה-easing שלהם. ה-DevTools Animation panel הוא החבר הכי טוב שלכם — הוא מראה easing curves, durations, ו-delays של כל אנימציה חיה. זו הדרך הכי מהירה ללמוד easing מקצועי — reverse engineering של אתרים שעובדים.
בחרו אתר אחד מה-5 שלמעלה (או אתר אחר שאתם מעריצים). פתחו DevTools → Elements. מצאו אלמנט עם transition או animation. רשמו: (1) מה ה-easing? (2) מה ה-duration? (3) האם יש delay? (4) האם יש reduced-motion fallback? הוסיפו את מה שמצאתם ל-reference document שלכם.
linear ולא ease גנרי)ease-out או Expo Outease-inprefers-reduced-motion media query קיים ומבטל/ממתן את כל האנימציותopacity: 0 initial — מקבלים opacity: 1 ישירות ב-reduced-motionanimation-delay על תגובה לאינטראקציה (hover, click)| תדירות | פעולה |
|---|---|
| בכל אנימציה חדשה | שאלו: מה ה-easing הנכון? בדקו בספריית ה-easing האישית שלכם. אל תשתמשו ב-ease כברירת מחדל עיוורת. |
| שבועי | פתחו אתר premium אחד (Stripe, Linear, Vercel). בדקו ב-DevTools → Animation: מה ה-easing שהם משתמשים? הוסיפו לספרייה שלכם. |
| חודשי | סקרו את ספריית ה-easing: האם יש עקומות שאתם משתמשים תמיד? האם יש כאלה שמעולם לא השתמשתם? עדכנו. |
אם אתם עושים רק דבר אחד מכל הפרק: החליפו כל ease באתר שלכם ב-cubic-bezier(0.4, 0, 0.2, 1) — ה-Material Design easing. זה שדרוג מיידי של 80% מהאנימציות בלי מאמץ.
@media (prefers-reduced-motion: no-preference). הוסיפו הנחיית reduced-motion בסוף כל פרומפט AI.עכשיו אתם יודעים איך תנועה צריכה להרגיש. יש לכם ספריית easing אישית, צ'קליסט בחירת easing, טבלת duration, ו-5 פרומפטים שמתארים תחושת תנועה ל-AI. בפרק 4 תלמדו את GSAP (GreenSock Animation Platform) — ספריית האנימציה הכי פופולרית בעולם — שמאפשרת לעשות את כל מה שלמדתם פה (ועוד הרבה יותר) בצורה פשוטה יותר.
GSAP מביא שלושה דברים שב-CSS אין: timelines (choreography מורכב בלי לחשב delays ידנית), stagger מובנה (שורה אחת במקום nth-child selectors), ו-easing functions מתקדמים (elastic, bounce, steps ועוד 30 presets). אם CSS הוא הסכין שלכם, GSAP הוא שף שלם — עם כל הכלים ליצירת אנימציות שפשוט לא אפשריות ב-CSS בלבד. בואו נלמד אותו.