DevTools для
CSS-анимации
Стас Мельников
Наставник по HTML-верстке в "TeenCoder"
Содержание
— Способы реализации анимации в CSS
— Реализация анимации со свойствами position и left
— Реализация анимации со свойством transform
— Реализация анимации со свойствами will-change, position и left
— Внутренние процессы при анимации
— Тестирование производительности анимации
— Инструмент "Paint Flashing"
— Инструмент "Cubic bezier editor"
Как создать анимацию?

Transition. Плавные переходы
transition-property — свойство, устанавливающее список CSS-свойств для перехода.
transition-duration — свойство, устанавливающее длительность перехода в миллисекундах (ms) или в секундах (s).
transition-timing-function — свойство, устанавливающее плавность перехода.
transition-delay — свойство, устанавливающее задержку перехода в миллисекундах или в секундах.
Animation. Анимация
animation-name — свойство, устанавливающее название анимации.
animation-duration — свойство, устанавливающее длительность анимации в миллисекундах (ms) или в секундах (s).
animation-direction — свойство, устанавливающее направление анимации.
animation-delay — свойство, устанавливающее задержку анимации в миллисекундах или в секундах.
Animation. Анимация
animation-timing-function — свойство, устанавливающее плавность анимации.
animation-iteration-count — свойство, устанавливающее количество повторений анимации.
animation-fill-mode — свойство, устанавливающее режим взаимодействия с элементом до, после и до/после анимации.
@keyframes — правило, устанавливающее сценарий анимации.
А теперь сделаем анимашку

Demo
<button id="start">Start</button>
<div class="demo">
<div class="ball"></div>
<div class="ball"></div>
<div class="ball"></div>
</div>
*{
padding: 0;
}
body{
font-family: arial, sans-serif;
}
.demo{
position: relative;
padding-top: 30px;
}
button{
border: 1px solid #000;
background-color: #fff;
padding: 8px 20px;
cursor: pointer;
}
.button_active{
background-color: #000;
color: #fff;
}
.ball{
width: 80px;
height: 80px;
background-color: #eaeaea;
border-radius: 50%;
box-shadow: 0 0 10px #000;
}
Demo
.ball{
position: absolute;
left: 0;
}
.ball:nth-child(2){
top: 130px;
}
.ball:nth-child(3){
top: 230px;
}
.animation-start{
animation: ball 1s ease-out alternate infinite;
}
@keyframes ball{
0%{
left: 0;
}
100%{
left: 600px;
}
}
Demo
(function(){
var startButton = document.querySelector("#start"),
balls = document.querySelectorAll('.ball'),
len = balls.length;
startButton.addEventListener("click", function(){
if(this.classList.contains("button_active")){
for(var i = 0; i < len; i++){
balls[i].classList.remove("animation-start");
}
this.textContent = "Start";
this.classList.remove("button_active");
}else{
for(var j = 0; j < len; j++){
balls[j].classList.add("animation-start");
}
this.textContent = "Stop";
this.classList.add("button_active");
}
});
})();
Demo

Измерим
производительность

Demo

Давайте разберемся!

FPS — это количество кадров в секунду

Процессы
— Событие
— Перерасчет CSS
— Расчет размеров и позиции
— Заполнение пикселей (Растеризация)
— Компановка (Композитинг)

Как отрисовка кадра зависит от CSS?


Например: width, height, left, top

Например: color, background-color

Например: transform, opacity
Вернемся к диаграмме!

Demo

А что если использовать translate3d?

Translate3d
.ball{
transform: translate3d(0, 0, 0);
margin-top: 30px;
}
.animation-start{
animation: ball 1s ease-out alternate infinite;
}
@keyframes ball{
0%{
transform: translate3d(0, 0, 0);
}
100%{
transform: translate3d(600px, 0, 0);
}
}
Demo

Will-change

Will-change
.ball{
position: absolute;
left: 0;
will-change: left;
}
.ball:nth-child(2){ top: 130px; }
.ball:nth-child(3){ top: 230px; }
.animation-start{
animation: ball 1s ease-out alternate infinite;
}
@keyframes ball{
0%{ left: 0; }
100%{ left: 600px; }
}
Demo

Результаты
Свойство | Время(s) | Rendering(ms) | Painting(ms) |
---|---|---|---|
Absolute | ~4 | 238.8 | 164.8 |
Translate3d | ~4 | 21.5 | 3.4 |
Will-change | ~4 | 286.4 | 127.7 |
Выводы
— использовать translate3d
— в других случаях использовать will-change
— при отладке обращать внимание на шкалу Raster
— проверять список вызванных событий
во вкладке Event Log
— контролировать создание композитных слоев
Больше инструментов!

Paint Flashing

Cubic bezier editor

Стас Мельников
DevTools для CSS-анимации
By Stas Melnikov
DevTools для CSS-анимации
- 1,075