CSS3动画
通过 CSS3,我们能够创建动画,这可以在许多网页中取代动画图片、Flash 动画以及 JavaScript。
如需在 CSS3 中创建动画,您需要学习 @keyframes 规则。
@keyframes 规则用于创建动画。
在 @keyframes 中规定某项 CSS 样式,就能创建由当前样式逐渐改为新样式的动画效果。
前面我们在使用transition制作一个简单的transition效果时,
我们包括了初始属性和最终属性,一个开始执行动作时间和一个延续动作时间以及动作的变换速率,
其实这些值都是一个中间值,如果我们要控制的更细一些,
比如说我要第一个时间段执行什么动作,第二个时间段执行什么动作
(换到flash中说,就是第一帧我要执行什么动作,第二帧我要执行什么动作),
这样我们用Transition就很难实现了,此时我们也需要这样的一个“关键帧”来控制。
那么CSS3中就是由“keyframes”这个属性来实现这样的效果。下面我们一起先来看看Keyframes:
Keyframes的语法规则,
@keyframes name1{ 0%{属性名:属性值;属性名:属性值;} 29%{属性名:属性值;属性名:属性值;} 50%{属性名:属性值;属性名:属性值;} 100%{属性名:属性值;属性名:属性值;}}
我们来解释一下语法规则:
必须以@keyframes开头,后面加动画的名称,名称由自己定义,语义化最好,
后面加一对大括号,里面可以写许多个百分比,百分比后面加一对大括号,
里面写要改变的属性及属性值,用分号隔开。
此外可以用from代替0%,表示初始状态,用to代替100%,表示结束状态。即写成如下样式:
@keyframes name1{ from{属性名:属性值;属性名:属性值;} 29%{属性名:属性值;属性名:属性值;} 50%{属性名:属性值;属性名:属性值;} to{属性名:属性值;属性名:属性值;}}
虽然keyframes已经成为了w3c的标准属性,但是为了兼容,
我们需要在谷歌和Safari等浏览器需加上内核前缀。
一般我们设置属性的时候一般都设置五种。
当您在 @keyframes 中创建动画时,请把它捆绑到某个选择器,否则不会产生动画效果。
通过规定至少以下两项 CSS3 动画属性,即可将动画绑定到选择器:
注释:您必须定义动画的名称和时长。如果忽略时长,则动画不会允许,因为默认值是 0。
@keyframes | 规定动画。 |
animation | 所有动画属性的简写属性,除了 animation-play-state 属性。 |
animation-name | 规定 @keyframes 动画的名称。 |
animation-duration | 规定动画完成一个周期所花费的秒或毫秒。默认是 0。 |
animation-timing-function | 规定动画的速度曲线。默认是 “ease”。 |
animation-delay | 规定动画何时开始。默认是 0。 |
animation-iteration-count | 规定动画被播放的次数。默认是 1。 |
animation-direction | 规定动画是否在下一周期逆向地播放。默认是 “normal”。 |
animation-play-state | 规定动画是否正在运行或暂停。默认是 “running”。 |
animation-fill-mode | 规定对象动画时间之外的状态。 |
动画名称 (animation-name)。名称是区别事物的一种最好的办法,像每个人都有自己的名字一样,我们的动画也有自己的名称,在上面学习keyframes时,我们提到了需要自己定义帧的名字,此处的名称就是刚才我们定义帧时候取的名字,是一个必不可少的属性。
动画执行时间 (animation-duration)。在keyframes阶段我们提到了百分比指的是动画执行时间的百分比,所以动画的持续时间也是一个必不可少的属性。单位是秒或者毫秒。
动画执行次数(animation-iteration-count)。动画的执行时间不可能是无限的,但是我们有时候需要这个动画一直执行下去,这时我们可以定义动画的执行次数为无限次,当然你也可以定义3次、4次、5、6、7、8等等次,当然定义多少次要看你的需要。
-webkit-animation-iteration-count: 10;(无限次为infinite)
动画变换速率(animation-timing-function)。实际上就是动画的播放方式,它和transition中的transition-timing-function一样,具有以下几种变换方式:ease , ease-in , ease-in-out , linear , cubic-bezier,cubic-bezier指的是贝塞尔曲线,稍后会讲这一部分的内容。
延迟(animation-delay)。一个页面中可能有许多的动画,有的时候我们想有的先播放,有的后播放,那么我们怎么实现这样的效果呢。animate里面引进了一个属性叫做延迟,它规定这个动画可以在延迟制定时间后再执行。单位是秒或者毫秒。
运动方向(animation-direction)。用来指定动画播放的方向,其只有两个值,默认值为normal,如果设置为normal时,动画的每次循环都是向前播放;另一个值是alternate,他的作用是,动画播放在第偶数次向前播放,第奇数次向反方向播放。
动画的播放状态(animation-play-state)。其主要有两个值,running和paused其中running为默认值。他们的作用就类似于我们的音乐播放器一样,可以通过paused将正在播放的动画停下了,也可以通过running将暂停的动画重新播放,我们这里的重新播放不一定是从元素动画的开始播放,而是从你暂停的那个位置开始播放。这个属性很少有内核支持,所以只是稍微提一下就好。
动画时间之外的状态(animation-fill-mode)。我们日常经常使用的是:forwards,当动画完成后,保持最后一个属性值(在最后一个关键帧中定义)。除此之外还有三个值,分别是none:不改变默认行为。backwards:在 animation-delay 所指定的一段时间内,在动画显示之前,应用开始属性值(在第一个关键帧中定义)。both:向前和向后填充模式都被应用。
所有动画属性串联在一起的时候,属性的排列次数是
animation: 动画名称+动画执行时间+动画变换速率+延迟+动画执行次数+运动方向
<!DOCTYPE html><html> <head> <meta charset="utf-8"> <title></title> <style type="text/css"> .animate{ width: 100px; height: 100px; background: pink; animation: name1 4s linear 2s infinite alternate; -webkit-animation: name1 4s linear 2s infinite alternate; } @keyframes name1{ 0%{width: 100px;} 29%{width: 200px;} 50%{width: 50px;} 100%{width: 100px;} } </style> </head> <body> <div class="animate"></div> </body></html>
如果每次写动画都要自己去写每一个运动的过程会是一件非常麻烦的事,
那么能不能有一个库存在,里面有非常非常多的动画,
每次我们想要用动画的时候只需要去这个库里面提取出来,这样的话就会非常方便,
也是出于这样的考虑,第三方库animate.css出现了,它里面封装了非常多的动画,
我们想要用的时候直接调用里面的动画就好了,接下来我们就来看动画的第三方库animate.css。
我们已经知道这是个包含了很多动画的库,
这里提供了链接,http://www.17sucai.com/pins/demoshow/9411,
我们可以里面看到不同的动画名称对应的不同效果,那么我们怎么使用这里面的动画呢,
它的使用方法非常简单,我们具体来看:
<!DOCTYPE html><html> <head> <meta charset="utf-8"> <title>第三方库</title> <link rel="stylesheet" type="text/css" href="animate.min.css"/> </head> <body> </body></html>
方法一:
格式:animation:”name“ time;
例: animation:”flip” 2s;
表示这个名字叫做flip的动画执行时间是2s,可以看到这种方法和我们刚才学习的是一样的。
完整代码如下:
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Document</title> <link rel="stylesheet" href="animate.min.css"> <style type="text/css"> div{ height: 200px; width: 200px; background-color: #ccc; -webkit-animation: "flip" 2s; -o-animation: "flip" 2s; animation: "flip" 2s; } </style></head><body> <div></div></body></html>
方法二:
格式:
例:
完整代码如下:
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Document</title> <link rel="stylesheet" href="animate.min.css"> <style type="text/css"> div{ height: 200px; width: 200px; background-color: #ccc; } </style></head><body> <div class="flip animated"></div></body></html>
我们学transition的时候,有一个属性叫做transition-timing-function,
这个属性规定了效果的速度曲线,里面有一些属性值,
除此之外我们还有一个参数值叫做cubic-bezier,该值允许你去自定义一个时间曲线,这就是我们要讲的贝塞尔曲线。
贝塞尔曲线(The Bézier Curves),是一种在计算机图形学中相当重要的参数曲线(2D,3D的称为曲面)。
贝塞尔曲线于1962年,由法国工程师皮埃尔·贝塞尔(Pierre Bézier)所发表,他运用贝塞尔曲线来为汽车的主体进行设计。
我们在日常开发中最常用的就是二次曲线。
偶尔会使用到三次曲线。
当然更高深的也有,但是咱们不会涉及到。
咱们在日常开发中只需要会确定锚点和控制点的位置就好。
更多的尝试可以参考这个网站,我们不需要大家会精确定位每一个点,
只需要大家能够大概猜出这个点具体在哪个位置就可以啦。
http://cubic-bezier.com/#0,0,.58,1
代码实现:
<!DOCTYPE html><html> <head> <meta charset="utf-8"> <title></title> <style type="text/css"> .animate{ width: 200px; height: 200px; background: pink; transition: width 3s cubic-bezier(1,.02,.31,.9); -webkit-transition: width 3s cubic-bezier(1,.02,.31,.9); } .animate:hover{ width: 1000px; } </style> </head> <body> <div class="animate"></div> </body></html>