场景B中涉及的动作比较多,然后动作之间都是有交叉的,所以在流程上需要有一定的控制。所以会针对所有动作进行单独的分解,这个单独拆分出小男孩动作做讲解
参考右边代码pageB.js的实现,代码需要结合pageB.js与pageB.css一起看,整体的代码都封装了单列对象boyAction上,走路的实现同样是transition+精灵图的组合,针对这样的异步流程代码,继续采用了Deferred对流程封装
动作分4部分:
小男孩取至一张15帧的精灵图,为了保持自适应缩放会在x轴上放大15倍,通过百分比切换x轴的坐标达到走路切换的效果。
针对四个动作的实现分解:
走路的实现已经是老套路了,boyAction.walk方法中通过transition控制元素的right值的变化,这样让元素产生动的效果,结合css中定义的boy-walk类的精灵动作切换
解开包裹拿出礼物同样是2张图片组合切换,通过动态增加boy-unwrapp样式处理,样式中注意一个问题,动画的停留状态,需要设置forwards让动作保持在最后一张图上,解开包裹的动作通过css3动画处理的,那么这就是异步,如果后续的动作要连接上,需要就监听这个动作,通过one给元素绑定animationEnd监听事件(one只绑定一次)
在3d旋转动脱衣的动作,是有3个图的切换,在strip方法中,动态的传递一个变量,来添加对应的样式文件
人物拥抱处理中,处理用了帧动画的,还有注意图层的重叠问题,所以单独用一个节点做了头部。在拥抱结束后显示这个头部元素
在pageB.js文件代码中19行填写任务代码
任务
小男孩从右边走出来,走到right=4.5rem的位置,耗时4000毫秒
注意:
1. 通过$.Deferred编写异步代码,能够让后续的动作then方法衔接得上
2.可以通transition让元素运用
3.注意动画回调的监听
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-type" content="text/html; charset=utf-8" /> <title>圣诞主题</title> <link rel='stylesheet' href='common.css' /> <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> <link rel="stylesheet" type="text/css" href="pageB.css"> <script src="pageB.js"></script> <script src="christmas.js"></script> </head> <body> <section class="container"> <!-- 第一幅画面 --> <section class="page-a bg-adaptive"> </section> <!-- 第二幅画面 --> <section class="page-b bg-adaptive"> <!-- 圣诞男孩 --> <figure class="christmas-boy-head"></figure> <figure class="christmas-boy boy-walk"> </figure> </section> <!-- 第三幅画面 --> <section class="page-c bg-adaptive"> </section> </section> <button>点击执行</button> <script type="text/javascript"> //rem设置 (function(doc, win) { var docEl = doc.documentElement, resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize', recalc = function() { var clientWidth = docEl.clientWidth; if (!clientWidth) return; docEl.style.fontSize = 20 * (clientWidth / 320) + 'px'; //宽与高度 document.body.style.height = clientWidth * (900 / 1440) + "px" }; win.addEventListener(resizeEvt, recalc, false); doc.addEventListener('DOMContentLoaded', recalc, false); })(document, window); </script> </body> </html>
/** * 慕课网特制 * 圣诞主题效果 * @type {Object} */ /** * 中间调用 */ var Christmas = function() { //页面容器元素 var $pageB = $(".page-b"); //构建第二个场景页面对象 new pageB($pageB); }; $(function() { $("button").on("click", function() { //圣诞主题效果,开始 Christmas() }) })
/** * 第二副场景页面 * */ function pageB(element, pageComplete) { //圣诞男孩 var $boy = element.find(".christmas-boy"); var animationEnd = "animationend webkitAnimationEnd" /** * 小男孩动作 * @return {[type]} [description] */ var boyAction = { //走路 walk: function() { //? }, //停止走路 stopWalk: function() { $boy.removeClass("boy-walk"); $boy.addClass("boy-stand"); }, //继续走路 runWalk: function() { $boy.addClass("walk-run"); }, //解开包裹 unwrapp: function() { var dfd = $.Deferred(); $boy.addClass("boy-unwrapp"); $boy.removeClass("boy-stand"); $boy.one(animationEnd, function() { dfd.resolve(); }) return dfd; }, //脱衣动作 //1-3 strip: function(count) { $boy.addClass("boy-strip-" + count).removeClass("boy-unwrapp"); }, //人物用拥抱 //重叠问题处理 hug: function() { $boy.addClass("boy-hug").one(animationEnd, function() { $(".christmas-boy-head").show() }) } } //开始走路 boyAction.walk() .then(function() { //停止走路 boyAction.stopWalk(); }) .then(function() { //解开包裹 return boyAction.unwrapp(); }) .then(function() { //脱衣动作 setTimeout(function(){ boyAction.strip(1) },1000) setTimeout(function(){ boyAction.strip(2) },2000) setTimeout(function(){ boyAction.strip(3) },3000) //任务重叠问题 setTimeout(function(){ boyAction.hug(); },4000) }) }
.container .page-b { width : 100%; height : 100%; background-image: url("http://img1.sycdn.imooc.com//565d09fa000145a614410901.png"); position: absolute; z-index: 40; } /******************************************************** 小男孩动作 **********************************************************/ .walk-stop { -webkit-animation-play-state: paused; -moz-animation-play-state: paused; } .walk-run { -webkit-animation-play-state: running; -moz-animation-play-state: running; } /** * 圣诞小男孩 */ .christmas-boy { width: 3.5rem; height: 4.06rem; position: absolute; z-index: 5; right: -3.5rem; top: 4rem; background: url(http://img.mukewang.com/565d09870001372152510407.png); background-size: 1500% 100%; background-position: 0% 100%; } /** * 男孩走路动作 */ .boy-walk { -webkit-animation: boyWalk 0.75s steps(4, end) infinite; -moz-animation: boyWalk 0.75s steps(4, end) infinite; } @-webkit-keyframes boyWalk { 0% { background-position: 0 100%; } 100% { background-position: -400% 100%; } } @-moz-keyframes boyWalk { 0% { background-position: 0 100%; } 100% { background-position: -400% 100%; } } /** * 脱衣动作 */ .boy-strip-1 { background-position: -800% 100%; } .boy-strip-2 { background-position: -900% 100%; } .boy-strip-3 { background-position: -1000% 100%; } /** * 站立动作 */ .boy-stand { background-position: -400% 100%; } /** * 打开包裹 */ .boy-unwrapp { -webkit-animation: unwrapp 2s steps(2, end) 1 forwards; -moz-animation: unwrapp 2s steps(2, end) 1 forwards; } @-webkit-keyframes unwrapp { 0% { background-position: -400% 100%; } 100% { background-position: -600% 100%; } } @-moz-keyframes unwrapp { 0% { background-position: -400% 100%; } 100% { background-position: -600% 100%; } } /** * 男孩拥抱 */ .boy-hug { -webkit-animation: boyHug 1s steps(3, end) 1 forwards; -moz-animation: boyHug 1s steps(3, end) 1 forwards; } @-webkit-keyframes boyHug { 0% { background-position: -1000% 100%; } 100% { background-position: -1300% 100%; } } @-moz-keyframes boyHug { 0% { background-position: -1000% 100%; } 100% { background-position: -1300% 100%; } } /** * 男孩头部 */ .christmas-boy-head { left: 7.85rem; top: 4rem; width: 3.5rem; height: 4.06rem; position: absolute; z-index: 12; background: url(http://img.mukewang.com/565d09870001372152510407.png); background-size: 1400% 100%; background-position: -1300% 100%; display: none; }
*{ margin: 0; padding: 0; } .container { width: 100%; height: 100%; position: relative; overflow: hidden; } .bg-adaptive { background-size: 100% 100%; }