CSS3 动画
CSS Transition
img{
height:15px;
width:15px;
}
img:hover{
height: 450px;
width: 450px;
}
img{
transition: 1s;
}
transition
的作用就在于指出状态变化所需要的时间,默认是瞬间实现,还可以指定哪个属性应用transition
:
img{
transition: 1s height;
}
指定多个属性:
img{
transition: 1s height, 1s width;
}
指定transition-delay
属性:
img{
transition: 1s height, 1s 1s width;
}
指定transition-timing-function
属性,默认不是匀速的,而是逐渐放慢,这就叫做ease:
img{
transition: 1s ease;
}
其他一些速度变化函数:
(1)linear:匀速
(2)ease-in:加速
(3)ease-out:减速
(4)cubic-bezier函数:自定义速度模式
自定义速度模式,可以使用工具来制作
transition
的完整写法如下。
img{
transition: 1s 1s height ease;
}
这其实是一个简写形式,可以单独定义成各个属性。
img{
transition-property: height;
transition-duration: 1s;
transition-delay: 1s;
transition-timing-function: ease;
}
注意:transition需要明确知道,开始状态和结束状态的具体数值,才能计算出中间状态。比如,height从0px变化到100px,transition可以算出中间状态。但是,transition没法算出0px到auto的中间状态,也就是说,如果开始或结束的设置是height: auto,那么就不会产生动画效果。类似的情况还有,display: none到block,background: url(foo.jpg)到url(bar.jpg)等等。
transition
的优点在于简单易用,但是它有几个很大的局限。
(1)transition
需要事件触发,所以没法在网页加载时自动发生。
(2)transition
是一次性的,不能重复发生,除非一再触发。
(3)transition
只能定义开始状态和结束状态,不能定义中间状态,也就是说只有两个状态。
(4)一条transition
规则,只能定义一个属性的变化,不能涉及多个属性。
CSS Animation就是为了解决这些问题而提出的。
CSS Animation
首先,CSS Animation需要指定动画一个周期持续的时间,以及动画效果的名称。
div:hover {
animation: 1s rainbow;
}
上面代码表示,当鼠标悬停在div
元素上时,会产生名为rainbow
的动画效果,持续时间为1秒。为此,我们还需要用keyframes
关键字,定义rainbow效果。
@keyframes rainbow {
0% { background: #c00; }
50% { background: orange; }
100% { background: yellowgreen; }
}
默认情况下,动画只播放一次。加入infinite关键字,可以让动画无限次播放。
div:hover {
animation: 1s rainbow infinite;
}
也可以指定动画具体播放的次数,比如3次。
div:hover {
animation: 1s rainbow 3;
}
动画结束以后,会立即从结束状态跳回到起始状态。如果想让动画保持在结束状态,需要使用animation-fill-mode
属性。
div:hover {
animation: 1s rainbow forwards;
}
animation-fill-mode
还可以使用下列值。
(1)none:默认值,回到动画没开始时的状态。
(2)backwards:让动画回到第一帧的状态。
(3)both: 根据animation-direction(见后)轮流应用forwards和backwards规则。
动画循环播放时,每次都是从结束状态跳回到起始状态,再开始播放。animation-direction
属性,可以改变这种行为。
下面看一个例子,来说明如何使用animation-direction
。假定有一个动画是这样定义的。
@keyframes rainbow {
0% { background-color: yellow; }
100% { background: blue; }
}
默认情况是,animation-direction
等于normal
。
div:hover {
animation: 1s rainbow 3 normal;
}
同transition
一样,animation
也是一个简写形式。
div:hover {
animation: 1s 1s rainbow linear 3 forwards normal;
}
这是一个简写形式,可以分解成各个单独的属性。
div:hover {
animation-name: rainbow;
animation-duration: 1s;
animation-timing-function: linear;
animation-delay: 1s;
animation-fill-mode:forwards;
animation-direction: normal;
animation-iteration-count: 3;
}
@keyframes可以把多个状态写在一行。
@keyframes pound {
from,to { transform: none; }
50% { transform: scale(1.2); }
}