前面的课程都相对复杂点,要么有点算法要么就是异步,这一节是具体的一个太阳效果,主要用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); }
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-type" content="text/html; charset=utf-8" /> <title>慕课七夕主题</title> <link rel='stylesheet' href='style.css' /> <link rel='stylesheet' href='pageA.css' /> <style type="text/css"> button { width: 80px; height: 50px; } .button { position: absolute; bottom: 0; } /*-------- 太阳自转以及动画 --------*/ #sun { background: url("http://img1.sycdn.imooc.com//55ade004000106c202010201.png") no-repeat; position: absolute; z-index: 1; top: -30px; height: 201px; width: 201px; right: 40%; } .rotation { -webkit-animation-name: rotation; -webkit-animation-duration: 30s; -moz-animation-name: rotation; -moz-animation-duration: 30s; } @-webkit-keyframes rotation { /*?*/ } @-moz-keyframes rotation { /*?*/ } </style> <script src="http://libs.baidu.com/jquery/1.9.1/jquery.js"></script> <script type="text/javascript" src="http://img1.sycdn.imooc.com//down/55ac9ea30001ace700000000.js"></script> <script type="text/javascript" src="Swipe.js"></script> <script type="text/javascript" src="BoyWalk.js"></script> </head> <body> <div id='content'> <ul class='content-wrap'> <li> <div class="a_background"> <div class="a_background_top"></div> <div class="a_background_middle"></div> <div class="a_background_botton"></div> </div> <!-- 太阳 --> <div id="sun"></div> </li> <li> 页面2 </li> <li> 页面3 </li> </ul> <div id="boy" class="charector"></div> </div> <div class="button"> <button>开始</button> </div> </body> <script type="text/javascript"> $(function() { var container = $("#content"); var swipe = Swipe(container); // 页面滚动到指定的位置 function scrollTo(time, proportionX) { var distX = container.width() * proportionX; swipe.scrollTo(distX, time); } //////////////////////////////////////////////////////// // ================== 动画处理 ====================== // //////////////////////////////////////////////////////// var boy = BoyWalk(); // 开始 $("button:first").click(function() { // 太阳公转 $("#sun").addClass('rotation'); // 开始第一次走路 boy.walkTo(2000, 0.2) .then(function() { // 第一次走路完成 // 开始页面滚动 scrollTo(5000, 1); }).then(function() { // 第二次走路 return boy.walkTo(5000, 0.5); }); }); }) </script> </html>
/** * 小孩走路 * @param {[type]} container [description] */ function BoyWalk() { var container = $("#content"); // 页面可视区域 var visualWidth = container.width(); var visualHeight = container.height(); // 获取数据 var getValue = function(className) { var $elem = $('' + className + ''); //走路的路线坐标 return { height: $elem.height(), top: $elem.position().top }; } // 路的Y轴 var pathY = function() { var data = getValue('.a_background_middle'); return data.top + data.height / 2; }(); var $boy = $("#boy"); var boyWidth = $boy.width(); var boyHeight = $boy.height(); // 设置下高度 $boy.css({ top: pathY - boyHeight + 25 }); // 暂停走路 function pauseWalk() { $boy.addClass('pauseWalk'); } // 恢复走路 function restoreWalk() { $boy.removeClass('pauseWalk'); } // css3的动作变化 function slowWalk() { $boy.addClass('slowWalk'); } // 用transition做运动 function stratRun(options, runTime) { var dfdPlay = $.Deferred(); // 恢复走路 restoreWalk(); // 运动的属性 $boy.transition( options, runTime, 'linear', function() { dfdPlay.resolve(); // 动画完成 }); return dfdPlay; } // 开始走路 function walkRun(time, dist, disY) { time = time || 3000; // 脚动作 slowWalk(); // 开始走路 var d1 = stratRun({ 'left': dist + 'px', 'top': disY ? disY : undefined }, time); return d1; } // 计算移动距离 function calculateDist(direction, proportion) { return (direction == "x" ? visualWidth : visualHeight) * proportion; } return { // 开始走路 walkTo: function(time, proportionX, proportionY) { var distX = calculateDist('x', proportionX) var distY = calculateDist('y', proportionY) return walkRun(time, distX, distY); }, // 停止走路 stopWalk: function() { pauseWalk(); }, setColoer:function(value){ $boy.css('background-color',value) } } }
///////// //页面滑动 // ///////// /** * [Swipe description] * @param {[type]} container [页面容器节点] * @param {[type]} options [参数] */ function Swipe(container) { //获取第一个子节点 var element = container.find(":first") var swipe = {}; //li页面数量 var slides = element.find(">") //获取容器尺寸 var width = container.width(); var height = container.height(); //设置li页面总宽度 element.css({ width: (slides.length * width) + 'px', height: height + 'px' }) //设置每一个页面li的宽度 $.each(slides, function(index) { var slide = slides.eq(index); //获取到每一个li元素 slide.css({ width: width + 'px', height: height + 'px' }) }) //监控完成与移动 swipe.scrollTo = function(x, speed) { //执行动画移动 element.css({ 'transition-timing-function' : 'linear', 'transition-duration' : speed + 'ms', 'transform' : 'translate3d(-' + x + 'px,0px,0px)' }) return this; } return swipe; }
/*背景图*/ .a_background { width: 100%; height: 100%; /* background-image: url("../images/QixiA.png"); background-size: 100% 100%;*/ position: absolute; } .a_background_top{ width: 100%; height: 71.6%; background-image: url("http://img1.sycdn.imooc.com//55addf6900019d8f14410645.png"); background-size: 100% 100%; } .a_background_middle{ width: 100%; height: 13.1%; background-image: url("http://img1.sycdn.imooc.com//55addf800001ff2e14410118.png"); background-size: 100% 100%; } .a_background_botton{ width: 100%; height: 15.3%; background-image: url("http://img1.sycdn.imooc.com//55addfcb000189b314410138.png"); background-size: 100% 100%; }
* { padding: 0; margin: 0; } ol, ul, li { list-style-type: none; } /*主体部分*/ #content { width: 100%; height: 100%; /* top: 20%; */ overflow: hidden; position: absolute; } .content-wrap { position: relative; } .content-wrap > li { background: #CAE1FF; color: red; float: left; overflow: hidden; position: relative; } li:nth-child(2) { background: #9BCD9B; } li:nth-child(3) { background: yellow; } a { position: absolute; top: 50%; left: 40%; } .charector { position: absolute; left: 0%; top: 55%; position: absolute; width: 100%; height: 100%; width: 151px; height: 291px; background: url(http://img.mukewang.com/55ade248000198ae10550582.png) -0px -291px no-repeat; } .slowWalk { -webkit-animation-name: person-slow; -webkit-animation-duration: 950ms; -webkit-animation-iteration-count: infinite; -webkit-animation-timing-function: steps(1, start); -moz-animation-name: person-slow; -moz-animation-duration: 950ms; -moz-animation-iteration-count: infinite; -moz-animation-timing-function: steps(1, start) } /*普通慢走*/ @-webkit-keyframes person-slow { 0% { background-position: -0px -291px; } 25% { background-position: -602px -0px; } 50% { background-position: -302px -291px; } 75% { background-position: -151px -291px; } 100% { background-position: -0px -291px; } } @-moz-keyframes person-slow { 0% { background-position: -0px -291px; } 25% { background-position: -602px -0px; } 50% { background-position: -302px -291px; } 75% { background-position: -151px -291px; } 100% { background-position: -0px -291px; } }