js运动-同时运动

接着上一篇 《js运动-链式运动》继续折腾

上一篇中我们的运动框架,可以完美的实现让一个物体先变宽,在变高,在变透明度.....,看似很完美了!

貌似可以喝喝茶看看美女了。但是老板突然说,让你同时改变一个物体的宽高和透明度,心碎了一地!!!

拿过之前的运动框架发现,无法实现让div同时又变宽,又变高,有变透明度!!最后无能为力,只好有请JSON大神出场了,不认识json的小伙伴们就找度娘问一下吧!

function startMove(obj,attr,iTarget,fn)

之前的startMove()函数里都是传入一个attr属性,在传入一个iTarget目标值,但是我们有个JSON这个神器之后,我们可以把属性和目标值,一对对放在JSON里,然后再startMove里只传入json来代替之前的attr和iTarget

比如我们想要改变宽,高,透明度,那么就把他们放入JSON : {width:300,height:300,opacity:30}

然后用for..in遍历这个json就可以得到相应的属性和值了,那么在运动框架程序中该怎么修改那??

先简单的测试说明一下json

<script>
    var json = {width:200,height:300,opacity:30};
    for(attr in json){
        alert("属性是:" + attr+ "--目标值"+json[attr]);
    }
</script>

有上面的弹出结果可以看出,json里的widht,height,opacity就是对应的属性名字,200,300,30对于的就是目标值,遍历这个json对象,可以看出attr就对应的是各个属性名,而json[attr]就对应各个目标值,看到这里应该就大概明白怎么修改了吧!

1. 首先function startMove(obj,attr,iTarget,fn)中attr,iTarget干掉,传入一个json对象

function startMove(obj,json,fn)

2.接着在定时器里遍历这个json看看都哪些属性需要变化

function startMove(obj,json,fn) {//fn:执行下一个运动的函数
            clearInterval(obj.timer);
            obj.timer = setInterval(function () {
              for(key in json){
                //... 用key代替之前传入的属性,json[atrr]代替之前的目标值
<span style="white-space:pre">		</span>// 也就是把之前startMove函数里的attr改写成key,iTarget改写成json[atrr]
<span style="white-space:pre">		</span>// 但是为了方便虽好把for in里的key的名字直接改写成attr就好了,for(attr  in json)这样就不要一个个去改写startMove里的attr,省事
              }
            },30);
}

完整测试代码如下:

<div id="div1"></div>
<style>
       #div1{
            width: 200px;height: 200px;
            background: green;
        }
</style>
<script>
        window.onload = function(){
            var oDiv = document.getElementById('div1');
            oDiv.onmouseover = function () {
               startMove(oDiv,{width:300,height:300,opacity:30});
            }
            oDiv.onmouseout = function () {
                startMove(oDiv,{width:200,height:200,opacity:100});
            }
        }
        function getStyle(obj,attr){
            return getComputedStyle ? getComputedStyle(obj,false)[attr] : obj.currentStyle[attr];
        }
        function startMove(obj,json,fn) {//json代替了原来的attr和iTarger参数
            clearInterval(obj.timer);
            obj.timer = setInterval(function () {
              for(attr in json){
                  var objAttr = 0;
                  if(attr == "opacity"){ // 由于for in里的key名字是attr所以这里不用替换
                      objAttr = Math.round(parseFloat(getStyle(obj,attr))*100);
                  }else{
                      objAttr = parseInt(getStyle(obj,attr));
                  }
                  var iSpeed = (json[attr] -objAttr)/10;// 由之前的iTarget替换成了json[attr]
                  iSpeed = iSpeed>0 ?Math.ceil(iSpeed):Math.floor(iSpeed);
                  if(objAttr == json[attr]){
                      clearInterval(obj.timer);
                      if(fn){// 如果传了 “下一个运动的函数” 就执行
                          fn();
                      }
                  }else{
                      if(attr == "opacity"){
                          obj.style.filter = 'alpha(opacity:'+(objAttr+iSpeed)+')';
                          obj.style.opacity = (objAttr+iSpeed)/100;
                      }else{
                          obj.style[attr] =  objAttr+iSpeed+'px';
                      }
                  }
              }
            },30);
        }
</script>

到这里我们的运动框架几乎接近完美了,但是还有一个小问题,什么问题那?下回继续

时间: 2024-08-17 20:13:17

js运动-同时运动的相关文章

js实现的运动框架代码实例

js实现的运动框架代码实例:元素的运动效果在大量的场景中都有应用,最典型的一个就是网站的客服系统,一般都会随着滚动条运动,本章节就介绍一下js的一个运动框架实例,希望能够给需要的朋友带来借鉴作用.代码如下: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="author" content="http://www.softwh

js运动-完美运动框架

在上一篇的<js运动-同时运动>中说过,我们的运动框架还存在一个问题,那究竟是什么问题那?把上一篇的程序做一下调整 oDiv.onmouseover = function () { //startMove(oDiv,{width:300,height:300,opacity:30}); startMove(oDiv,{width:204,height:300,opacity:30}); } 在鼠标移入的时候,我们让width不变成300,而是变成204,看看会有什么变化那?? 从图可以看出,当

js动画 Css提供的运动 js提供的运动

1.     动画 (1)      Css样式提供了运动 过渡的属性transition  从一种情况到另一种情况叫过渡 Transition:attr  time  linear  delay: Attr 是变化的属性 Time 是花费的时间 Linear 变化的速度 Delay 是延迟 复习background:url() no-repeat 50% 50% red; Background-image Background-repeat Background-position Backgr

JS的完美运动框架

function getStyle(obj, name) { if(obj.currentStyle) { return obj.currentStyle[name]; } else { return getComputedStyle(obj, false)[name]; } } //注意:在多物体运动框架中,所有东西都不能公用 !否则出问题,BUG:将必要的变量加到物体的属性中就行.即:属性与运动对象绑定:速度.其他属性值(如透明度等等) function startMove(obj, jso

js入门学习~ 运动应用小例

要实现的效果如下: 鼠标移入各个小方块,实现对应的效果(变宽,变高,移入透明,移出恢复)~~ (且各运动相互之前不干扰)  主要是练习多个物体的运动框架~~ ----------------------------------------------------js代码如下 ----------------------------------------------------- //执行函数window.onload = function(){ //声明控制变量 var aDiv = docu

js实现缓冲运动,和匀速运动有点不相同

缓冲运动和匀速运动有点不同,看图可以知道缓冲运动速度是越来越慢的. 1 <style> 2 *{ 3 padding:0; 4 margin:10px 0; 5 } 6 #div1{ 7 height:100px; 8 width:100px; 9 background:green; 10 float:left; 11 position:relative; 12 left:1000px; 13 } 14 #div2{ 15 border-left:1px solid black; 16 pos

JS 之完美运动框架

完美运动框架是对原来的任意值运动框架的改善和效率的提升,即利用了json对属性进行封装,从而提高效率: window.onload=function(){ var oDiv=document.getElementsByTagName('div')[0]; oDiv.onmouseover=function(){ move(this,{width:200,height:200}); } } function getStyle(obj,attr){ if (obj.currentStyle) { r

JS之链式运动,及任意值运动框架,包括透明度的改变

链式运动,顾名思义,一环扣一环,即执行完一个事件后,再接着执行下一个事件,在参数上面动手脚,将下一个要执行的函数名作为一个参数,即利用到回掉函数,下面代码中出现的fn,即回掉函数, 1 function move(obj,attr,target,fn){ 2 clearInterval(obj.timer); 3 obj.timer = setInterval(function(){ 4 var iCur=0; 5 if (attr == 'opacity') { 6 iCur=parseInt

js之任意值运动框架

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-