【小宅按】 介绍CSS动画和JS动画的基本特点,以及轻量级动画库velocity.js的基本用法。
示例代码托管在:http://www.github.com/dashnowords/blogs
博客园地址:《大史住在大前端》原创博文目录
一. CSS动画 和 JS动画
Web动画的本质是元素状态改变造成的样式变更,CSS动画和JS动画的区别并不是由语言来决定的,而是由两者的特点和适用场景来判断的。CSS
动画简洁高效,提升交互体验而编写的代码可以轻松地和主要业务逻辑之间实现隔离,开发中建议优先使用;而当你需要更丰富的缓动函数,多对象关联动画或是需要在动画执行的特定时间点关联一些其他的业务逻辑等需要细节控制的场景中,JS
动画就会显得更加清晰且易维护,两者从来都不是非黑即白的选项。
1.1 CSS动画
CSS
动画通常指使用transition
实现的过渡动画和使用animation
来实现的关键帧动画。
transition动画
transition
动画也被称为“简易补间动画”,需要提供起始和结束两个关键帧,浏览器才能够完成样式差异比对并计算出对应的过渡动画。开发者编写的CSS
代码会在渲染之前被浏览器使用(也就是生成CSSOM
的过程),所以对于被渲染出来的元素而言,首屏渲染的结果就可以被当做是起始关键帧,那么结束关键帧从哪里来?首先通过JS
脚本来修改指定元素的样式或是类名是可行的,另一种方式就是利用带有交互事件属性的CSS伪类
(例如:hover
或是:focus
),当对应的事件触发时,新的样式就会作用于指定元素,这种特性也可以理解为CSS
语法中的事件回调机制。当结束关键帧被创建后,浏览器就可以自动计算两者之间的差异并完成过渡动画。
transition
动画的要点就是具有样式差异的两个关键帧。如果CSS
代码中只包含一般的静态选择器(指CSS
代码中不包含能够造成HTML元素状态变更的选择器),那么被渲染出的元素在整个生命周期中就只会拥有一个关键帧,也就是首次被渲染时的样式,而1个关键帧或是2个没有样式差异的关键帧都无法进行插值计算,这也就不难理解为什么首屏渲染时transition
不会生效了。
所以transition
动画比较适合被用来实现指定元素在两个明确的包含样式差异的状态之间往复切换的场景,像是鼠标的移入移出,元素的聚焦失焦等。
animation动画
animation
动画需要使用@keyframes
关键词先将动画过程抽象出来,然后将其关联给指定元素的animation
属性,它可以看做是transition
动画的加强版。
使用@keyframes
定义动画时通常需要指定from
和to
两个状态(也可以使用0
和100%
),这意味着开发者只要按照语法要求去定义一个动画过程,它至少会包含两个关键帧,所以即使没有CSS
伪