CSS3 Animation
css3 中的关键帧 @keyframes
@keyframes 规则通过在动画序列中定义关键帧的样式来控制 css 动画序列中的中间步骤
@keyframes identifier { from { // 等效于 0% } to { // 等效于 100% } }
例如:
@keyframes slidein { from { margin-left: 100%; width: 300%; } to { margin-left: 0%; width: 100%; } } @keyframes identifier { 0% { top: 0; left: 0; } 30% { top: 50px; } 68%, 72% { left: 50px; } 100% { top: 100px; left: 100%; } }
css animation 属性是如下属性的简写形式:animation-name, animation-duration, animation-timing-function, animation-delay, animation-iteration-count, animation-direction 和 animation-fill-mode
/* @keyframes duration | timing-function | delay | iteration-count | direction | fill-mode | play-state | name */ animation: 3s ease-in 1s 2 reverse both paused slidein; /* @keyframes duration | timing-function | delay | name */ animation: 3s linear 1s slidein; /* @keyframes duration | name */ animation: 3s slidein;
1、animation-name
animation-name: none | IDENT[,none | IDENT]*;
用来定义一个动画的名称,主要有两个值:IDENT 是有 Keyframes 创建的动画名,或 none (默认值)。多个取值,用逗号隔开
2、animation-duration
animation-duration: <time>[,<time>]*
用来指定元素播放动画所持续的时间长,取值数值,单位s 或 ms。默认值 0
3、animation-timing-function
animation-timing-function:ease | linear | ease-in | ease-out | ease-in-out | cubic-bezier(<number>, <number>, <number>, <number>) [, ease | linear | ease-in | ease-out | ease-in-out | cubic-bezier(<number>, <number>, <number>, <number>)]*
同 tansition-timing-function
4、animation-delay
animation-delay: <time>[,<time>]*
同 transition-delay
5、animation-iteration-count
animation-iteration-count:infinite | <number> [, infinite | <number>]*
用来指定元素播放动画的循环次数,其中 <number> 取值为数字,默认是 1。infinite 为无限次数循环
6、animation-direction
animation-direction: normal | alternate [, normal | alternate]*
用来指定元素动画播放的方向,默认值是 normal,表示动画的每次循环都是向前播放;另一个取值是 alternate,表示动画播放在第偶数次向前播放,奇数次反方向播放
7、animation-play-state
animation-play-state:running | paused [, running | paused]*
用来控制元素动画的播放状态,允许播放和暂停
8、animation-fill-mode
用来指定动画执行前后如何为目标元素应用样式
demo:文本滑过浏览器窗口
<p class="text">Lorem ipsum dolor sit amet consectetur, adipisicing elit. Distinctio ex amet deleniti, earum ratione assumenda eius laborum nulla minima, unde ullam natus et nostrum labore optio totam laudantium reprehenderit est.</p>
.text{ animation-name: slidein; animation-duration: 3s; } @keyframes slidein { from{ margin-left: 100%; width: 300%; } to{ margin-left: 0%; width: 100%; } }
此时,第一帧时,元素的左边距为100%(即位于容器的右边界),宽为300%(即容器宽度的3倍),整个标题位于浏览器窗口右边界之外。第二帧时,元素的左边距为0,宽度为100%,使得动画结束时元素和窗口边界对齐
增加一个帧,让字体变大然后恢复正
@keyframes slidein { from{ margin-left: 100%; width: 300%; } 75%{ margin-left: 25%; width: 150%; font-size: 300%; } to{ margin-left: 0%; width: 100%; } }
重复动画
animation-iteration-count 用以指定动画重复的次数,仅仅使用该属性就能使动画重复播放。例如:infinite 可以使动画无限重复
.text{ animation-name: slidein; animation-duration: 3s; animation-iteration-count: infinite; } @keyframes slidein { from{ margin-left: 100%; width: 300%; } // 75%{ // margin-left: 25%; // width: 150%; // font-size: 300%; // } to{ margin-left: 0%; width: 100%; } }
来回运动
animation-direction 属性为 alternate 时,可以使标题来回滑动,避免每次动画开始时总是调回开始位置显得很怪异
.text{ animation-name: slidein; animation-duration: 3s; animation-iteration-count: infinite; animation-direction: alternate; } @keyframes slidein { from{ margin-left: 100%; width: 300%; } // 75%{ // margin-left: 25%; // width: 150%; // font-size: 300%; // } to{ margin-left: 0%; width: 100%; } }
使用动画事件
利用动画事件可以更好的控制动画和信息。这些事件由 AnimationEvent对象表示,可探测动画何时开始结束和开始新的循环。每个事件包括动画发生的时间和触发事件的动画名称。
我们将修改滑动文本示例,输出每个动画事件出现时的信息。
.slidein { -moz-animation-duration: 3s; -webkit-animation-duration: 3s; animation-duration: 3s; -moz-animation-name: slidein; -webkit-animation-name: slidein; animation-name: slidein; -moz-animation-iteration-count: 3; -webkit-animation-iteration-count: 3; animation-iteration-count: 3; -moz-animation-direction: alternate; -webkit-animation-direction: alternate; animation-direction: alternate; } @-moz-keyframes slidein { from { margin-left:100%; width:300% } to { margin-left:0%; width:100%; } } @-webkit-keyframes slidein { from { margin-left:100%; width:300% } to { margin-left:0%; width:100%; } } @keyframes slidein { from { margin-left:100%; width:300% } to { margin-left:0%; width:100%; } }
(1)、添加动画事件监听器
我们使用JavaScript代码监听所有三种可能的动画事件,setup()方法设置事件监听器,当文档第一次加载完成时执行该方法
var e = document.getElementById("watchme"); e.addEventListener("animationstart", listener, false); e.addEventListener("animationend", listener, false); e.addEventListener("animationiteration", listener, false); e.className = "slidein";
以上是非常标准的代码写法,setup()最后设置动画元素的class为slidein,启动动画。
为什么这样做?因为animationstart事件在动画一开始时就被触发,在我们的示例中,该事件在我们的代码执行前就被触发,所以我们自己通过设置元素的的class来启动动画。
(2)、接收事件
事件传递给listener()函数,代码如下所示
function listener(e) { var l = document.createElement("li"); switch(e.type) { case "animationstart": l.innerHTML = "Started: elapsed time is " + e.elapsedTime; break; case "animationend": l.innerHTML = "Ended: elapsed time is " + e.elapsedTime; break; case "animationiteration": l.innerHTML = "New loop started at time " + e.elapsedTime; break; } document.getElementById("output").appendChild(l); }
通过event.type来判断发生的是何种事件,然后添加对应的注解到<ul>中。
HTML代码:
<div> <h1 id="watchme">Watch me move</h1> <p class="text">Lorem ipsum dolor sit amet consectetur, adipisicing elit. Distinctio ex amet deleniti, earum ratione assumenda eius laborum nulla minima, unde ullam natus et nostrum labore optio totam laudantium reprehenderit est.</p> <ul id="output"></ul> </div>
注意以上时间非常接近预期时间,但不是完全相等。也要注意在最后一个周期完成后,不会触发animationiteration事件,而触发animationend事件。
参考文档:
https://developer.mozilla.org/zh-CN/docs/Web/CSS/animation
http://www.w3cplus.com/content/css3-animation