先解决上一篇的遗留问题。 

div {
width: 300px;
height: 200px;
background-color: red;
-webkit-animation: test1 2s;
}
@-webkit-keyframes test1 {
from {background-color: green;}
to {background-color: red;}
}

  这样定义的动画,实际情况是只跑一次,无论鼠标悬浮还是移出都不会再次启动动画。

  why?因为transition和animation的工作模式是不同的,transition可以理解为监听器,一旦触发即启动。而animation则可以理解为命令,当时有效,执行完后作废,除非再下命令。

  那这样是否有效呢?

div {
width: 300px;
height: 200px;
background-color: red;
-webkit-animation: test1 2s;
}
div:hover {
-webkit-animation: test1 2s;
}
@-webkit-keyframes test1 {
from {background-color: green;}
to {background-color: red;}
}

  结果还是无效,但是

div {
width: 300px;
height: 200px;
background-color: red;
-webkit-animation: test1 2s;
}
div:hover {
-webkit-animation: test2 2s;
}
@-webkit-keyframes test1 {
from {background-color: green;}
to {background-color: red;}
}
@-webkit-keyframes test2 {
from {background-color: green;}
to {background-color: red;}
}

  这样就有效了。

  上面两个例子的区别说明了:

  1. animation执行完后不是作废了,而是处于end的状态
  2. 状态跟随animation-name,只有animation-name改变时,状态才初始化

  好了,弄清楚了animation和transition最核心的区别,然后来看animation中的所有属性。用上一篇的代码作为初始代码:

div {
width: 300px;
height: 200px;
background-color: red;
-webkit-animation: test1 2s forwards;
}
div:hover {
-webkit-animation: test2 2s forwards;
}
@-webkit-keyframes test1 {
from {background-color: green;}
to {background-color: red;}
}
@-webkit-keyframes test2 {
from {background-color: red;}
to {background-color: green;}
}

  animation同样是很多属性的缩写:

  1. animation-name: 对应keyframes的name,keyframes的定义遵循 percentage {css property...},其中from为0%,to为100%

    div {
    width: 300px;
    height: 200px;
    background-color: red;
    -webkit-animation: test1 2s forwards;
    }
    div:hover {
    -webkit-animation: test2 2s forwards;
    }
    @-webkit-keyframes test1 {
    from {background-color: green; width: 500px;}
    to {background-color: red; width: 300px;}
    }
    @-webkit-keyframes test2 {
    from {background-color: red; width: 300px;}
    to {background-color: green; width: 500px;}
    }

      与transition表现不同的是,当动画进行的中途改变鼠标悬浮/移出的状态时,元素会先切换到最终的状态也就是新动画初始的状态再执行新动画。而不像transition一样平滑以当前的状态作为开始状态执行新动画。这是因为animation与元素当前的状态毫无关联,只按照keyframes的定义执行动画,而transition只以状态的改变触发的,所以跟元素当前的状态关联密切。

  2. animation-duration: 动画执行的时间。
  3. animation-timing-function: 动画执行的方式。
  4. animation-delay: 动画延迟执行的时间。
    以上三个同transition,可以看出两者的设计思想是类似的,但animation无疑更复杂,因为它还有
  5. animation-iteration-count: number | infinite 动画执行的次数n,当然总时间就是animation-durationn * n了
    div {
    width: 300px;
    height: 200px;
    background-color: red;
    -webkit-animation: test1 2s forwards 2;
    }
    div:hover {
    -webkit-animation: test2 2s forwards 2;
    }
    @-webkit-keyframes test1 {
    from {background-color: green;}
    to {background-color: red;}
    }
    @-webkit-keyframes test2 {
    from {background-color: red;}
    to {background-color: green;}
    }

    页面加载时元素由绿慢慢变红,然后立即变绿,最后再次慢慢由绿变红,动画进行了两次,但立即变绿很不平滑。这就要看下面这个属性

  6. animation-direction: normal(default) / alternate: 当执行次数为偶数时,反转关键帧进行动画
    div {
    width: 300px;
    height: 200px;
    background-color: red;
    -webkit-animation: test1 2s forwards 3 alternate;
    }
    div:hover {
    -webkit-animation: test2 2s forwards 3 alternate;
    }
    @-webkit-keyframes test1 {
    from {background-color: green;}
    to {background-color: red;}
    }
    @-webkit-keyframes test2 {
    from {background-color: red;}
    to {background-color: green;}
    }

    元素由绿慢慢变红,然后由红慢慢变绿,最后由绿慢慢变红,动画进行了三次,而且都很平滑。

  7. animation-fill-mode: 定义动画启动前的delay时间内,和动画完成后的时间内元素的CSS属性。none(default) delay时间内和完成后都使用元素本来的样式,与keyframes毫无关联 | forwards delay时间内使用本来的样式,完成后使用最后一帧的样式 | backwards delay时使用第一帧的样式,完成后使用本来的样式 | both delay时间内和完成后分别使用第一帧和最后一帧的样式
    div {
    width: 300px;
    height: 200px;
    background-color: red;
    /* 将none分别替换成forwards、backwards、both */
    -webkit-animation: test1 2s 2s none;
    }
    @-webkit-keyframes test1 {
    from {background-color: blue;}
    to {background-color: black;}
    }
  8. animation-play-state: 规定动画暂停或运行 running(default) | paused 暂停动画。比如先定义动画,然后想在鼠标悬浮的时候再执行。
    div {
    width: 300px;
    height: 200px;
    background-color: red;
    -webkit-animation: test1 2s forwards paused;
    }
    div:hover {
    -webkit-animation-play-state: running;
    }
    @-webkit-keyframes test1 {
    from {background-color: red;}
    to {background-color: green;}
    }

  还有,animation emit的事件比transition多一个。

  总共有三个事件:

  1. animationstart: 动画正式开始,要等delay的时间过去
  2. animationend: 动画正式结束,所有animation-iteration-count执行结束
  3. animationiteration: 动画重新播放时

  这三个事件没有被浏览器支持,取而代之是webkit下的webkitAnimationStart、webkitAnimationEnd、webkitAnimationEnd(注意大写字母)。简单的实现如下:

(function setup() {
var e = document.getElementsByTagName("div")[0];
e.addEventListener("webkitAnimationStart", listener, false);
e.addEventListener("webkitAnimationEnd", listener, false);
e.addEventListener("webkitAnimationIteration", listener, false);
})();
function listener(e) {
var l = document.createElement("li");
switch(e.type) {
case "animationstart":
case "webkitAnimationStart":
console.log("animation start");
break;
case "animationend":
case "webkitAnimationEnd":
console.log("animation end");
break;
case "animationiteration":
case "webkitAnimationIteration":
console.log("animation restart");
break;
}
}

  以上。

CSS3动画效果之animation的更多相关文章

  1. 鼠标悬停css3动画效果

    下载Demo 效果预览 html: <!DOCTYPE html> <html lang="en"> <head> <meta chars ...

  2. CSS自学笔记(14):CSS3动画效果

    在CSS3中也新增了一些能够对元素创建动画处理的属性.通过这些新增的属性,我们可以实现元素从一种样式变换成另一种样式时为元素添加动态效果,我们就可以取代网页中的动态图片.flash动画和JavaScr ...

  3. 第八十三节,CSS3动画效果

    CSS3动画效果 学习要点: 1.动画简介 2.属性详解 3.简写和版本 本章主要探讨HTML5中CSS3的动画效果,可以通过类 Flash那样的关键帧模式控制运行. 一.动画简介     CSS3提 ...

  4. CSS3动画效果——js调用css动画属性并回调处理详解

    http://www.jb51.net/css/258407.html 这篇文章主要详细介绍了CSS3动画效果回调处理,需要的朋友可以参考下 我们在做js动画的时候,很多时候都需要做回调处理,如在一个 ...

  5. 35个让人惊讶的CSS3动画效果

    1. Pure CSS Coke Can 2. Colorful Clock 3. jQuery DJ Hero 4. Animated Pricing Column 5. Slick jQuery  ...

  6. Css3动画效果,彩色文字效果,超简单的loveHeart

    <!DOCTYPE html><html><head><meta charset="utf-8" /><title>Cs ...

  7. Bounce.js – 快速创建漂亮的 CSS3 动画效果

    Bounce.js 是一个用于制作漂亮的 CSS3 关键帧动画的 JavaScript 库,使用其特有的方式生成的动画效果.只需添加一个组件,选择预设,然后你就可以得到一个短网址或者导出为 CSS 代 ...

  8. CSS3 动画效果带来的bug

    css3 动画效果比如transition:all 2s linear;这种用来计算及时的物体坐标的话会带来一定的问题 比如把一个DIV从A点移动到B点.JS为DIV.style.left=B; 但是 ...

  9. animate.css 一些常用的CSS3动画效果

    大家已经开始在项目中使用一些CSS3动画效果了吧,这让网站在高端浏览器上看起来很上流.animate.css是一个老外做的各种CSS3动画的合集,比较全,也很炫,大家可以参考学习一下. 项目主页:ht ...

随机推荐

  1. hdu--1045--Fire Net,NYOJ--587--dfs--blockhouses

    /* Name: NYOJ--587--blockhouses Author: shen_渊 Date: 16/04/17 21:43 Description: dfs,逐个点深度优先搜索,不管能不能 ...

  2. 如何在MySQL中设置外键约束以及外键的作用

    1.外键的作用,主要有两个:     一个是让数据库自己通过外键来保证数据的完整性和一致性     一个就是能够增加ER图的可读性 2.外键的配置 1)先创建一个主表,代码如下: #创建表studen ...

  3. NYOJ 289 苹果(01背包)

    苹果 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 ctest有n个苹果,要将它放入容量为v的背包.给出第i个苹果的大小和价钱,求出能放入背包的苹果的总价钱最大值. ...

  4. [bzoj 2438][中山市选2011]杀人游戏 概率+tarjan

    考试的时候想了很多,不知道它那个概率究竟是怎么算..没想到能蒙30分.rp爆发hhh 题解转自不知道哪里来的老师发的(代码出自自己). 实际上警察就是两种结果——查到犯人或死亡,而死亡事件一定是包含在 ...

  5. vue的一些坑(第二天)

    首先啊感谢一位小童鞋的指出其实我写的这些内容算不上坑,只是平时使用的时候的一点小问题,不过只是个名字啦!再次致谢 1:两个简写的命令 v-bind:class可以简写为  :class v-on:cl ...

  6. CSS基础学习笔记

    一. CSS介绍 1. CSS概述:CSS(Cascading Style Sheets)指层叠样式表,极大提高了工作效率. 2. 基础语法: 属性大于1个之后,属性之间用分号隔开 如果大于1个单词, ...

  7. js的call,apply,bind的使用与区别

    在原生js中会有三个很常见的函数,call,apply,bind 他们的作用就是改变当前函数的this指针, 但是细微来说他们还是有不同的. 1)call,apply都是执行某一函数,发现this有变 ...

  8. 备注: ubt 16.04 安装 gtx 1060 --- 成功运行 tensorflow - gpu

    ---------------------------------------------------------------------------------------------------- ...

  9. HTML颜色代码表/颜色名(网摘)

    HTML颜色代码表 原文出处:[颜色代码] HTML颜色名 source link: http://www.runoob.com/html/html-colornames.html

  10. 实现Qt日志功能并输出到文件(qDebug\qWarning\ qCritical\qFatal)

    <1>信息基本分类:qDebug : 调试信息提示qWarning : 一般的警告提示qCritical: 严重错误提示qFatal : 致命错误提示 <2>如何截获这些信息Q ...