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 {
  fromto { transform: none; }
  50% { transform: scale(1.2); }
}

CSS动画简介-阮一峰

results matching ""

    No results matching ""