Menu

CSS Animation: @keyframes, מאפיינים ודוגמאות

אנימציות CSS מעבירות אלמנט דרך השלבים שהגדרתם ב-@keyframes, מעצמן וכמה פעמים שתרצו. למדו את התחביר של @keyframes, את כל שמונת מאפייני האנימציה, fill-mode ו-direction, מחווני טעינה, השהיה, ואיך לכבד העדפה לתנועה מופחתת.

בדף הזה יש עורכים שאפשר להריץ - לערוך, להריץ ולראות את הפלט מיד.

אנימציית 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עקומת המהירות בין keyframesease
animation-delayהמתנה לפני המחזור הראשון (ערך שלילי מתחיל באמצע)0s
animation-iteration-countמספר המחזורים, או infinite1
animation-directionnormal, reverse, alternate, alternate-reversenormal
animation-fill-modeסגנונות לפני ואחרי: none, forwards, backwards, bothnone
animation-play-staterunning או pausedrunning

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

.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 בסוף כל מחזור.

כבדו תנועה מופחתת ולעולם אל תהבהבו

שני כללי נגישות חלים על כל אנימציה:

  1. תנועה מופחתת. אנשים יכולים לבקש מהמערכת שלהם פחות תנועה, כי תנועה גורמת להם להרגיש רע. הדפוס הבטוח ביותר הוא להוסיף תנועה רק כשהם לא ביקשו פחות:
@media (prefers-reduced-motion: no-preference) {
  .hero-title { animation: slide-in 0.8s ease-out both; }
}
  1. בלי הבהובים. תוכן שמהבהב יותר משלוש פעמים בשנייה עלול לעורר התקפים. הימנעו לגמרי מהבהוב מהיר עם ניגודיות גבוהה.

שמרו על אנימציות חלקות

הנפישו 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) { ... }. השאילתה עוקבת אחרי הגדרת הפחתת התנועה במערכת ההפעלה של המשתמש.

איור של שפות התכנות ב-Coddy

ללמוד תכנות עם Coddy

להתחיל