Skip to content

Commit b855f6c

Browse files
authored
add a section about css animation performance
1 parent b19a6f0 commit b855f6c

File tree

1 file changed

+47
-0
lines changed

1 file changed

+47
-0
lines changed

7-animation/2-css-animations/article.md

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -407,6 +407,53 @@ There are many articles about `@keyframes` and a [detailed specification](https:
407407

408408
You probably won't need `@keyframes` often, unless everything is in constant motion on your sites.
409409

410+
## Performance of CSS animations
411+
412+
Most CSS properties can be animated, because most of them are numeric values. For instance, `width`, `color`, `font-size` are all numbers. When you animate them, the browser gradually changes these numbers frame by frame, creating a smooth effect.
413+
414+
However, not all animations will look as smooth as you'd like, because different CSS properties cost differently to change. Among all the properties, `transform` and `opacity` are the cheapest to animate, and produce the highest framerate, so in real life projects, you should try to only use these two to achieve your desired effects.
415+
416+
The reason for this is when something is being _transformed_, the browser engine is able to only worry about changing the look of this one thing, without touching other existing things on the page. Same for opacity change.
417+
418+
In more technical details, when there's a style change, the browser goes through 3 steps to render the new look:
419+
420+
1. **Layout**: re-compute the geometry and position of each element, then
421+
2. **Paint**: re-compute how everything should look like, including "layers" which is a big deal, then
422+
3. **Composite**: render the final results into pixels on screen.
423+
424+
During CSS animation, this process repeats every frame. You can check [how each CSS change triggers these steps](https://csstriggers.com/), and you'll find most changes will trigger ` 1` `2` `3`, while color change only triggers `2` `3`, and transform and opacity only trigger `3`.
425+
426+
Luckily, `transform` is by far the most useful and most powerful property to animate. By using `transform` on an element, you could rotate and flip it, stretch and shrink it, move it around, and [many more](https://developer.mozilla.org/docs/Web/CSS/transform#syntax).
427+
428+
Meanwhile, `opacity` can help with show / hide or fade-in / fade-out effects. By paring `transform` with `opacity` you can usually solve all your needs, for example:
429+
430+
```html run height=80 autorun no-beautify
431+
<h1 onclick="this.classList.toggle('animated')">click me to start / stop</h1>
432+
433+
<style>
434+
h1.animated {
435+
animation: hello-goodbye 1.8s infinite;
436+
width: fit-content;
437+
}
438+
@keyframes hello-goodbye {
439+
0% {
440+
transform: translateY(-60px) rotateX(0.7turn);
441+
opacity: 0;
442+
}
443+
50% {
444+
transform: none;
445+
opacity: 1;
446+
}
447+
100% {
448+
transform: translateX(230px) rotateZ(90deg) scale(0.5);
449+
opacity: 0;
450+
}
451+
}
452+
</style>
453+
```
454+
455+
In earlier examples in this chapter, we've animated `font-size`, `left`, `width`, `height`, etc. In real life projects, they could be replaced by `transform: scale()` and `transform: translate()` for better performance. <!-- More on this topic [here](https://web.dev/animations-overview/) and [here](https://web.dev/animations-guide/). -->
456+
410457
## Summary
411458

412459
CSS animations allow smoothly (or not) animated changes of one or multiple CSS properties.

0 commit comments

Comments
 (0)