12-CSS3属性详解:动画详解

前言

本文主要内容:

  • 过渡:transition

  • 2D 转换 transform

  • 3D 转换 transform

  • 动画:animation

过渡:transition

transition的中文含义是过渡。过渡是CSS3中具有颠覆性的一个特征,可以实现元素不同状态间的平滑过渡(补间动画),经常用来制作动画效果。

  • 补间动画:自动完成从起始状态到终止状态的的过渡。不用管中间的状态。

  • 帧动画:通过一帧一帧的画面按照固定顺序和速度播放。如电影胶片。

参考链接:补间动画基础

transition 包括以下属性:

  • transition-property: all; 如果希望所有的属性都发生过渡,就使用all。

  • transition-duration: 1s; 过渡的持续时间。

  • transition-timing-function: linear; 运动曲线。属性值可以是:

    • linear 线性
    • ease 减速
    • ease-in 加速
    • ease-out 减速
    • ease-in-out 先加速后减速
  • transition-delay: 1s; 过渡延迟。多长时间后再执行这个过渡动画。

上面的四个属性也可以写成综合属性

  1. transition: 让哪些属性进行过度 过渡的持续时间 运动曲线 延迟时间;
  2. transition: all 3s linear 0s;

其中,transition-property这个属性是尤其需要注意的,不同的属性值有不同的现象。我们来示范一下。

如果设置 transition-property: width,意思是只让盒子的宽度在变化时进行过渡。效果如下:

12-CSS3属性详解:动画详解 - 图1

如果设置 transition-property: all,意思是让盒子的所有属性(包括宽度、背景色等)在变化时都进行过渡。效果如下:

12-CSS3属性详解:动画详解 - 图2

案例:小米商品详情

代码:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>CSS 过渡</title>
  6. <style>
  7. body {
  8. margin: 0;
  9. padding: 0;
  10. background-color: #eeeeee;
  11. }
  12. .content {
  13. width: 800px;
  14. height: 320px;
  15. padding-left: 20px;
  16. margin: 80px auto;
  17. }
  18. .item {
  19. width: 230px;
  20. height: 300px;
  21. text-align: center;
  22. margin-right: 20px;
  23. background-color: #FFF;
  24. float: left;
  25. position: relative;
  26. top: 0;
  27. overflow: hidden; /* 让溢出的内容隐藏起来。意思是让下方的橙色方形先躲起来 */
  28. transition: all .5s; /* 从最初到鼠标悬停时的过渡 */
  29. }
  30. .item img {
  31. margin-top: 30px;
  32. }
  33. .item .desc {
  34. position: absolute;
  35. left: 0;
  36. bottom: -80px;
  37. width: 100%;
  38. height: 80px;
  39. background-color: #ff6700;
  40. transition: all .5s;
  41. }
  42. /* 鼠标悬停时,让 item 整体往上移动5px,且加一点阴影 */
  43. .item:hover {
  44. top: -5px;
  45. box-shadow: 0 0 15px #AAA;
  46. }
  47. /* 鼠标悬停时,让下方的橙色方形现身 */
  48. .item:hover .desc {
  49. bottom: 0;
  50. }
  51. </style>
  52. </head>
  53. <body>
  54. <div class="content">
  55. <div class="item">
  56. <img src="./images/1.png" alt="">
  57. </div>
  58. <div class="item">
  59. <img src="./images/2.png" alt="">
  60. <span class="desc"></span>
  61. </div>
  62. <div class="item">
  63. <img src="./images/3.jpg" alt="">
  64. <span class="desc"></span>
  65. </div>
  66. </div>
  67. </body>
  68. </html>

效果如下:

12-CSS3属性详解:动画详解 - 图3

动画效果录制的比较差,但真实体验还是可以的。

工程文件:

2D 转换

转换是 CSS3 中具有颠覆性的一个特征,可以实现元素的位移、旋转、变形、缩放,甚至支持矩阵方式。

转换再配合过渡和动画,可以取代大量早期只能靠 Flash 才可以实现的效果。

在 CSS3 当中,通过 transform 转换来实现 2D 转换或者 3D 转换。

  • 2D转换包括:缩放、移动、旋转。

我们依次来讲解。

1、缩放:scale

格式:

  1. transform: scale(x, y);
  2. transform: scale(2, 0.5);

参数解释: x:表示水平方向的缩放倍数。y:表示垂直方向的缩放倍数。如果只写一个值就是等比例缩放。

取值:大于1表示放大,小于1表示缩小。不能为百分比。

格式举例:

  1. <!DOCTYPE html>
  2. <html>
  3. <head lang="en">
  4. <meta charset="UTF-8">
  5. <title></title>
  6. <style>
  7. .box {
  8. width: 1000px;
  9. margin: 100px auto;
  10. }
  11. .box div {
  12. width: 300px;
  13. height: 150px;
  14. background-color: pink;
  15. float: left;
  16. margin-right: 15px;
  17. color: white;
  18. text-align: center;
  19. font: 400 30px/150px “宋体”;
  20. }
  21. .box .box2 {
  22. background-color: green;
  23. transition: all 1s;
  24. }
  25. .box .box2:hover {
  26. /*width: 500px;*/
  27. /*height: 400px;*/
  28. background-color: yellowgreen;
  29. /* transform: css3中用于做变换的属性
  30. scale(x,y):缩放 */
  31. transform: scale(2, 0.5);
  32. }
  33. </style>
  34. </head>
  35. <body>
  36. <div class="box">
  37. <div class="box1">1</div>
  38. <div class="box2">2</div>
  39. <div class="box3">3</div>
  40. </div>
  41. </body>
  42. </html>

效果:

12-CSS3属性详解:动画详解 - 图4

上图可以看到,给 box1 设置 2D 转换,并不会把兄弟元素挤走。

2、位移:translate

格式:

  1. transform: translate(水平位移, 垂直位移);
  2. transform: translate(-50%, -50%);

参数解释:

  • 参数为百分比,相对于自身移动。

  • 正值:向右和向下。 负值:向左和向上。如果只写一个值,则表示水平移动。

格式举例:

  1. <!DOCTYPE html>
  2. <html>
  3. <head lang="en">
  4. <meta charset="UTF-8">
  5. <title></title>
  6. <style>
  7. .box {
  8. width: 1000px;
  9. margin: 100px auto;
  10. }
  11. .box > div {
  12. width: 300px;
  13. height: 150px;
  14. border: 1px solid #000;
  15. background-color: red;
  16. float: left;
  17. margin-right: 30px;
  18. }
  19. div:nth-child(2) {
  20. background-color: pink;
  21. transition: all 1s;
  22. }
  23. /* translate:(水平位移,垂直位移)*/
  24. div:nth-child(2):hover {
  25. transform: translate(-50%, -50%);
  26. }
  27. </style>
  28. </head>
  29. <body>
  30. <div class="box">
  31. <div class="box1">1</div>
  32. <div class="box2">2</div>
  33. <div class="box3">3</div>
  34. </div>
  35. </body>
  36. </html>

效果:

12-CSS3属性详解:动画详解 - 图5

上图中,因为我在操作的时候,鼠标悬停后,立即进行了略微的移动,所以产生了两次动画。正确的效果应该是下面这样的:

12-CSS3属性详解:动画详解 - 图6

应用:让绝对定位中的盒子在父亲里居中

我们知道,如果想让一个标准流中的盒子在父亲里居中(水平方向看),可以将其设置margin: 0 auto属性。

可如果盒子是绝对定位的,此时已经脱标了,如果还想让其居中(位于父亲的正中间),可以这样做:

  1. div {
  2. width: 600px;
  3. height: 60px;
  4. position: absolute; 绝对定位的盒子
  5. left: 50%; 首先,让左边线居中
  6. top: 0;
  7. margin-left: -300px; 然后,向左移动宽度(600px)的一半
  8. }

如上方代码所示,我们先让这个宽度为600px的盒子,左边线居中,然后向左移动宽度(600px)的一半,就达到效果了。

12-CSS3属性详解:动画详解 - 图7

现在,我们还可以利用偏移 translate 来做,这也是比较推荐的写法:

  1. div {
  2. width: 600px;
  3. height: 60px;
  4. background-color: red;
  5. position: absolute; 绝对定位的盒子
  6. left: 50%; 首先,让左边线居中
  7. top: 0;
  8. transform: translate(-50%); 然后,利用translate,往左走自己宽度的一半【推荐写法】
  9. }

3、旋转:rotate

格式:

  1. transform: rotate(角度);
  2. transform: rotate(45deg);

参数解释:正值 顺时针;负值:逆时针。

举例:

  1. <!DOCTYPE html>
  2. <html>
  3. <head lang="en">
  4. <meta charset="UTF-8">
  5. <title></title>
  6. <style>
  7. .box {
  8. width: 200px;
  9. height: 200px;
  10. background-color: red;
  11. margin: 50px auto;
  12. color: #fff;
  13. font-size: 50px;
  14. transition: all 2s; /* 过渡:让盒子在进行 transform 转换的时候,有个过渡期 */
  15. }
  16. /* rotate(角度)旋转 */
  17. .box:hover {
  18. transform: rotate(-405deg); /* 鼠标悬停时,让盒子进行旋转 */
  19. }
  20. </style>
  21. </head>
  22. <body>
  23. <div class="box">1</div>
  24. </div>
  25. </body>
  26. </html>

效果:

12-CSS3属性详解:动画详解 - 图8

注意,上方代码中,我们给盒子设置了 transform 中的 rotate 旋转,但同时还要给盒子设置 transition 过渡。如果没有这行过渡的代码,旋转会直接一步到位,效果如下:(不是我们期望的效果)

12-CSS3属性详解:动画详解 - 图9

案例1:小火箭

  1. <!DOCTYPE html>
  2. <html>
  3. <head lang="en">
  4. <meta charset="UTF-8">
  5. <title></title>
  6. <style>
  7. html,body{
  8. height:100%;
  9. }
  10. body{
  11. background-color: #DE8910;
  12. }
  13. .rocket{
  14. position: absolute;
  15. left:100px;
  16. top:600px;
  17. height: 120px;
  18. transform:translate(-200px ,200px) rotate(45deg);
  19. transition:all 1s ease-in;
  20. }
  21. body:hover .rocket{
  22. transform:translate(500px,-500px) rotate(45deg);
  23. }
  24. </style>
  25. </head>
  26. <body>
  27. <img class="rocket" src="images/rocket.png" alt=""/>
  28. </body>
  29. </html>

上方代码中,我们将 transform 的两个小属性合并起来写了。

小火箭图片的url:http://img.smyhvae.com/20180208-rocket.png

案例2:扑克牌

rotate 旋转时,默认是以盒子的正中心为坐标原点的。如果想改变旋转的坐标原点,可以用transform-origin属性。格式如下:

  1. transform-origin: 水平坐标 垂直坐标;
  2. transform-origin: 50px 50px;
  3. transform-origin: center bottom; //旋转时,以盒子底部的中心为坐标原点

我们来看一下 rotate 结合 transform-origin 的用法举例。

代码如下:

  1. <!DOCTYPE html>
  2. <html>
  3. <head lang="en">
  4. <meta charset="UTF-8">
  5. <title></title>
  6. <style>
  7. body {
  8. /*background-color: #eee;*/
  9. }
  10. .box {
  11. width: 300px;
  12. height: 440px;
  13. margin: 100px auto;
  14. position: relative;
  15. }
  16. img {
  17. width: 100%;
  18. transition: all 1.5s;
  19. position: absolute; /* 既然扑克牌是叠在一起的,那就都用绝对定位 */
  20. left: 0;
  21. top: 0;
  22. transform-origin: center bottom; /*旋转时,以盒子底部的中心为坐标原点*/
  23. box-shadow: 0 0 3px 0 #666;
  24. }
  25. .box:hover img:nth-child(6) {
  26. transform: rotate(-10deg);
  27. }
  28. .box:hover img:nth-child(5) {
  29. transform: rotate(-20deg);
  30. }
  31. .box:hover img:nth-child(4) {
  32. transform: rotate(-30deg);
  33. }
  34. .box:hover img:nth-child(3) {
  35. transform: rotate(-40deg);
  36. }
  37. .box:hover img:nth-child(2) {
  38. transform: rotate(-50deg);
  39. }
  40. .box:hover img:nth-child(1) {
  41. transform: rotate(-60deg);
  42. }
  43. .box:hover img:nth-child(8) {
  44. transform: rotate(10deg);
  45. }
  46. .box:hover img:nth-child(9) {
  47. transform: rotate(20deg);
  48. }
  49. .box:hover img:nth-child(10) {
  50. transform: rotate(30deg);
  51. }
  52. .box:hover img:nth-child(11) {
  53. transform: rotate(40deg);
  54. }
  55. .box:hover img:nth-child(12) {
  56. transform: rotate(50deg);
  57. }
  58. .box:hover img:nth-child(13) {
  59. transform: rotate(60deg);
  60. }
  61. </style>
  62. </head>
  63. <body>
  64. <div class="box">
  65. <img src="images/pk1.png"/>
  66. <img src="images/pk2.png"/>
  67. <img src="images/pk1.png"/>
  68. <img src="images/pk2.png"/>
  69. <img src="images/pk1.png"/>
  70. <img src="images/pk2.png"/>
  71. <img src="images/pk1.png"/>
  72. <img src="images/pk2.png"/>
  73. <img src="images/pk1.png"/>
  74. <img src="images/pk2.png"/>
  75. <img src="images/pk1.png"/>
  76. <img src="images/pk2.png"/>
  77. <img src="images/pk1.png"/>
  78. </div>
  79. </body>
  80. </html>

效果如下:

12-CSS3属性详解:动画详解 - 图10

4、倾斜

暂略。

3D 转换

1、旋转:rotateX、rotateY、rotateZ

3D坐标系(左手坐标系)

12-CSS3属性详解:动画详解 - 图11

如上图所示,伸出左手,让拇指和食指成“L”形,大拇指向右,食指向上,中指指向前方。拇指、食指和中指分别代表X、Y、Z轴的正方向,这样我们就建立了一个左手坐标系。

浏览器的这个平面,是X轴、Y轴;垂直于浏览器的平面,是Z轴。

旋转的方向:(左手法则)

左手握住旋转轴,竖起拇指指向旋转轴的正方向,正向就是其余手指卷曲的方向

从上面这句话,我们也能看出:所有的3d旋转,对着正方向去看,都是顺时针旋转。

格式:

  1. transform: rotateX(360deg); //绕 X 轴旋转360度
  2. transform: rotateY(360deg); //绕 Y 轴旋转360度
  3. transform: rotateZ(360deg); //绕 Z 轴旋转360度

格式举例:

(1)rotateX 举例:

  1. <!DOCTYPE html>
  2. <html>
  3. <head lang="en">
  4. <meta charset="UTF-8">
  5. <title></title>
  6. <style>
  7. .rotateX {
  8. width: 300px;
  9. height: 226px;
  10. margin: 200px auto;
  11. /* 透视 :加给变换的父盒子*/
  12. /* 设置的是用户的眼睛距离 平面的距离*/
  13. /* 透视效果只是视觉上的呈现,并不是正真的3d*/
  14. perspective: 110px;
  15. }
  16. img {
  17. /* 过渡*/
  18. transition: transform 2s;
  19. }
  20. /* 所有的3d旋转,对着正方向去看,都是顺时针旋转*/
  21. .rotateX:hover img {
  22. transform: rotateX(360deg);
  23. }
  24. </style>
  25. </head>
  26. <body>
  27. <div class="rotateX">
  28. <img src="images/x.jpg" alt=""/>
  29. </div>
  30. </body>
  31. </html>

效果:

12-CSS3属性详解:动画详解 - 图12

上方代码中,我们最好加个透视的属性,方能看到3D的效果;没有这个属性的话,图片旋转的时候,像是压瘪了一样。

而且,透视的是要加给图片的父元素 div,方能生效。我们在后面会讲解透视属性。

(2)rotateY 举例:

  1. <!DOCTYPE html>
  2. <html>
  3. <head lang="en">
  4. <meta charset="UTF-8">
  5. <title></title>
  6. <style>
  7. .rotateY {
  8. width: 237px;
  9. height: 300px;
  10. margin: 100px auto;
  11. /* 透视 */
  12. perspective: 150px;
  13. }
  14. img {
  15. transition: all 2s; /* 过渡 */
  16. }
  17. .rotateY:hover img {
  18. transform: rotateY(360deg);
  19. }
  20. </style>
  21. </head>
  22. <body>
  23. <div class="rotateY">
  24. <img src="images/y.jpg" alt=""/>
  25. </div>
  26. </body>
  27. </html>

效果:

12-CSS3属性详解:动画详解 - 图13

(3)rotateZ 举例:

  1. <!DOCTYPE html>
  2. <html>
  3. <head lang="en">
  4. <meta charset="UTF-8">
  5. <title></title>
  6. <style>
  7. .rotateZ {
  8. width: 330px;
  9. height: 227px;
  10. margin: 100px auto;
  11. /* 透视*/
  12. perspective: 200px;
  13. }
  14. img {
  15. transition: all 1s;
  16. }
  17. .rotateZ:hover img {
  18. transform: rotateZ(360deg);
  19. }
  20. </style>
  21. </head>
  22. <body>
  23. <div class="rotateZ">
  24. <img src="images/z.jpg" alt=""/>
  25. </div>
  26. </body>
  27. </html>

效果:

12-CSS3属性详解:动画详解 - 图14

案例:百度钱包的水平翻转效果

现在有下面这张图片素材:

12-CSS3属性详解:动画详解 - 图15

要求做成下面这种效果:

12-CSS3属性详解:动画详解 - 图16

上面这张图片素材其实用的是精灵图。实现的代码如下:

  1. <!DOCTYPE html>
  2. <html>
  3. <head lang="en">
  4. <meta charset="UTF-8">
  5. <title></title>
  6. <style>
  7. body {
  8. background-color: cornflowerblue;
  9. }
  10. .box {
  11. width: 300px;
  12. height: 300px;
  13. /*border: 1px solid #000;*/
  14. margin: 50px auto;
  15. position: relative;
  16. }
  17. .box > div {
  18. width: 100%;
  19. height: 100%;
  20. position: absolute;
  21. /*border: 1px solid #000;*/
  22. border-radius: 50%;
  23. transition: all 2s;
  24. backface-visibility: hidden;
  25. }
  26. .box1 {
  27. background: url(images/bg.png) left 0 no-repeat; /*默认显示图片的左半边*/
  28. }
  29. .box2 {
  30. background: url(images/bg.png) right 0 no-repeat;
  31. transform: rotateY(180deg); /*让图片的右半边默认时,旋转180度,就可以暂时隐藏起来*/
  32. }
  33. .box:hover .box1 {
  34. transform: rotateY(180deg); /*让图片的左半边转消失*/
  35. }
  36. .box:hover .box2 {
  37. transform: rotateY(0deg); /*让图片的左半边转出现*/
  38. }
  39. </style>
  40. </head>
  41. <body>
  42. <div class="box">
  43. <div class="box1"></div>
  44. <div class="box2"></div>
  45. </div>
  46. </body>
  47. </html>

2、移动:translateX、translateY、translateZ

格式:

  1. transform: translateX(100px); //沿着 X 轴移动
  2. transform: translateY(360px); //沿着 Y 轴移动
  3. transform: translateZ(360px); //沿着 Z 轴移动

格式举例:

(1)translateX 举例:

  1. <!DOCTYPE html>
  2. <html>
  3. <head lang="en">
  4. <meta charset="UTF-8">
  5. <title></title>
  6. <style>
  7. .box {
  8. width: 200px;
  9. height: 200px;
  10. background: green;
  11. transition: all 1s;
  12. }
  13. .box:hover {
  14. transform: translateX(100px);
  15. }
  16. </style>
  17. </head>
  18. <body>
  19. <div class="box">
  20. </div>
  21. </body>
  22. </html>

效果:

12-CSS3属性详解:动画详解 - 图17

(2)translateY 举例:

  1. <!DOCTYPE html>
  2. <html>
  3. <head lang="en">
  4. <meta charset="UTF-8">
  5. <title></title>
  6. <style>
  7. .box {
  8. width: 200px;
  9. height: 200px;
  10. background: green;
  11. transition: all 1s;
  12. }
  13. .box:hover {
  14. transform: translateY(100px);
  15. }
  16. </style>
  17. </head>
  18. <body>
  19. <div class="box">
  20. </div>
  21. </body>
  22. </html>

效果:

12-CSS3属性详解:动画详解 - 图18

(3)translateZ 举例:

  1. <!DOCTYPE html>
  2. <html>
  3. <head lang="en">
  4. <meta charset="UTF-8">
  5. <title></title>
  6. <style>
  7. body {
  8. /* 给box的父元素加透视效果*/
  9. perspective: 1000px;
  10. }
  11. .box {
  12. width: 250px;
  13. height: 250px;
  14. background: green;
  15. transition: all 1s;
  16. margin: 200px auto
  17. }
  18. .box:hover {
  19. /* translateZ必须配合透视来使用*/
  20. transform: translateZ(400px);
  21. }
  22. </style>
  23. </head>
  24. <body>
  25. <div class="box">
  26. </div>
  27. </body>
  28. </html>

效果:

12-CSS3属性详解:动画详解 - 图19

上方代码中,如果不加透视属性,是看不到translateZ的效果的。

3、透视:perspective

电脑显示屏是一个 2D 平面,图像之所以具有立体感(3D效果),其实只是一种视觉呈现,通过透视可以实现此目的。

透视可以将一个2D平面,在转换的过程当中,呈现3D效果。但仅仅只是视觉呈现出 3d 效果,并不是正真的3d。

格式有两种写法:

  • 作为一个属性,设置给父元素,作用于所有3D转换的子元素

  • 作为 transform 属性的一个值,做用于元素自身。

格式举例:

  1. perspective: 500px;

4、3D呈现(transform-style)

3D元素构建是指某个图形是由多个元素构成的,可以给这些元素的父元素设置transform-style: preserve-3d来使其变成一个真正的3D图形。属性值可以如下:

  1. transform-style: preserve-3d; /* 让 子盒子 位于三维空间里 */
  2. transform-style: flat; /* 让子盒子位于此元素所在的平面内(子盒子被扁平化) */

案例:立方体

  1. <!DOCTYPE html>
  2. <html>
  3. <head lang="en">
  4. <meta charset="UTF-8">
  5. <title></title>
  6. <style>
  7. .box {
  8. width: 250px;
  9. height: 250px;
  10. border: 1px dashed red;
  11. margin: 100px auto;
  12. position: relative;
  13. border-radius: 50%;
  14. /* 让子盒子保持3d效果*/
  15. transform-style: preserve-3d;
  16. /*transform:rotateX(30deg) rotateY(-30deg);*/
  17. animation: gun 8s linear infinite;
  18. }
  19. .box > div {
  20. width: 100%;
  21. height: 100%;
  22. position: absolute;
  23. text-align: center;
  24. line-height: 250px;
  25. font-size: 60px;
  26. color: #daa520;
  27. }
  28. .left {
  29. background-color: rgba(255, 0, 0, 0.3);
  30. /* 变换中心*/
  31. transform-origin: left;
  32. /* 变换*/
  33. transform: rotateY(90deg) translateX(-125px);
  34. }
  35. .right {
  36. background: rgba(0, 0, 255, 0.3);
  37. transform-origin: right;
  38. /* 变换*/
  39. transform: rotateY(90deg) translateX(125px);
  40. }
  41. .forward {
  42. background: rgba(255, 255, 0, 0.3);
  43. transform: translateZ(125px);
  44. }
  45. .back {
  46. background: rgba(0, 255, 255, 0.3);
  47. transform: translateZ(-125px);
  48. }
  49. .up {
  50. background: rgba(255, 0, 255, 0.3);
  51. transform: rotateX(90deg) translateZ(125px);
  52. }
  53. .down {
  54. background: rgba(99, 66, 33, 0.3);
  55. transform: rotateX(-90deg) translateZ(125px);
  56. }
  57. @keyframes gun {
  58. 0% {
  59. transform: rotateX(0deg) rotateY(0deg);
  60. }
  61. 100% {
  62. transform: rotateX(360deg) rotateY(360deg);
  63. }
  64. }
  65. </style>
  66. </head>
  67. <body>
  68. <div class="box">
  69. <div class="up"></div>
  70. <div class="down"></div>
  71. <div class="left"></div>
  72. <div class="right"></div>
  73. <div class="forward"></div>
  74. <div class="back"></div>
  75. </div>
  76. </body>
  77. </html>

动画

动画是CSS3中具有颠覆性的特征,可通过设置多个节点 来精确控制一个或一组动画,常用来实现复杂的动画效果。

1、定义动画的步骤

(1)通过@keyframes定义动画;

(2)将这段动画通过百分比,分割成多个节点;然后各节点中分别定义各属性;

(3)在指定元素里,通过 animation 属性调用动画。

之前,我们在 js 中定义一个函数的时候,是先定义,再调用:

  1. js 定义函数:
  2. function fun(){ 函数体 }
  3. 调用:
  4. fun();

同样,我们在 CSS3 中定义动画的时候,也是先定义,再调用

  1. 定义动画:
  2. @keyframes 动画名{
  3. from{ 初始状态 }
  4. to{ 结束状态 }
  5. }
  6. 调用:
  7. animation: 动画名称 持续时间;

其中,animation属性的格式如下:

  1. animation: 定义的动画名称 持续时间 执行次数 是否反向 运动曲线 延迟执行。(infinite 表示无限次)
  2. animation: move1 1s alternate linear 3;
  3. animation: move2 4s;

定义动画的格式举例:

  1. <!DOCTYPE html>
  2. <html>
  3. <head lang="en">
  4. <meta charset="UTF-8">
  5. <title></title>
  6. <style>
  7. .box {
  8. width: 100px;
  9. height: 100px;
  10. margin: 100px;
  11. background-color: red;
  12. /* 调用动画*/
  13. /* animation: 动画名称 持续时间 执行次数 是否反向 运动曲线 延迟执行。infinite 表示无限次*/
  14. /*animation: move 1s alternate linear 3;*/
  15. animation: move2 4s;
  16. }
  17. /* 方式一:定义一组动画*/
  18. @keyframes move1 {
  19. from {
  20. transform: translateX(0px) rotate(0deg);
  21. }
  22. to {
  23. transform: translateX(500px) rotate(555deg);
  24. }
  25. }
  26. /* 方式二:定义多组动画*/
  27. @keyframes move2 {
  28. 0% {
  29. transform: translateX(0px) translateY(0px);
  30. background-color: red;
  31. border-radius: 0;
  32. }
  33. 25% {
  34. transform: translateX(500px) translateY(0px);
  35. }
  36. /*动画执行到 50% 的时候,背景色变成绿色,形状变成圆形*/
  37. 50% {
  38. /* 虽然两个方向都有translate,但其实只是Y轴上移动了200px。
  39. 因为X轴的500px是相对最开始的原点来说的。可以理解成此时的 translateX 是保存了之前的位移 */
  40. transform: translateX(500px) translateY(200px);
  41. background-color: green;
  42. border-radius: 50%;
  43. }
  44. 75% {
  45. transform: translateX(0px) translateY(200px);
  46. }
  47. /*动画执行到 100% 的时候,背景色还原为红色,形状还原为正方形*/
  48. 100% {
  49. /*坐标归零,表示回到原点。*/
  50. transform: translateX(0px) translateY(0px);
  51. background-color: red;
  52. border-radius: 0;
  53. }
  54. }
  55. </style>
  56. </head>
  57. <body>
  58. <div class="box">
  59. </div>
  60. </body>
  61. </html>

注意好好看代码中的注释。

效果如下:

12-CSS3属性详解:动画详解 - 图20

2、动画属性

我们刚刚在调用动画时,animation属性的格式如下:

animation属性的格式如下:

  1. animation: 定义的动画名称 持续时间 执行次数 是否反向 运动曲线 延迟执行。(infinite 表示无限次)
  2. animation: move1 1s alternate linear 3;
  3. animation: move2 4s;

可以看出,这里的 animation 是综合属性,接下来,我们把这个综合属性拆分看看。

(1)动画名称:

  1. animation-name: move;

(2)执行一次动画的持续时间:

  1. animation-duration: 4s;

备注:上面两个属性,是必选项,且顺序固定。

(3)动画的执行次数:

  1. animation-iteration-count: 1; //iteration的含义表示迭代

属性值infinite表示无数次。

(3)动画的方向:

  1. animation-direction: alternate;

属性值:normal 正常,alternate 反向。

(4)动画延迟执行:

  1. animation-delay: 1s;

(5)设置动画结束时,盒子的状态:

  1. animation-fill-mode: forwards;

属性值: forwards:保持动画结束后的状态(默认), backwards:动画结束后回到最初的状态。

(6)运动曲线:

  1. animation-timing-function: ease-in;

属性值可以是:linear ease-in-out steps()等。

注意,如果把属性值写成steps(),则表示动画不是连续执行,而是间断地分成几步执行。我们接下来专门讲一下属性值 steps()

steps()的效果

我们还是拿上面的例子来举例,如果在调用动画时,我们写成:

  1. animation: move2 4s steps(2);

效果如下:

12-CSS3属性详解:动画详解 - 图21

有了属性值 steps(),我们就可以作出很多不连续地动画效果。比如时钟;再比如,通过多张静态的鱼,作出一张游动的鱼。

step()举例:时钟的简易模型

  1. <!DOCTYPE html>
  2. <html>
  3. <head lang="en">
  4. <meta charset="UTF-8">
  5. <title></title>
  6. <style>
  7. div {
  8. width: 3px;
  9. height: 200px;
  10. background-color: #000;
  11. margin: 100px auto;
  12. transform-origin: center bottom; /* 旋转的中心点是底部 */
  13. animation: myClock 60s steps(60) infinite;
  14. }
  15. @keyframes myClock {
  16. 0% {
  17. transform: rotate(0deg);
  18. }
  19. 100% {
  20. transform: rotate(360deg);
  21. }
  22. }
  23. </style>
  24. </head>
  25. <body>
  26. <div></div>
  27. </body>
  28. </html>

上方代码,我们通过一个黑色的长条div,旋转360度,耗时60s,分成60步完成。即可实现。

效果如下:

12-CSS3属性详解:动画详解 - 图22

动画举例:摆动的鱼

现在,我们要做下面这种效果:

12-CSS3属性详解:动画详解 - 图23

PS:图片的url是http://img.smyhvae.com/20180209_1245.gif,图片较大,如无法观看,可在浏览器中单独打开。

为了作出上面这种效果,要分成两步。

(1)第一步:让鱼在原地摆动

鱼在原地摆动并不是一张 gif动图,她其实是由很多张静态图间隔地播放,一秒钟播放完毕,就可以了:

12-CSS3属性详解:动画详解 - 图24

上面这张大图的尺寸是:宽 509 px、高 2160 px。

我们可以理解成,每一帧的尺寸是:宽 509 px、高 270 px。270 * 8 = 2160。让上面这张大图,在一秒内从 0px 的位置往上移动2160px,分成8步来移动。就可以实现了。

代码是:

  1. <!DOCTYPE html>
  2. <html>
  3. <head lang="en">
  4. <meta charset="UTF-8">
  5. <title></title>
  6. <style>
  7. .shark {
  8. width: 509px;
  9. height: 270px; /*盒子的宽高是一帧的宽高*/
  10. border: 1px solid #000;
  11. margin: 100px auto;
  12. background: url(images/shark.png) left top; /* 让图片一开始位于 0 px的位置 */
  13. animation: sharkRun 1s steps(8) infinite; /* 一秒之内,从顶部移动到底部,分八帧, */
  14. }
  15. @keyframes sharkRun {
  16. 0% {
  17. }
  18. /* 270 * 8 = 2160 */
  19. 100% {
  20. background-position: left -2160px; /* 动画结束时,让图片位于最底部 */
  21. }
  22. }
  23. </style>
  24. </head>
  25. <body>
  26. <div class="sharkBox">
  27. <div class="shark"></div>
  28. </div>
  29. </div>
  30. </body>
  31. </html>

效果如下:

12-CSS3属性详解:动画详解 - 图25

我们不妨把上面的动画的持续时间从1s改成 8s,就可以看到动画的慢镜头:

12-CSS3属性详解:动画详解 - 图26

这下,你应该恍然大悟了。

(2)第二步:让鱼所在的盒子向前移动。

实现的原理也很简单,我们在上一步中已经让shark这个盒子实现了原地摇摆,现在,让 shark 所在的父盒子 sharkBox向前移动,即可。完整版代码是:

  1. <!DOCTYPE html>
  2. <html>
  3. <head lang="en">
  4. <meta charset="UTF-8">
  5. <title></title>
  6. <style>
  7. .shark {
  8. width: 509px;
  9. height: 270px; /* 盒子的宽高是一帧的宽高 */
  10. border: 1px solid #000;
  11. margin: 100px auto;
  12. background: url(images/shark.png) left top; /* 让图片一开始位于 0 px的位置 */
  13. animation: sharkRun 1s steps(8) infinite; /* 一秒之内,从顶部移动到底部,分八帧 */
  14. }
  15. /* 鱼所在的父盒子 */
  16. .sharkBox {
  17. width: 509px;
  18. height: 270px;
  19. animation: sharkBoxRun 20s linear infinite;
  20. }
  21. @keyframes sharkRun {
  22. 0% {
  23. }
  24. /* 270 * 8 = 2160 */
  25. 100% {
  26. background-position: left -2160px; /* 动画结束时,让图片位于最底部 */
  27. }
  28. }
  29. @keyframes sharkBoxRun {
  30. 0% {
  31. transform: translateX(-600px);
  32. }
  33. 100% {
  34. transform: translateX(3000px);
  35. }
  36. }
  37. </style>
  38. </head>
  39. <body>
  40. <div class="sharkBox">
  41. <div class="shark"></div>
  42. </div>
  43. </div>
  44. </body>
  45. </html>

12-CSS3属性详解:动画详解 - 图27

大功告成。

工程文件如下:

我的公众号

想学习更多技能?不妨关注我的微信公众号:千古壹号(id:qianguyihao)。

扫一扫,你将发现另一个全新的世界,而这将是一场美丽的意外:

12-CSS3属性详解:动画详解 - 图28