html5+css+js实现动画特效,人物动画

BoyWalk.js文件:

/**
 * 小孩走路
 * @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)
        }
    }
}


index.html代码:

<!DOCTYPE html>
<html>


<head>
    <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
    <title>七夕主题</title>
    <link rel='stylesheet' href='http://img.mukewang.com/down/55c16d94000109f300000000.css' />
    <link rel='stylesheet' href='http://img.mukewang.com/down/55c16dab0001286100000000.css' />
    <link rel='stylesheet' href='http://img.mukewang.com/down/55c16dc00001fa1a00000000.css' />
    <link rel='stylesheet' href='http://img.mukewang.com/down/55c16dda0001113100000000.css' />
    <script type="text/javascript" src="http://img.mukewang.com/down/55ac9a860001a6c500000000.js"></script>
    <script type="text/javascript" src="http://img.mukewang.com/down/55ac9ea30001ace700000000.js"></script>
    <script type="text/javascript" src="http://img.mukewang.com/down/55c16c910001e21b00000000.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 class="cloudArea">
                    <div class="cloud cloud1"></div>
                    <div class="cloud cloud2"></div>
                </div>
                <!-- 太阳 -->
                <div id="sun"></div>
            </li>
            <!-- 第二副画面 -->
            <li>
                <!-- 背景图 -->
                <div class="b_background"></div>
                <div class="b_background_preload"></div>
                <!-- 商店 -->
                <div class="shop">
                    <div class="door">
                        <div class="door-left"></div>
                        <div class="door-right"></div>
                    </div>
                    <!-- 灯 -->
                    <div class="lamp"></div>
                </div>
                <!-- 鸟 -->
                <div class="bird"></div>
            </li>
            <!-- 第三副画面 -->
            <li>
                <!-- 背景图 -->
                <div class="c_background">
                    <div class="c_background_top"></div>
                    <div class="c_background_middle"></div>
                    <div class="c_background_botton"></div>                
                </div>
                <!-- 小女孩 -->
                <div class="girl"></div>
                <div class="bridge-bottom">
                    <div class="water">
                        <div id="water1" class="water_1"></div>
                        <div id="water2" class="water_2"></div>
                        <div id="water3" class="water_3"></div>
                        <div id="water4" class="water_4"></div>
                    </div>
                </div>
                <!-- 星星 -->
                <ul class="stars">
                    <li class="stars1"></li>
                    <li class="stars2"></li>
                    <li class="stars3"></li>
                    <li class="stars4"></li>
                    <li class="stars5"></li>
                    <li class="stars6"></li>
                </ul>
                <!-- 慕课网logo图 -->
                <div class="logo"></div>
            </li>
        </ul>
        <!-- 雪花 -->
        <div id="snowflake"></div>
        <!-- 小男孩 -->
        <div id="boy" class="charector"></div>
    </div>
</body>


</html>

pageA.css代码:


/*背景图*/


.a_background {
    width: 100%;
    height: 100%;
    position: absolute;
}


.a_background_top{
    width: 100%;
    height: 71.6%;
    background-image: url("http://img.mukewang.com/55addf6900019d8f14410645.png");
    background-size: 100% 100%;
}




.a_background_middle{
    width: 100%;
    height: 13.1%;
    background-image: url("http://img.mukewang.com/55addf800001ff2e14410118.png");
    background-size: 100% 100%;
}




.a_background_botton{
    width: 100%;
    height: 15.3%;
    background-image: url("http://img.mukewang.com/55addfcb000189b314410138.png");
    background-size: 100% 100%;
}


pageB.css代码:

/*背景图*/


.b_background {
    width: 100%;
    height: 100%;
    background-image: url("http://img.mukewang.com/55ade06f00015a0d14410901.png");
    background-size: 100% 100%;
    position: absolute;
}


.b_background_preload {
    background: url("http://img.mukewang.com/55ade0be0001a37914410901.png") no-repeat -9999px -9999px;
}


.lamp-bright {
   background-image: url("http://img.mukewang.com/55ade0be0001a37914410901.png");
}




/*商店*/


.shop {
    width: 39.5%;
    height: 35.5%;
    position: absolute;
    left: 29%;
    top: 36.5%;
}


.door {
    position: absolute;
    width: 32%;
    height: 100%;
    top: 32%;
    height: 68%;
    overflow: hidden;
    left: 58.5%;
}


.door-left,
.door-right {
    width: 50%;
    height: 100%;
    position: absolute;
}


.door-left {
    left: 0%;
    background: url(http://img.mukewang.com/55ade1140001050d00910231.png);
    background-size: 100% 100%;
}


.door-right {
    left: 50%;
    background: url(http://img.mukewang.com/55ade12100019f5b00910231.png);
    background-size: 100% 100%;
}




/*鸟*/


.bird {
    min-width: 91px;
    min-height: 71px;
    top: 10%;
    position: absolute;
    z-index: 10;
    right: -91px;
    background: url(http://img.mukewang.com/55ade1700001b38302730071.png) -182px 0px no-repeat;
}
.birdFly {
    -webkit-animation-name: bird-slow;
    -webkit-animation-duration: 400ms;
    -webkit-animation-timing-function: step-start;
    -webkit-animation-iteration-count: infinite;
    -moz-animation-name: bird-slow;
    -moz-animation-duration: 400ms;
    -moz-animation-timing-function: step-start;
    -moz-animation-iteration-count: infinite;
}




/*鸟慢飞*/
@-webkit-keyframes bird-slow {
    0% {
        background-position: -182px 0px;
    }
    50% {
        background-position: 0px 0px;
    }
    75% {
        background-position: -91px 0px;
    }
    100% {
        background-position: -182px 0px;
    }
}


@-moz-keyframes bird-slow {
    0% {
        background-position: -182px 0px;
    }
    50% {
        background-position: 0px 0px;
    }
    75% {
        background-position: -91px 0px;
    }
    100% {
        background-position: -182px 0px;
    }
}

pageC.css代码如下;

<!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' />
    <script src="http://libs.baidu.com/jquery/1.9.1/jquery.js"></script>
    <script type="text/javascript" src="Swipe.js"></script>
</head>
<style type="text/css">
.charector {
    width: 151px;
    height: 291px;
    left: 6%;
    top: 55%;
    position: absolute;
    background: url(http://img.mukewang.com/55ade248000198ae10550582.png) -0px -291px no-repeat;
}
</style>


<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>
            </li>
            <li> 页面2 </li>
            <li> 页面3 </li>
        </ul>
        <div id="boy" class="charector"></div>
    </div>
    <script type="text/javascript">
        var swipe = Swipe($("#content"));


        var $boy = $("#boy");


        // 设置一下缩放比例与基点位置
        var proportion =  $(document).width() / 1440;
        // 设置元素缩放
        $boy.css({
            transform: 'scale(' + proportion + ')'
        });


        // 获取数据
        var getValue = function(className) {
            var $elem = $('' + className + '');
            // 走路的路线坐标
            return {
                height: $elem.height(),
                top: $elem.position().top
            };
        }
        
        // 路的中间到顶部的距离
        var pathY = function() {
            var data = getValue('.a_background_middle');
            return data.top + data.height / 2;
        }();


        // 获取人物元素布局尺寸
        var boyHeight = $boy.height();
        var boyWidth = $boy.width();
        // 计算下缩放后的元素与实际尺寸的一个距离
        var boyInsideLeft = (boyWidth - (boyWidth*proportion))/2;
        var boyInsideTop = (boyHeight - (boyHeight*proportion))/2;


        // 修正小男孩的正确位置
        // 中间路的垂直距离 - 人物原始的垂直距离 - 人物缩放后的垂直距离
        $boy.css({
            top: pathY - (boyHeight * proportion) - boyInsideTop
        });
    </script>
</body>


</html>

Qixi.js代码如下:

// 动画结束事件
       var animationEnd = (function() {
           var explorer = navigator.userAgent;
           if (~explorer.indexOf('WebKit')) {
               return 'webkitAnimationEnd';
           }
           return 'animationend';
       })();




       ///
       //灯动画 //
       ///
       var lamp = {
           elem: $('.b_background'),
           bright: function() {
               this.elem.addClass('lamp-bright');
           },
           dark: function() {
               this.elem.removeClass('lamp-bright');
           }
       };


       var container = $("#content");
       var swipe = Swipe(container);
       visualWidth = container.width();
       visualHeight = container.height();


       // 页面滚动到指定的位置
       function scrollTo(time, proportionX) {
           var distX = visualWidth * proportionX;
           swipe.scrollTo(distX, time);
       }


       // 获取数据
       var getValue = function(className) {
           var $elem = $('' + className + '');
               //走路的路线坐标
           return {
               height: $elem.height(),
               top: $elem.position().top
           };
       };


       // 桥的Y轴
       var bridgeY = function() {
           var data = getValue('.c_background_middle');
           return data.top;
       }();


       
       //小女孩 //
       
       var girl = {
           elem: $('.girl'),
           getHeight: function() {
               return this.elem.height();
           },
           setOffset: function() {
               this.elem.css({
                   left: visualWidth / 2,
                   top: bridgeY - this.getHeight()
               });
           }
       };


       // 修正小女孩位置
       girl.setOffset();




       // 用来临时调整页面
       swipe.scrollTo(visualWidth * 2, 0);




       function doorAction(left, right, time) {
           var $door = $('.door');
           var doorLeft = $('.door-left');
           var doorRight = $('.door-right');
           var defer = $.Deferred();
           var count = 2;
           // 等待开门完成
           var complete = function() {
               if (count == 1) {
                   defer.resolve();
                   return;
               }
               count--;
           }
           doorLeft.transition({
               'left': left
           }, time, complete);
           doorRight.transition({
               'left': right
           }, time, complete);
           return defer;
       }


       // 开门
       function openDoor() {
           return doorAction('-50%', '100%', 2000);
       }


       // 关门
       function shutDoor() {
           return doorAction('0%', '50%', 2000);
       }


       /**
        * 小孩走路
        * @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 walkToShop(runTime) {
               var defer = $.Deferred();
               var doorObj = $('.door');
               // 门的坐标
               var offsetDoor = doorObj.offset();
               var doorOffsetLeft = offsetDoor.left;
               var doorOffsetTop = offsetDoor.top;
               // 小孩当前的坐标
               var posBoy = $boy.position();
               var boyPoxLeft = posBoy.left;
               var boyPoxTop = posBoy.top;


               // 中间位置
               var boyMiddle = $boy.width() / 2;
               var doorMiddle = doorObj.width() / 2;
               var doorTopMiddle = doorObj.height() / 2;




               // 当前需要移动的坐标
               instanceX = (doorOffsetLeft + doorMiddle) - (boyPoxLeft + boyMiddle);


               // Y的坐标
               // top = 人物底部的top - 门中见的top值
               instanceY = boyPoxTop + boyHeight - doorOffsetTop + (doorTopMiddle);


               // 开始走路
               var walkPlay = stratRun({
                   transform: 'translateX(' + instanceX + 'px),translateY(-' + instanceY + 'px),scale(0.5,0.5)',
                   opacity: 0.1
               }, 2000);
               // 走路完毕
               walkPlay.done(function() {
                   $boy.css({
                       opacity: 0
                   });
                   defer.resolve();
               });
               return defer;
           }


           // 走出店
           function walkOutShop(runTime) {
               var defer = $.Deferred();
               restoreWalk();
               // 开始走路
               var walkPlay = stratRun({
                   transform: 'translateX(' + instanceX + 'px),translateY(0),scale(1,1)',
                   opacity: 1
               }, runTime);
               // 走路完毕
               walkPlay.done(function() {
                   defer.resolve();
               });
               return defer;
           }




           // 计算移动距离
           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);
               },
               // 走进商店
               toShop: function() {
                   return walkToShop.apply(null, arguments);
               },
               // 走出商店
               outShop: function() {
                   return walkOutShop.apply(null, arguments);
               }, 
               // 停止走路
               stopWalk: function() {
                   pauseWalk();
               },
               setColoer: function(value) {
                   $boy.css('background-color', value)
               },
               // 获取男孩的宽度
               getWidth: function() {
                   return $boy.width();
               },
               // 复位初始状态
               resetOriginal: function() {
                   this.stopWalk();
                   // 恢复图片
                   $boy.removeClass('slowWalk slowFlolerWalk').addClass('boyOriginal');
               },
               // 转身动作
               rotate: function(callback) {
                   restoreWalk();
                   $boy.addClass('boy-rotate');
                   // 监听转身完毕
                   if (callback) {
                       $boy.on(animationEnd, function() {
                           callback();
                           $(this).off();
                       });
                   }
               },
               // 取花
               talkFlower: function() {
                   $boy.addClass('slowFlolerWalk');
               }
           }
       }

style.css代码如下:


* {
        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%;
    }

Swipe.js代码如下::

/
//页面滑动 //
/




/**
 * [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;
}

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值