JS运动特效之同时运动实现方法分析


Posted in Javascript onJanuary 24, 2018

本文实例讲述了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>

JS运动特效之同时运动实现方法分析

有上面的弹出结果可以看出,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]代替之前的目标值
    // 也就是把之前startMove函数里的attr改写成key,iTarget改写成json[atrr]
    // 但是为了方便虽好把for in里的key的名字直接改写成attr就好了,for(attr in json)这样就不要一个个去改写startMove里的attr,省事
       }
      },30);
}

完整测试代码如下:

HTML部分:

<div id="div1"></div>

css部分:

<style>
    #div1{
      width: 200px;height: 200px;
      background: green;
    }
</style>

js部分:

<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>

JS运动特效之同时运动实现方法分析

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

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
javascript代码编写需要注意的7个小细节小结
Sep 21 Javascript
常见表单重复提交问题整理及解决方法
Nov 13 Javascript
js判断浏览器版本以及浏览器内核的方法
Jan 20 Javascript
信息页文内画中画广告js实现代码(文中加载广告方式)
Jan 03 Javascript
js与jquery正则验证电子邮箱、手机号、邮政编码的方法
Jul 04 Javascript
详解使用vue脚手架工具搭建vue-webpack项目
May 10 Javascript
详解使用angular-cli发布i18n多国语言Angular应用
May 20 Javascript
vue-cli中打包图片路径错误的解决方法
Oct 26 Javascript
对vue事件的延迟执行实例讲解
Aug 28 Javascript
实例分析Array.from(arr)与[...arr]到底有何不同
Apr 09 Javascript
vue实现todolist功能、todolist组件拆分及todolist的删除功能
Apr 11 Javascript
eslint+prettier统一代码风格的实现方法
Jul 22 Javascript
JS运动特效之链式运动分析
Jan 24 #Javascript
Bootstrap popover 实现鼠标移入移除显示隐藏功能方法
Jan 24 #Javascript
JS运动特效之任意值添加运动的方法分析
Jan 24 #Javascript
bootstrap 点击空白处popover弹出框隐藏实例
Jan 24 #Javascript
详解node child_process模块学习笔记
Jan 24 #Javascript
浅谈Node.js 子进程与应用场景
Jan 24 #Javascript
除Console.log()外更多的Javascript调试命令
Jan 24 #Javascript
You might like
自定义PHP分页函数
2006/10/09 PHP
使用Composer安装Yii框架的方法
2016/03/15 PHP
thinkphp的dump函数无输出实例代码
2016/11/15 PHP
thinkPHP实现多字段模糊匹配查询的方法
2016/12/01 PHP
基于mootools 1.3框架下的图片滑动效果代码
2011/04/22 Javascript
基于JavaScript自定义构造函数的详解说明
2013/04/24 Javascript
jquery提示效果实例分析
2014/11/25 Javascript
解决js页面滚动效果scrollTop在FireFox与Chrome浏览器间的兼容问题的方法
2015/12/03 Javascript
vue-router路由简单案例介绍
2017/02/21 Javascript
解决Jquery下拉框数据动态获取的问题
2018/01/25 jQuery
使用D3.js构建实时图形的示例代码
2018/08/28 Javascript
vue单页缓存方案分析及实现
2018/09/25 Javascript
浅谈webpack devtool里的7种SourceMap模式
2019/01/14 Javascript
vue实现新闻展示页的步骤详解
2019/04/11 Javascript
简单了解TypeScript中如何继承 Error 类
2019/06/21 Javascript
Vue实现商品详情页的评价列表功能
2019/09/04 Javascript
[02:56]DOTA2上海特锦赛小组赛解说FreeAgain采访花絮
2016/02/27 DOTA
Python中使用中文的方法
2011/02/19 Python
python避免死锁方法实例分析
2015/06/04 Python
python去除空格和换行符的实现方法(推荐)
2017/01/04 Python
Python实现Linux中的du命令
2017/06/12 Python
Python入门之三角函数tan()函数实例详解
2017/11/08 Python
python 划分数据集为训练集和测试集的方法
2018/12/11 Python
在Python中预先初始化列表内容和长度的实现
2019/11/28 Python
Python常用断言函数实例汇总
2020/11/30 Python
美国顶级水上运动专业店:Marine Products
2018/04/15 全球购物
delegate与普通函数的区别
2014/01/22 面试题
外科实习自我鉴定
2013/10/06 职场文书
食堂厨师岗位职责
2014/08/25 职场文书
预备党员个人总结
2015/02/14 职场文书
党风廉正建设个人工作总结
2015/03/06 职场文书
大学生实习推荐信
2015/03/27 职场文书
养成教育主题班会
2015/08/13 职场文书
电工生产实习心得体会
2016/01/22 职场文书
2016年共产党员公开承诺书
2016/03/24 职场文书
python实现MD5进行文件去重的示例代码
2021/07/09 Python