במדריך הזה מוסבר איך ליצור אנימציות CSS בעלות ביצועים גבוהים.
אפשר לעיין בקטע למה חלק מהאנימציות איטיות? כדי לקבל מידע נוסף על התיאוריה שמאחורי ההמלצות האלה.
תאימות דפדפן
כל מאפייני ה-CSS שמדריך זה ממליץ לכלול בהם מתאימים לדפדפנים שונים תמיכה.
transform
opacity
will-change
העברת רכיב
כדי להעביר רכיב, צריך להשתמש בערכי מילת המפתח translate
או rotation
של
transform
.
לדוגמה, כדי להחליק את הפריט לתצוגה, אפשר להשתמש ב-translate
.
.animate {
animation: slide-in 0.7s both;
}
@keyframes slide-in {
0% {
transform: translateY(-1000px);
}
100% {
transform: translateY(0);
}
}
אפשר להשתמש ב-rotate
כדי לסובב אלמנטים. בדוגמה הבאה מתבצעת רוטציה של רכיב
360 מעלות.
.animate {
animation: rotate 0.7s ease-in-out both;
}
@keyframes rotate {
0% {
transform: rotate(0);
}
100% {
transform: rotate(360deg);
}
}
שינוי גודל של רכיב
כדי לשנות גודל של רכיב, צריך להשתמש בערך scale
של מילת המפתח
נכס transform
.
.animate {
animation: scale 1.5s both;
}
@keyframes scale {
50% {
transform: scale(0.5);
}
100% {
transform: scale(1);
}
}
שינוי החשיפה של רכיב
כדי להציג או להסתיר רכיב, אפשר להשתמש בסמל opacity
.
.animate {
animation: opacity 2.5s both;
}
@keyframes opacity {
0% {
opacity: 1;
}
50% {
opacity: 0;
}
100% {
opacity: 1;
}
}
נמנעים ממאפיינים שמפעילים פריסה או צבע
לפני שמשתמשים במאפיין CSS כלשהו לאנימציה (מלבד transform
ו-opacity
),
לקבוע את ההשפעה של הנכס על צינור עיבוד הנתונים של העיבוד.
אין להשתמש בנכסים שמפעילים פריסה או צבע, אלא אם הם הכרחיים.
אילוץ יצירת שכבות
כמו שמוסבר במאמר למה חלק מהאנימציות איטיות?, הצבת רכיבים בשכבה חדשה מאפשרת לדפדפן לצבוע אותם מחדש בלי שיהיה צורך לצבוע מחדש את שאר הפריסה.
דפדפנים יכולים בדרך כלל לקבל החלטות טובות לגבי הפריטים שיוצבו
אבל אפשר לאלץ יצירת שכבות באופן ידני באמצעות
will-change
.
כפי שהשם מרמז, המאפיין הזה מציין לדפדפן שהרכיב הזה עומד
ניתן לשינוי בצורה מסוימת.
ב-CSS, אפשר להחיל את will-change
על כל בורר:
body > .sidebar {
will-change: transform;
}
עם זאת, המפרט
מציעה לעשות זאת רק עבור רכיבים שתמיד עומדים
שינוי. לדוגמה, יכול להיות שהפעולה הזו רלוונטית לסרגל צד שהמשתמש יכול להחליק פנימה,
החוצה. עבור רכיבים שלא משתנים לעיתים קרובות, מומלץ להחיל
will-change
שימוש ב-JavaScript כאשר צפוי שינוי. צריך לוודא
לתת לדפדפן מספיק זמן לבצע את האופטימיזציות הנדרשות, ולהסיר
הנכס כשהשינוי נפסק.
אם מאלצים יצירת שכבות בדפדפן שלא תומך ב-will-change
(כנראה Internet Explorer), אפשר להגדיר את transform: translateZ(0)
.
ניפוי באגים באנימציות איטיות או איטיות
לכלי הפיתוח ל-Chrome ולכלי הפיתוח ל-Firefox יש המון כלים שיעזרו לכם להבין למה האנימציות איטיות או איטיות.
בדיקה אם אנימציה מפעילה פריסה
אנימציה שזזה רכיב באמצעות משהו שהוא לא transform
היא
יהיו איטיים. הדוגמה הבאה מציגה השוואה בין אנימציה באמצעות transform
לאנימציה באמצעות top
ו-left
.
.box { position: absolute; top: 10px; left: 10px; animation: move 3s ease infinite; } @keyframes move { 50% { top: calc(90vh - 160px); left: calc(90vw - 200px); } }
.box { position: absolute; top: 10px; left: 10px; animation: move 3s ease infinite; } @keyframes move { 50% { transform: translate(calc(90vw - 200px), calc(90vh - 160px)); } }
אפשר לבדוק את זה בשתי הדוגמאות הבאות מהתקלה: ולבדוק את הביצועים באמצעות כלי פיתוח.
כלי פיתוח ל-Chrome
- פותחים את החלונית ביצועים.
- תיעוד ביצועים של סביבת זמן ריצה בזמן האנימציה.
- בודקים את הכרטיסייה סיכום.
אם אתם רואים ערך שאינו אפס בשדה רינדור בכרטיסייה סיכום, יכול להיות סימן שהאנימציה גורמת לדפדפן להפעיל את הפריסה.
כלי פיתוח ל-Firefox
בכלי הפיתוח ל-Firefox, יש Waterfall יכול לעזור לך להבין היכן הדפדפן מבלה זמן.
- פותחים את החלונית ביצועים.
- מתחילים לתעד את הביצועים בזמן שהאנימציה מתבצעת.
- מפסיקים את ההקלטה ובודקים את הכרטיסייה Waterfall.
אם מופיעות רשומות של חישוב מחדש של סגנון, כלומר, הדפדפן צריך לחזור Waterfall בתהליך רינדור כדי לעבד את האנימציה.
בדיקה אם יש ירידה בכמות הפריימים
- פותחים את הכרטיסייה רינדור בכלי הפיתוח ל-Chrome.
- מפעילים את תיבת הסימון מד FPS.
- צפייה בערכים בזמן האנימציה פועלת.
שימו לב לתווית Frames בחלק העליון של ממשק המשתמש של מד FPS.
כאן מוצגים ערכים כמו 50% 1 (938 m) dropped of 1878
. עם ביצועים גבוהים
לאנימציה יש אחוז גבוה, למשל 99%
, כלומר ,מעט פריימים
יורד והאנימציה נראית חלקה.
איך בודקים אם אנימציה גורמת להפעלה של צבע
יש נכסים שקופאים ליותר מדי זמן בדפדפן. עבור כל דבר שכרוך בטשטוש (כמו צל, למשל) הארך. כדי לצבוע מאשר לשרטט תיבה אדומה. ההבדלים האלה לא תמיד בולטים לעין אבל כלי הפיתוח לדפדפן יכולים לעזור לך לזהות באילו תחומים וגם בעיות אחרות שקשורות לציור.
כלי פיתוח ל-Chrome
- פותחים את הכרטיסייה רינדור בכלי הפיתוח ל-Chrome.
- בוחרים באפשרות הבהוב גוון.
- מזיזים את הסמן ברחבי המסך.
אם כל המסך מהבהב או אזורים מודגשים שאתם לא חושבים עליהם. צריכים להשתנות, ולחקור לעומק.
אם צריך לקבוע אם נכס מסוים גורם בעיות בביצועים שקשורות לציורים, הכלי לבדיקת ביצועים של צבעי ציור בכלי הפיתוח ל-Chrome יכולים לעזור.
כלי פיתוח ל-Firefox
- פותחים את ההגדרות ומוסיפים לחצן של ארגז הכלים עבור מחליפים את המצב של הבהוב צבע.
- בדף שרוצים לבדוק, מפעילים את הלחצן ומזיזים את העכבר או גוללים כדי לראות את האזורים המודגשים.
סיכום
אם אפשר, כדאי להגביל את האנימציות לopacity
ולtransform
כדי להמשיך
אנימציות בשלב המורכב של נתיב העיבוד. שימוש בכלי הפיתוח כדי לבדוק
איזה שלב בנתיב מושפע מהאנימציות שלכם.
אפשר להשתמש בכלי לניתוח של צבע כדי לראות אם פעולות של צבע מיושמות במיוחד יקרות. אם מוצאים משהו, אפשר לבדוק אם נכס CSS אחר נותן אותו מראה ותחושה עם ביצועים טובים יותר.
כדאי להשתמש במאפיין will-change
באופן מוגבל, ורק אם נתקלתם בבעיה בביצועים.