刘晚林 @
+
=
已知起始状态和终止状态,缓动函数指定了唯一的运行轨迹
多个状态,多个属性的变化
包含多个函数translate、rotate、scale、skew、perspective、matrix
transform: rotateY(50deg);
transform: rotateY(50deg) perspective(800px);
如果transform的各个函数对应不上
浏览器的处理方式
矩阵反解
时刻t
计算过渡值
合成矩阵
时刻t样式:M3
H5动画师中如何利用关键帧设计动画
设计者
数据
渲染引擎
JS动画
css动画
共同:关键帧
优点
0%,50%,100%
0%,50%,100%
0%,50%,100%
0%,60%,100%
删除
移动
0%{
left: 0px;
}
100%{
left: 100px;
}
left: 0
left: 100
50%
50%{
left: 50px
}
数据
渲染引擎
生成keyframes和动画style
元素播放动画
交互触发动画
清除旧的动画class,添加新动画class
触发layout
clientHeight, clientLeft, clientTop, clientWidth, focus(), getBoundingClientRect(), getClientRects(), innerText, offsetHeight, offsetLeft, offsetParent, offsetTop, offsetWidth, outerText, scrollByLines(), scrollByPages(), scrollHeight, scrollIntoView(), scrollIntoViewIfNeeded(), scrollLeft, scrollTop, scrollWidth .....
触发paint
composite
layer
.example1 {
transform: translateZ(0);
}
.example2 {
transform: rotateZ(360deg);
}
几乎每个元素都会形成层
vs translatez hack
function onTouchMove (evt) {
translateY = translateY + evt.deltaY;
if (scheduledAnimationFrame)
return;
scheduledAnimationFrame = true;
requestAnimationFrame(update);
}
function update() {
container.style.transform = 'translateY(' + translateY + ') translateZ(0)';
// 其他操作
}
element.animate([
{
background: 'red',
transform: 'none',
easing: 'ease-out',
},
{
offset: 0.1,
transform: 'translateY(100px)',
easing: 'ease-in-out',
},
{
offset: 0.2,
transform: 'translate(100px, 100px)',
easing: 'ease-in-out',
},
{
offset: 0.4,
transform: 'translateX(100px)',
easing: 'ease-out',
},
{
background: 'blue',
transform: 'none',
},
], {
duration: 4000,
iterations: Infinity,
});
future