zoukankan      html  css  js  c++  java
  • javascript运动框架(三)

    迟到了好几天,不好意思哈!
    继续来优化一下javascript运动框架的代码。
    之前的代码存在bug,当重复点击时速度会加快,那么怎么解决这个bug呢?

    现在我们就来解决一下,
    其实很简单,
    在开始运动时,关闭已有计时器。

    思考一下:如何让很多物体同时动,而且他们至今不会互相影响呢。
    1、单独给每个物体加一个计时器
    2、当鼠标移进去宽度增长至800,当鼠标移出时,宽度慢慢减小至原本宽度
    具体代码如下:
    <script type="text/javascript">
    window.onload = function(){
    var oDiv = document.getElementsByTagName('p');
    var timer;
    function getStyle(obj,name){
    //currentStyle:当前的样式
    if(obj.currentStyle){
    return obj.currentStyle[name];//不兼容谷歌和火狐
    }else{
    //getComputedStyle:计算过后的样式
    return getComputedStyle(obj,false)[name];//不兼容IE8--
    }
    }
    function move(obj,name,target,dur,fn){
    clearInterval(obj.timer);
    var count = parseInt(dur/30);//总次数
    var start = parseFloat(getStyle(obj,name));//开始的距离
    var dis = target - start;//距离
    // 步长
    var step = dis/count;
    var n = 0;//当前步数
    obj.timer = setInterval(function(){
    n++;
    obj.style[name] = start+ n*step +'px';
    if(n == count){
    clearInterval(obj.timer)
    fn && fn();
    }

    },30)
    }
    for(var i=0;i<oDiv.length;i++){
    oDiv[i].onmouseover = function(){
    move(this,'width',800,1000)
    }
    oDiv[i].onmouseout = function(){
    move(this,'width',30,1000)
    }
    }
    }
    </script>
    开始的位置和结束的位置都为随机的,用JSON来传递多个值,那要怎么写呢?
    实现思路:1、把name,target两个形参改为json
    2、然后用for in循环。遍历属性和值。

    在move()函数里,把开始位置和距离。改为用json
    大致就是这样。
    var start = {};
    var dis = {};

    for(var name in json){
    start[name] = parseFloat(getStyle(obj,name));
    dis[name] = json[name] - start[name];
    }

    在运动的时候都有快慢,有运动曲线,这怎么写呢?
    写一个判断条件,传一个参数easing,当满足条件时,相对应的速度快慢。
    obj.timer = setInterval(function(){
    n++;
    for(var name in json){
    var a = n/count;
    switch(easing){
    case 'linear':
    var cur = start[name] + a*dis[name];
    break;
    case 'ease-in':
    var cur = start[name] + Math.pow(a,3)*dis[name];
    break;
    case 'ease-out':
    var a = 1-n/count;
    var cur = start[name] + (1-Math.pow(a,3))*dis[name];
    break;
    }



    if(name == 'opacity'){
    obj.style[name] = cur;
    obj.style.filter = 'alpha('+cur*100+')';
    }else{
    obj.style[name] = cur +'px';
    }
    }
    当然会有默认的,有的不需要设置,默认就可以了。这就是我们的终极运动框架!!!!
    window.onload = function(){
    var oDiv = document.getElementsByTagName('p')[0];
    var timer;
    function getStyle(obj,name){
    //currentStyle:当前的样式
    if(obj.currentStyle){
    return obj.currentStyle[name];//不兼容谷歌和火狐
    }else{
    //getComputedStyle:计算过后的样式
    return getComputedStyle(obj,false)[name];//不兼容IE8--
    }
    }
    //complete = dur,easing,fn
    function move(obj,json,complete){
    clearInterval(obj.timer);

    var complete = complete || {};
    complete.dur = complete.dur || 1000;
    complete.easing = complete.easing || 'ease-out';

    var count = parseInt(complete.dur/30);//总次数
    var start = {};//{300,height:300}
    var dis = {};
    //{300,height:300}
    for(var name in json){
    start[name] = parseFloat(getStyle(obj,name));
    dis[name] = json[name] - start[name];
    }
    var n = 0;//当前步数
    obj.timer = setInterval(function(){
    n++;
    for(var name in json){
    var a = n/count;
    switch(complete.easing){
    case 'linear':
    var cur = start[name] + a*dis[name];
    break;
    case 'ease-in':
    var cur = start[name] + Math.pow(a,3)*dis[name];
    break;
    case 'ease-out':
    var a = 1-n/count;
    var cur = start[name] + (1-Math.pow(a,3))*dis[name];
    break;
    }



    if(name == 'opacity'){
    obj.style[name] = cur;
    obj.style.filter = 'alpha('+cur*100+')';
    }else{
    obj.style[name] = cur +'px';
    }
    }

    if(n == count){
    clearInterval(obj.timer)
    complete.fn && complete.fn();
    }

    },30)
    }

    oDiv.onmouseover = function(){
    move(this,{300,height:300},{dur:3000,easing:'ease-in'})
    }
    oDiv.onmouseout = function(){
    move(this,{50,height:50},{dur:3000,fn:function(){
    move(oDiv,{opacity:0})
    }})
    }

    }

  • 相关阅读:
    集群
    监控流量脚本
    三次握手四次挥手的原理
    Nginx虚拟主机配置
    apche基于域名,ip,端口的配置
    LVS+Keepalived搭建MyCAT高可用负载均衡集群
    Codeforces 553E Kyoya and Train
    Codeforces 632E Thief in a Shop
    【BZOJ4259】残缺的字符串
    【BZOJ3160】万径人踪灭
  • 原文地址:https://www.cnblogs.com/weiyz/p/7050253.html
Copyright © 2011-2022 走看看