为了账号安全,请及时绑定邮箱和手机立即绑定

关于链式和多属性运动的另一种情况

老师已经给我们介绍了一个完美的运动框架

多物体运动>链式运动>多属性运动

假设链式步骤{}1,2,3.多属性同时运动a,b,c

老师的框架运行结构1:{a,b}>2:{a,b,c}>3:{a,b,c}


但是存在一种情况:对于一个物体而言,两条属性同时变化,而当第一个属性完成后接着一个链式第三个属性.此时第二个属性和第三个属性继续同步完成.

即: 1:{ 1.1:{a}>1.2:{c} , b }

时间轴例:

{aaaaaaa}>{cccccccc}

{bbbbbbbbbbbbbbb}

应该如何修改框架实现此种情况.

正在回答

1 回答

<!DOCTYPE html>

<html>
<head>
<meta charset="UTF-8">
<title></title>
<style type="text/css">
body {
    margin: 0px;
}
li {
    width:200px;
    height:50px;
    list-style-type:none;
    margin-bottom:10px;
    background-color:brown;
    filter:alpha(opacity=30); 
    opacity:0.3;
}
</style>
<script type="text/javascript">   
window.onload = function(){
      var li = document.getElementsByTagName('li');
      for(var i=0;i<li.length;i++){
      li[i].timer=null; 
      li[i].onmouseover = function(){
      startMove(this,{'width':400},function(obj){//这里的obj参数由startMobe方法调用回调那里传回来,方便解决这行的函数找不到对象的问题
          startMove(obj,{'height':300,'opacity':100});//用了json同时实现高和透明度的修改
      });
             } 
             //鼠标移开
      li[i].onmouseout = function(){
      startMove(this,{'width':200,'height':50,'opacity':30});//用了json同时实现宽高透明度的修改
              }
         }
    }
      var alpha=30;
   function startMove(obj,json,fn){
      clearInterval(obj.timer);
      var curStyle=0;
      obj.timer = setInterval(function(){
        var flag=true;//flag如果放在外面的话在计时器里面被修改之后就不会再变回true的值了,如果在计时器里面,每次计时都会把flag重新赋值true
          for(var attr in json){
      curStyle=(attr=='opacity')?Math.round(parseFloat(getStyle(obj,attr))*100):parseInt(getStyle(obj,attr));//这里把if(){}else{}的判断是不是opacity写成一句了
            var speed = (json[attr]-curStyle)/10;
      speed = (attr=='opacity')?speed:(speed>0?Math.ceil(speed):Math.floor(speed));
      if(curStyle!=json[attr]){//如果不能同时满足所有当前的属性值等于目标值就给flag赋值false
         flag=false;
         }
         obj.style[attr]=(attr=='opacity')?(curStyle+speed)/100:(curStyle+speed+'px');
         if(flag){
      clearInterval(obj.timer);    
            if(fn){
              fn(obj);//这里把obj做成参数主要是方便处理回调函数fn的对象问题
          }
         }
              }
          
      },30)
   }
  
  function getStyle(obj,attr){
      if(obj.currentStyle){
         return obj.currentStyle[attr];
      }else{
          return window.getComputedStyle(obj,false)[attr];
        
      }
  }
 </script>
</head>

<body>
<li id="li"></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
</body>
</html>

--------------------------------------------------------------------------------------

花了大半天写好的,不知道有没有你想要的“第二个属性和第三个属性继续同步完成”

2 回复 有任何疑惑可以回复我~
#1

Fishzz 提问者

首先很感动用心作答. 我的想法是,动作一和动作二是同时开始的,而动作三是承接动作一链式激活开始的,之后动作三和动作二同时完成. 你的satrmove的函数结构上并不是我想要的,它先执行完成了width动画,其次执行高度和透明度同时变化. 我想要的是 执行宽度动画, 同时执行高度变化, 高度结束后执行透明度 宽度透明度完成动画. 时间轴上: 0s:宽度和高度开始变. 3s:宽度执行到途中.高度结束动作,并激活透明度开始变. 6s:宽度完成动作,透明度完成动作.
2018-06-27 回复 有任何疑惑可以回复我~
#2

YGT9865 回复 Fishzz 提问者

我的想法是,动作一和....时完成.按照你这段话来说,其实你的逻辑是有问题的,动作三和动作二既然是同时开始的,为什么不能通过链式回调函数来执行,为什么要放在一开始就执行呢?
2018-08-13 回复 有任何疑惑可以回复我~
#3

YGT9865 回复 Fishzz 提问者

从你这段时间轴上看到了前后矛盾 1、高度和宽度同时执行,当高度和宽度完成了再执行透明度的变化。 2、高度和宽度同时执行,高度执行完毕,宽度执行一半后执行透明度变化。 3、高度和宽度同时执行,当高度执行完毕,宽度和透明度再执行。 4、高度和宽度同时执行,当宽度执行完毕,高度和透明度再执行。 我从你的描述中看出了好几种意思,首先你的逻辑就存在错误。按照你在时间轴上的描述,你可以先设置高度和一半的宽度变化,当3s到了之后,再执行另外一半宽度和透明度的变化,至于3s到了停止高度的变化,你可以计算的,通过计算控制运动的时间
2018-08-13 回复 有任何疑惑可以回复我~
#4

Fishzz 提问者 回复 YGT9865

你的意思我理解,就是把较长的动画分解成两个部分,然后分别和其他两个不同的动画同时执行.前后之间采用链式.但是这不是我想要的,我想要的是设计的函数框架就能实现这个功能
2018-08-19 回复 有任何疑惑可以回复我~
查看1条回复

举报

0/150
提交
取消
JS动画效果
  • 参与学习       113916    人
  • 解答问题       1502    个

通过本课程JS动画的学习,从简单动画开始,逐步深入各种动画框架封装

进入课程

关于链式和多属性运动的另一种情况

我要回答 关注问题
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号