CSS Transition
基本的用法
动画的概念主要的引入是在CSS3
中进行引入的,在CSS3
引入transition
之前,CSS
是没有时间轴的,也就是说所有的变化都是在一瞬间完成的,也就是即使完成的。不会有从某一个状态慢慢转化成另外一个状态的过程,都是在一瞬间就完成,但是我们在transition
这个引入之后,就可以在网站上显示一个实现的过程。
img{
height:15px;
width:15px;
}
img:hover{
height: 450px;
width: 450px;
}
在这样的一个例子中,我们会在一瞬间就实现img
大小的变化,我们如果想要实现动态的效果,但是我们可以通过设置transition
来指定变化所需要的时间。我们也可以设置高度来指定,动画的效果仅仅在高度上面发生,但是其他的属性,如宽度,依旧是突然发生。
img{
transition: 1s;
transition: 1s heigth;
}
transition-delay
我们在上面的例子里面发现我们可以在transition
里面分别指定多个属性。但是这样的话就会导致宽度和高度的变化是一样的,这样就和不指定他们没有什么区别。
img{
transition: 1s height, 1s width;
}
如果我们希望看到一个非常明显的动画效果,让height
先发生变化,结束之后,再让width
发生变化,这样做就很容易,就是给width
指定一个delay
参数
img{
transition: 1s height,1s 1s width
}
上面的代码指定,在width
在1s之后,再开始变化。也就是延迟了1s的时间。delay
的真正意义在于,它指定了动画发生的顺序,可以将多个不同的transition
可以连接在一起,形成复杂的效果。
transition-timing-function
transition
的状态变化速度(timing function
)默认并不是匀速的,而是逐渐放慢的,叫做:ease
img{
transition: 1s ease;
}
除了ease
之外还有其他的几种模式:
-
linear
:匀速模式 -
ease-in
:加速模式 -
ease-out
:减速 -
cubi-bezie
r函数:自定义的速度模式
transition的各项属性
transition
的完整写法
img{
transition: 1s 1s height ease;
}
这个是最简单的写法,我们还可以单独的定义各个属性。
img{
transition-prototype:height;
transition-duration:1s;
transition-delay:1s;
transition-timing-function: ease;
}
transition注意事项:
(1)transition
的兼容性已经做的很好,不需要再前面添加浏览器的前缀
(2)transition
需要明确的指挥刀,开始状态和结束状态的具体数值,这样才能计算出中间的状态,比如上面的例子我们的宽度从15px
到达450px
。在这个过程中transition
可以为我们计算,但是我们不能计算出0
到auto
的中间状态,也就是说一旦我们将开始或是最终状态设置为auto
的话我们就不能产生动画效果,类似的情况举个例子:display:none
到block
等等。
transition的局限
transition
的优点在于简单易用,那么是不是可以完全的取代js渲染出来的动画吗?事实证明我们现在的transition
属性还存在很大的局限性:
(1)transition
需要事件触发,所以没有办法在网页加载的时候自动的发生。
(2)transition
是一次性的,不能重复大声的,除非是一而再在文山的被触发。
(3)transition
只能定义开始状态和最终转台,没有中间状态,也就是说,只能拥有2个状态。
(4)一条transition
规则,只能定义一个属性的变化,不能涉及多个属性。
CSS Animation
CSS Animation
需要制定动画一个周期持续的时间,以及动画的名称
div :hover{
animation: 1s rainbow;
}
也就是说上面的代码的意思是在鼠标悬停在div
元素上面的时候,会产生一个名为rainbow
的动画效果,而且持续时间为1s
,现在我们需要使用keyframes
关键字来定义rainbow
的效果:
@keyframes rainbow {
0% { background: #c00; }
50% { background: orange; }
100% { background: yellowgreen; }
}
其中的0%、50%、100%指的是时间轴上面的时间时刻,如果有需要的话完全可以插入更多的状态。
/*infinite的意思是可以无限次的播放*/
div:hover {
animation: 1s rainbow infinite;
}
/*3的意思是可以播放3次*/
div:hover {
animation: 1s rainbow 3;
}
animation-fill-mode
动画结束之后,我们会立即从结束状态跳回到开始状态。如果想要动画保持结束的状态,我们需要使用animation-fill-mode
属性。
div:hover {
animation: 1s rainbow forwards;
}
当然animation-fill-mode
还可以使用下列值
-
none
:默认值,回到动画没开始时的状态。 -
backwards
:让动画回到第一帧的状态 -
both
:根据animation-direction轮流应用forwards和backwards规则。
animation-direction
我们在进行动画循环播放的时候,每一次都从结束状态跳到起始状态,在开始循环的播放。animation-direction
属性,可以改变这种行为。
来说明人如何使用animation-direction
这个属性,假定一个动画是这样定义的。
@keyframes rainbow {
0% { background-color: yellow; }
100% { background: blue; }
}
默认情况是animation-direction
等于normal
。
div:hover{
animation:1s rainbow 3 normal;
}
animation-direction
指定了动画播放的方向,最常用的值是normal
和reverse
。效果如下图:
animation的各项属性
和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
关键字用来定义动画的各个状态,写法非常的自由。
@keyframes rainbow {
0% { background: #c00 }
50% { background: orange }
100% { background: yellowgreen }
}
我们制定的是开始状态的标识是0%,结束状态是100%,中间状态是50%。但是我们也可以使用from
来代表0%,100%可以通过to
来代表,因此上面的代码等价于下面的形式。
@keyframes rainbow {
from { background: #c00 }
50% { background: orange }
to { background: yellowgreen }
}
如果省略中间的某个状态,浏览器会自动的推算中间的状态,所以下面的都是一些合格的写法。
@keyframes rainbow {
50% { background: orange }
to { background: yellowgreen }
}
@keyframes rainbow {
to { background: yellowgreen }
}
也可以将多个状态写在一行
@keyframes pound {
from,to { transform: none; }
50% { transform: scale(1.2); }
}
我们一般实现一个状态向另外一个状态过度,一般是平滑过度的,但是steps
函数可以实现分步过渡。
animation-play-state
有的时候,动画的播放过程中,会突然停止,然后,对于动画的默认状态是跳回到动画的开始状态。如果我们希望动画可以保持停在终止状态,就要使用animation-play-state
属性。
div {
animation: spin 1s linear infinite;
animation-play-state: paused;
}
div:hover {
animation-play-state: running;
}
当前现状
现在IE10、火狐浏览器支持不带浏览器前缀的animations
,但是chrome
是不支持的,所以必须使用webkit
前缀。