5-1 太阳动画效果
本节编程练习不计算学习进度,请电脑登录imooc.com操作

太阳动画效果

前面的课程都相对复杂点,要么有点算法要么就是异步,这一节是具体的一个太阳效果,主要用CSS3的动画实现的。

页面中间有个太阳,出现在中间然后慢慢的向西边落下去

太阳的变化完全是靠CSS3的处理的,没要用到任何JS代码

CSS3的animation会有8个属性去定义一个动画的一些参数,这里只针对使用的方法做讲解

animation-name

规定要绑定的keyframes的名称,随便你取,不过为了日后维护的方便,建议取一个跟动作相关名称相近的名称比较好

animation-duration

规定完成这个动画所需要的时间

动画定义上面两个参数就可以变化,因为其余的都会自己的默认参数

Keyframes 中,每一组动画都可以赋予一个名称,通过它可以灵活地定义元素要执行的动画,这里观察下太阳只是一个X与Y轴的变化,所以只会用到translate就可以了,只需要编写一个translate变化的关键帧

虽然很简单,但是也需要实际动手去写写也会有一些细节的地方,注意要针对不同浏览器加上不同的前缀,webkit,moz

任务

打开index.html文件,在代码的39和43行填入相应代码,可以观察到太阳的变化

0% {
    transform: translateX(0) translateY(0);
}
100% {
    transform: translateX(-2000px) translateY(400px);
}
  1. <!DOCTYPE html>
  2. <html>
  3.  
  4. <head>
  5. <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
  6. <title>慕课七夕主题</title>
  7. <link rel='stylesheet' href='style.css' />
  8. <link rel='stylesheet' href='pageA.css' />
  9. <style type="text/css">
  10. button {
  11. width: 80px;
  12. height: 50px;
  13. }
  14.  
  15. .button {
  16. position: absolute;
  17. bottom: 0;
  18. }
  19.  
  20. /*-------- 太阳自转以及动画 --------*/
  21. #sun {
  22. background: url("http://img1.sycdn.imooc.com//55ade004000106c202010201.png") no-repeat;
  23. position: absolute;
  24. z-index: 1;
  25. top: -30px;
  26. height: 201px;
  27. width: 201px;
  28. right: 40%;
  29. }
  30.  
  31. .rotation {
  32. -webkit-animation-name: rotation;
  33. -webkit-animation-duration: 30s;
  34. -moz-animation-name: rotation;
  35. -moz-animation-duration: 30s;
  36. }
  37.  
  38. @-webkit-keyframes rotation {
  39. /*?*/
  40. }
  41.  
  42. @-moz-keyframes rotation {
  43. /*?*/
  44. }
  45. </style>
  46. <script src="http://libs.baidu.com/jquery/1.9.1/jquery.js"></script>
  47. <script type="text/javascript" src="http://img1.sycdn.imooc.com//down/55ac9ea30001ace700000000.js"></script>
  48. <script type="text/javascript" src="Swipe.js"></script>
  49. <script type="text/javascript" src="BoyWalk.js"></script>
  50. </head>
  51.  
  52. <body>
  53. <div id='content'>
  54. <ul class='content-wrap'>
  55. <li>
  56. <div class="a_background">
  57. <div class="a_background_top"></div>
  58. <div class="a_background_middle"></div>
  59. <div class="a_background_botton"></div>
  60. </div>
  61. <!-- 太阳 -->
  62. <div id="sun"></div>
  63. </li>
  64. <li> 页面2 </li>
  65. <li> 页面3 </li>
  66. </ul>
  67. <div id="boy" class="charector"></div>
  68. </div>
  69. <div class="button">
  70. <button>开始</button>
  71. </div>
  72. </body>
  73. <script type="text/javascript">
  74. $(function() {
  75.  
  76. var container = $("#content");
  77. var swipe = Swipe(container);
  78. // 页面滚动到指定的位置
  79. function scrollTo(time, proportionX) {
  80. var distX = container.width() * proportionX;
  81. swipe.scrollTo(distX, time);
  82. }
  83.  
  84. ////////////////////////////////////////////////////////
  85. // ================== 动画处理 ====================== //
  86. ////////////////////////////////////////////////////////
  87.  
  88. var boy = BoyWalk();
  89.  
  90.  
  91. // 开始
  92. $("button:first").click(function() {
  93.  
  94. // 太阳公转
  95. $("#sun").addClass('rotation');
  96.  
  97.  
  98. // 开始第一次走路
  99. boy.walkTo(2000, 0.2)
  100. .then(function() {
  101. // 第一次走路完成
  102. // 开始页面滚动
  103. scrollTo(5000, 1);
  104. }).then(function() {
  105. // 第二次走路
  106. return boy.walkTo(5000, 0.5);
  107. });
  108. });
  109.  
  110. })
  111. </script>
  112.  
  113. </html>
  1. /**
  2.  * 小孩走路
  3.  * @param {[type]} container [description]
  4.  */
  5. function BoyWalk() {
  6.  
  7. var container = $("#content");
  8. // 页面可视区域
  9. var visualWidth = container.width();
  10. var visualHeight = container.height();
  11.  
  12. // 获取数据
  13. var getValue = function(className) {
  14. var $elem = $('' + className + '');
  15. //走路的路线坐标
  16. return {
  17. height: $elem.height(),
  18. top: $elem.position().top
  19. };
  20. }
  21. // 路的Y轴
  22. var pathY = function() {
  23. var data = getValue('.a_background_middle');
  24. return data.top + data.height / 2;
  25. }();
  26.  
  27. var $boy = $("#boy");
  28. var boyWidth = $boy.width();
  29. var boyHeight = $boy.height();
  30.  
  31. // 设置下高度
  32. $boy.css({
  33. top: pathY - boyHeight + 25
  34. });
  35.  
  36. // 暂停走路
  37. function pauseWalk() {
  38. $boy.addClass('pauseWalk');
  39. }
  40.  
  41. // 恢复走路
  42. function restoreWalk() {
  43. $boy.removeClass('pauseWalk');
  44. }
  45.  
  46. // css3的动作变化
  47. function slowWalk() {
  48. $boy.addClass('slowWalk');
  49. }
  50.  
  51. // 用transition做运动
  52. function stratRun(options, runTime) {
  53. var dfdPlay = $.Deferred();
  54. // 恢复走路
  55. restoreWalk();
  56. // 运动的属性
  57. $boy.transition(
  58. options,
  59. runTime,
  60. 'linear',
  61. function() {
  62. dfdPlay.resolve(); // 动画完成
  63. });
  64. return dfdPlay;
  65. }
  66.  
  67. // 开始走路
  68. function walkRun(time, dist, disY) {
  69. time = time || 3000;
  70. // 脚动作
  71. slowWalk();
  72. // 开始走路
  73. var d1 = stratRun({
  74. 'left': dist + 'px',
  75. 'top': disY ? disY : undefined
  76. }, time);
  77. return d1;
  78. }
  79.  
  80. // 计算移动距离
  81. function calculateDist(direction, proportion) {
  82. return (direction == "x" ?
  83. visualWidth : visualHeight) * proportion;
  84. }
  85.  
  86. return {
  87. // 开始走路
  88. walkTo: function(time, proportionX, proportionY) {
  89. var distX = calculateDist('x', proportionX)
  90. var distY = calculateDist('y', proportionY)
  91. return walkRun(time, distX, distY);
  92. },
  93. // 停止走路
  94. stopWalk: function() {
  95. pauseWalk();
  96. },
  97. setColoer:function(value){
  98. $boy.css('background-color',value)
  99. }
  100. }
  101. }
  1. /////////
  2. //页面滑动 //
  3. /////////
  4.  
  5.  
  6. /**
  7.  * [Swipe description]
  8.  * @param {[type]} container [页面容器节点]
  9.  * @param {[type]} options [参数]
  10.  */
  11. function Swipe(container) {
  12. //获取第一个子节点
  13. var element = container.find(":first")
  14. var swipe = {};
  15.  
  16. //li页面数量
  17. var slides = element.find(">")
  18.  
  19. //获取容器尺寸
  20. var width = container.width();
  21. var height = container.height();
  22.  
  23. //设置li页面总宽度
  24. element.css({
  25. width: (slides.length * width) + 'px',
  26. height: height + 'px'
  27. })
  28.  
  29. //设置每一个页面li的宽度
  30. $.each(slides, function(index) {
  31. var slide = slides.eq(index); //获取到每一个li元素
  32. slide.css({
  33. width: width + 'px',
  34. height: height + 'px'
  35. })
  36. })
  37.  
  38. //监控完成与移动
  39. swipe.scrollTo = function(x, speed) {
  40. //执行动画移动
  41. element.css({
  42. 'transition-timing-function' : 'linear',
  43. 'transition-duration' : speed + 'ms',
  44. 'transform' : 'translate3d(-' + x + 'px,0px,0px)'
  45. })
  46. return this;
  47. }
  48.  
  49. return swipe;
  50. }
  1. /*背景图*/
  2.  
  3. .a_background {
  4. width: 100%;
  5. height: 100%;
  6. /* background-image: url("../images/QixiA.png");
  7.   background-size: 100% 100%;*/
  8. position: absolute;
  9. }
  10.  
  11. .a_background_top{
  12. width: 100%;
  13. height: 71.6%;
  14. background-image: url("http://img1.sycdn.imooc.com//55addf6900019d8f14410645.png");
  15. background-size: 100% 100%;
  16. }
  17.  
  18.  
  19. .a_background_middle{
  20. width: 100%;
  21. height: 13.1%;
  22. background-image: url("http://img1.sycdn.imooc.com//55addf800001ff2e14410118.png");
  23. background-size: 100% 100%;
  24. }
  25.  
  26. .a_background_botton{
  27. width: 100%;
  28. height: 15.3%;
  29. background-image: url("http://img1.sycdn.imooc.com//55addfcb000189b314410138.png");
  30. background-size: 100% 100%;
  31. }
  1. * {
  2. padding: 0;
  3. margin: 0;
  4. }
  5.  
  6. ol,
  7. ul,
  8. li {
  9. list-style-type: none;
  10. }
  11. /*主体部分*/
  12.  
  13. #content {
  14. width: 100%;
  15. height: 100%;
  16. /* top: 20%; */
  17. overflow: hidden;
  18. position: absolute;
  19. }
  20.  
  21. .content-wrap {
  22. position: relative;
  23. }
  24.  
  25. .content-wrap > li {
  26. background: #CAE1FF;
  27. color: red;
  28. float: left;
  29. overflow: hidden;
  30. position: relative;
  31. }
  32.  
  33. li:nth-child(2) {
  34. background: #9BCD9B;
  35. }
  36.  
  37. li:nth-child(3) {
  38. background: yellow;
  39. }
  40.  
  41. a {
  42. position: absolute;
  43. top: 50%;
  44. left: 40%;
  45. }
  46.  
  47. .charector {
  48. position: absolute;
  49. left: 0%;
  50. top: 55%;
  51. position: absolute;
  52. width: 100%;
  53. height: 100%;
  54. width: 151px;
  55. height: 291px;
  56. background: url(http://img.mukewang.com/55ade248000198ae10550582.png) -0px -291px no-repeat;
  57. }
  58.  
  59. .slowWalk {
  60. -webkit-animation-name: person-slow;
  61. -webkit-animation-duration: 950ms;
  62. -webkit-animation-iteration-count: infinite;
  63. -webkit-animation-timing-function: steps(1, start);
  64. -moz-animation-name: person-slow;
  65. -moz-animation-duration: 950ms;
  66. -moz-animation-iteration-count: infinite;
  67. -moz-animation-timing-function: steps(1, start)
  68. }
  69. /*普通慢走*/
  70.  
  71. @-webkit-keyframes person-slow {
  72. 0% {
  73. background-position: -0px -291px;
  74. }
  75. 25% {
  76. background-position: -602px -0px;
  77. }
  78. 50% {
  79. background-position: -302px -291px;
  80. }
  81. 75% {
  82. background-position: -151px -291px;
  83. }
  84. 100% {
  85. background-position: -0px -291px;
  86. }
  87. }
  88.  
  89. @-moz-keyframes person-slow {
  90. 0% {
  91. background-position: -0px -291px;
  92. }
  93. 25% {
  94. background-position: -602px -0px;
  95. }
  96. 50% {
  97. background-position: -302px -291px;
  98. }
  99. 75% {
  100. background-position: -151px -291px;
  101. }
  102. 100% {
  103. background-position: -0px -291px;
  104. }
  105. }
下一节