אנימציית CSS בדוגמה אחת
לאנימציה יש שני חלקים: @keyframes, שמתאר את השלבים, והמאפיין animation, שמחיל אותם על אלמנט עם משך זמן. הכרטיס הזה מחליק ומופיע בהדרגה כשהעמוד נטען:
ערכו את הקוד (או שנו את משך הזמן ל-2s) והתצוגה המקדימה תיטען מחדש, כך שתוכלו לראות את הכרטיס נכנס שוב. הבלוק @media (prefers-reduced-motion: reduce) מחליף את ה-keyframes בהופעה הדרגתית בלבד, עבור קוראים שהמערכת שלהם מוגדרת להפחתת תנועה.
התחביר של @keyframes
@keyframes pulse {
0% { transform: scale(1); }
50% { transform: scale(1.08); }
100% { transform: scale(1); }
}
fromזהה ל-0%, ו-toזהה ל-100%.- הוסיפו כמה שלבי אחוזים שצריך. שלבים עם אותם סגנונות יכולים לחלוק שורה:
0%, 100% { ... }. - מאפיין שחסר ב-keyframe הראשון או האחרון מונפש מהערך של האלמנט עצמו או אליו.
- השם (
pulse) הוא מה שמעבירים ל-animation-name. הוא רגיש לאותיות גדולות וקטנות, ואסור שיהיה מילת מפתח כמוnone.
מאפייני האנימציה
| מאפיין | מה הוא קובע | ברירת מחדל |
|---|---|---|
animation-name | איזה @keyframes להריץ | none |
animation-duration | אורך של מחזור אחד | 0s |
animation-timing-function | עקומת המהירות בין keyframes | ease |
animation-delay | המתנה לפני המחזור הראשון (ערך שלילי מתחיל באמצע) | 0s |
animation-iteration-count | מספר המחזורים, או infinite | 1 |
animation-direction | normal, reverse, alternate, alternate-reverse | normal |
animation-fill-mode | סגנונות לפני ואחרי: none, forwards, backwards, both | none |
animation-play-state | running או paused | running |
הקיצור מקבל אותם כמעט בכל סדר. הכלל היחיד הוא שערך הזמן הראשון הוא משך הזמן, והשני הוא ההשהיה:
.loader {
animation: pulse 1.2s ease-in-out 0.2s infinite alternate both;
/* name duration timing delay count direction fill */
}
direction ו-fill-mode בפעולה
בחרו כיוון, מצב מילוי ומספר חזרות, ואז לחצו על Play. הקופסה זזה 200px עד סוף המסלול. הפלט מציג איפה היא נחה אחרי שהאנימציה הסתיימה:
למה לשים לב:
fill-mode: none(ברירת המחדל): אחרי הפריים האחרון הקופסה קופצת בחזרה ל-x = 0 וחוזרת להיות כתומה.forwards: היא נשארת על ה-keyframe האחרון. עםnormalזה x = 200 וירוק; עםreverseהיא מסתיימת ב-x = 0 וכחולה, כי ה-keyframe האחרון שנוגן היהfrom.alternateעם 2 חזרות הולך לשם וחוזר, כך שגםforwardsמסתיים ב-x = 0.
לולאות אינסופיות: מחוון טעינה
infinite חוזר לעולם, ו-animation-delay על כל ילד מזיז אותם בזמן כך שהם זזים בתורם. שמרו על לולאות רגועות: איטיות, קטנות, בלי הבהובים.
role="status" עם aria-label אומר למשתמשי קוראי מסך שמשהו נטען, דבר שהנקודות לבדן לא אומרות. לעיגול מסתובב, ראו את עמוד ה-rotate.
השהיה ושליטה באנימציות
animation-play-state: paused מקפיא אנימציה במקום שבו היא נמצאת, ו-running ממשיך משם. העבירו את העכבר מעל הפס שלמטה כדי לעצור אותו:
מ-JavaScript, element.getAnimations() מחזיר את אנימציות ה-CSS שרצות, לכל אחת יש pause(), play(), cancel() ו-currentTime שאפשר לקרוא או לשנות. האירוע animationend נורה כשאנימציה לא אינסופית מסתיימת, ו-animationiteration בסוף כל מחזור.
כבדו תנועה מופחתת ולעולם אל תהבהבו
שני כללי נגישות חלים על כל אנימציה:
- תנועה מופחתת. אנשים יכולים לבקש מהמערכת שלהם פחות תנועה, כי תנועה גורמת להם להרגיש רע. הדפוס הבטוח ביותר הוא להוסיף תנועה רק כשהם לא ביקשו פחות:
@media (prefers-reduced-motion: no-preference) {
.hero-title { animation: slide-in 0.8s ease-out both; }
}
- בלי הבהובים. תוכן שמהבהב יותר משלוש פעמים בשנייה עלול לעורר התקפים. הימנעו לגמרי מהבהוב מהיר עם ניגודיות גבוהה.
שמרו על אנימציות חלקות
הנפישו transform ו-opacity כשאפשר. הדפדפן יכול להחיל אותם בלי לסדר את העמוד מחדש, כך שהם נשארים חלקים גם בטלפונים איטיים. הנפשה של width, height, top, left או margin מחשבת את הפריסה מחדש בכל פריים. כדי להזיז אלמנט, השתמשו ב-translate() מעמוד ה-transform.
טעויות נפוצות
- אין משך זמן.
animation: fade;לא עושה כלום, כי משך ברירת המחדל הוא0s. - שם שלא תואם.
animation-nameחייב להתאים בדיוק לשם של@keyframes, כולל אותיות גדולות וקטנות. - קפיצה אחורה בסוף. הוסיפו
forwards(אוboth) כדי לשמור את ה-keyframe האחרון. - הבהוב לפני שאנימציה מושהית מתחילה. בזמן
animation-delayהאלמנט מציג את הסגנונות הרגילים שלו.backwards(אוboth) מחיל את ה-keyframe הראשון בזמן ההשהיה. - הפעלה מחדש של אנימציה על ידי הגדרת אותו ערך. הגדרה חוזרת של אותו
animationלא עושה כלום. הסירו אותו, כפו reflow (el.offsetWidth), והגדירו אותו שוב, כמו שכפתור ה-Play למעלה עושה. - הנפשה של
display. הוא מתחלף בבת אחת. הנפישו במקום זאתopacityו-transform.
שאלות נפוצות
איך יוצרים אנימציה ב-CSS?
מגדירים את השלבים עם @keyframes name { from { ... } to { ... } }, ואז מחילים אותה על אלמנט עם המאפיין animation ומשך זמן: animation: name 1s ease-out;. משך הזמן הוא חובה, כי ערך ברירת המחדל שלו הוא 0s.
מה עושה animation-fill-mode: forwards?
הוא שומר את הסגנונות של ה-keyframe האחרון אחרי שהאנימציה מסתיימת. בלעדיו, האלמנט קופץ בחזרה לסגנונות הרגילים שלו. backwards מחיל את ה-keyframe הראשון בזמן ההשהיה, ו-both עושה את שניהם.
איך גורמים לאנימציית CSS לחזור על עצמה לעולם?
הגדירו animation-iteration-count: infinite, או הוסיפו infinite לקיצור: animation: spin 1s linear infinite;. הוסיפו alternate כדי לנגן אותה קדימה ואז אחורה בכל מחזור.
מה ההבדל בין animation ל-transition ב-CSS?
Transition מנפיש מאפיין בין שני ערכים כשהוא משתנה, בדרך כלל ב-hover או בשינוי מחלקה. Animation רצה מעצמה ברגע שהיא מוחלת, יכולה לכלול כל מספר של keyframes, ויכולה לחזור, להתהפך ולהיעצר.
איך עוצרים אנימציית CSS?
הגדירו animation-play-state: paused על האלמנט, למשל ב-:hover או דרך מחלקה ש-JavaScript מוסיף. החזרה ל-running ממשיכה מהנקודה שבה היא נעצרה.
איך מכבים אנימציות למשתמשים שמעדיפים תנועה מופחתת?
עטפו את האנימציה ב-@media (prefers-reduced-motion: no-preference) { ... }, או הסירו אותה בתוך @media (prefers-reduced-motion: reduce) { ... }. השאילתה עוקבת אחרי הגדרת הפחתת התנועה במערכת ההפעלה של המשתמש.