При запуске анимации берется временная метка. Затем каждый раз, когда срабатывает шаг (зависит от браузера и от того, сколько всего происходит), вычисляется, сколько времени прошло с момента запуска анимации, и исходя из этого вычисляется прогресс.
Например, анимация началась в 1322338364714, и анимация должна длиться 5000 мс. После запуска шага прогресс вычисляется так:
- Получить текущее время, скажем, 1322338366714.
- Нормализация = 1322338366714 - 1322338364714 = 2000
- Прогресс 2000/5000 = 0,4 = 40%. Таким образом, div, который анимируется от 0px до 100px, получает высоту 40px.