Menu

CSS Transition: מאפיין, משך, האצה והשהיה

transition ב-CSS מנפיש מאפיין מהערך הישן שלו לערך החדש כשהוא משתנה, למשל ב-hover. למדו את הקיצור transition, את כל פונקציות התזמון זו לצד זו, מה אפשר ומה אי אפשר להנפיש, את הפתרון ל-height: auto ואת reduced motion.

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

transition בדוגמה אחת

transition אומר לדפדפן: כשהמאפיין הזה משתנה, הנפש אותו לאורך הזמן הזה במקום להחליף בבת אחת. שימו אותו בכלל הרגיל של האלמנט, לא רק ב-:hover:

העבירו את העכבר מעל הכפתור הראשון: הצבע שלו דוהה לירוק והוא עולה 4px במשך 0.4 שניות, והרחקת הסמן מנגנת את אותו transition בחזרה. לכפתור השני יש transition: none והוא מתחלף מיד. משתמשי מקלדת מקבלים את אותו אפקט דרך :focus-visible.

הקיצור transition

transition: background-color 0.3s ease-in-out 0.1s;
/*          property         duration timing    delay */
מאפיין מלאמה הוא קובעברירת מחדל
transition-propertyאילו מאפיינים מונפשים (all, או רשימה)all
transition-durationכמה זמן, ב-s או ב-ms0s
transition-timing-functionעקומת המהירותease
transition-delayהמתנה לפני ההתחלה (יכולה להיות שלילית)0s

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

.card {
  transition: transform 0.2s ease-out, box-shadow 0.4s ease-out;
}

פונקציות תזמון זו לצד זו

פונקציית התזמון קובעת איך המהירות משתנה במהלך ה-transition. לחצו על Play וכל שבעת הפסים זזים את אותו מרחק באותן 1.5 שניות:

פונקציית תזמוןמרגישה כמו
linearמהירות קבועה, מכנית
ease (ברירת מחדל)התחלה מהירה, עצירה עדינה
ease-inהתחלה איטית, סוף מהיר: טוב לדברים שיוצאים
ease-outהתחלה מהירה, סוף איטי: טוב לדברים שנכנסים
ease-in-outאיטית בשני הקצוות
cubic-bezier(x1, y1, x2, y2)עקומה משלכם; y מעל 1 חורג ומתייצב בחזרה
steps(n)קופצת ב-n צעדים שווים, בלי פריימים באמצע

לאפקטי hover ולתפריטים, ease-out עם משך בין 150ms ל-300ms מרגיש מגיב.

מה אפשר להנפיש

אפשר להנפיש מאפיינים שיש להם ערכי ביניים: צבעים, אורכים (width, padding, margin), opacity, transform, box-shadow, border-radius, filter, background-color. מאפיינים שקופצים בין מילות מפתח, כמו display או font-family, מתחלפים בבת אחת.

height: auto הוא המקרה שאנשים נתקלים בו הכי הרבה: לוח שנפתח מ-height: 0 ל-height: auto לא מונפש כברירת מחדל, כי הדפדפן לא מחשב את הערכים שבין 0 ל-"auto". פתרון עוקף אמין הוא עוטף grid שהשורה היחידה שלו עוברת מ-0fr ל-1fr:

aria-expanded אומר למשתמשי קוראי מסך אם הלוח פתוח, מה שההנפשה לבדה לא עושה.

הרצת קוד כש-transition מסתיים

האירוע transitionend מופעל כש-transition מסתיים, פעם אחת לכל מאפיין. השתמשו בו כדי לעשות משהו אחרי התנועה, כמו העברת פוקוס או הסרת אלמנט:

כבדו reduced motion

יש אנשים שמפעילים "הפחתת תנועה" בהגדרות המערכת שלהם, כי תנועה על המסך גורמת להם סחרחורת או מסיחה את דעתם. השאירו דהיות של צבע ושל opacity, ובטלו תנועות גדולות, עם media query:

@media (prefers-reduced-motion: reduce) {
  .btn { transition: background-color 0.2s ease; } /* no movement, only the color */
}

שמרו על transitions חלקים

transform ו-opacity הם המאפיינים הזולים ביותר להנפשה: הדפדפן יכול להזיז ולהדהות אלמנט בלי לחשב מחדש את הפריסה. transition על width, height, top או margin גורם לדפדפן לפרוס את הדף מחדש בכל פריים, וזה יכול לגמגם בטלפונים איטיים. כדי להזיז משהו, העדיפו transform: translate() על פני left או margin. הדף על transform מכסה את הפונקציות.

טעויות נפוצות

  • transition רק בכלל :hover. האפקט מונפש בכניסה אבל קופץ חזרה כשה-hover נגמר. שימו את transition בכלל הבסיסי.
  • משך בלי יחידה. transition: opacity 300 לא תקין. כתבו 300ms או 0.3s.
  • transition: all. הוא מנפיש כל מאפיין שמשתנה, כולל כאלה שלא התכוונתם להנפיש, ויכול להפוך שינויי פריסה לאיטיים. פרטו את המאפיינים.
  • לצפות ש-display: none ידהה. display מתחלף בבת אחת. הדהו במקום זאת את opacity (והגדירו visibility: hidden כשהדהייה מסתיימת).
  • transition ל-height: auto. הוא קופץ. השתמשו בטכניקת grid-template-rows שלמעלה.
  • משכים ארוכים באינטראקציות קטנות. כל דבר מעל 400ms בערך על כפתור או תפריט מרגיש איטי.

שאלות נפוצות

איך transitions ב-CSS עובדים?

מצהירים על אלמנט אילו מאפיינים צריכים לזוז בהנפשה ולכמה זמן, למשל transition: background-color 0.3s ease;. כשהערך של המאפיין הזה משתנה (דרך :hover, מחלקה או JavaScript), הדפדפן מנפיש מהערך הישן לחדש במקום להחליף בבת אחת.

מה סדר הערכים בקיצור transition?

transition: property duration timing-function delay;, למשל transition: opacity 0.3s ease-in 0.1s;. הכלל הנוקשה היחיד הוא שערך הזמן הראשון הוא המשך והשני הוא ההשהיה. הפרידו בין כמה transitions בפסיקים.

למה ה-transition שלי ב-CSS לא עובד?

סיבות נפוצות: ה-transition נמצא רק בכלל :hover (כך שההנפשה פועלת בכניסה וקופצת חזרה), אי אפשר להנפיש את המאפיין (display, או height ל-auto), למשך אין יחידה (0.3 במקום 0.3s), או שהערך משתנה באותו רגע שבו האלמנט מתווסף לדף.

אפשר להנפיש height: auto?

לא עם transition רגיל של height בכל הדפדפנים: אינטרפולציה ל-auto דורשת את המאפיין החדש יותר interpolate-size, שעדיין לא נתמך בכל מקום. פתרונות עוקפים נפוצים הם הנפשה של grid-template-rows מ-0fr ל-1fr על עוטף grid, או הנפשה של max-height לערך גדול מהתוכן.

מה ההבדל בין transition ל-animation ב-CSS?

transition רץ פעם אחת, בין שני ערכים, כשמאפיין משתנה. animation משתמש ב-@keyframes, יכול לכלול שלבים רבים, מתחיל מעצמו כשהדף נטען, ויכול לחזור על עצמו או לרוץ בלולאה.

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

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

להתחיל