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函数
Dec 22 Javascript
javascript客户端遍历控件与获取父容器对象示例代码
Jan 06 Javascript
JQuery插件iScroll实现下拉刷新,滚动翻页特效
Jun 22 Javascript
处理文本部分内容的TextRange对象应用实例
Jul 29 Javascript
实例分析javascript中的call()和apply()方法
Nov 28 Javascript
详解XMLHttpRequest(二)响应属性、二进制数据、监测上传下载进度
Sep 14 Javascript
原生实现一个react-redux的代码示例
Jun 08 Javascript
使用javascript做时间倒数读秒功能的实例
Jan 23 Javascript
详解VScode编辑器vue环境搭建所遇问题解决方案
Apr 26 Javascript
webpack + vue 打包生成公共配置文件(域名) 方便动态修改
Aug 29 Javascript
vue子传父关于.sync与$emit的实现
Nov 05 Javascript
JavaScript冒泡算法原理与实现方法深入理解
Jun 04 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 CKEditor 上传图片实现代码
2009/11/06 PHP
zf框架的数据库追踪器使用示例
2014/03/13 PHP
ThinkPHP 3.2 版本升级了哪些内容
2015/03/05 PHP
thinkPHP简单调用函数与类库的方法
2017/03/15 PHP
Laravel框架用户登陆身份验证实现方法详解
2017/09/14 PHP
php模拟post提交请求调用接口示例解析
2020/08/07 PHP
图片在浏览器中底部对齐 解决方法之一
2011/11/30 Javascript
jquery.artwl.thickbox.js  一个非常简单好用的jQuery弹出层插件
2012/03/01 Javascript
如何将网页表格内容导入excel
2014/02/18 Javascript
jQuery图片渐变特效的简单实现
2016/06/25 Javascript
Vuejs第七篇之Vuejs过渡动画案例全面解析
2016/09/05 Javascript
js实现密码强度检验
2017/01/15 Javascript
微信小程序自定义toast实现方法详解【附demo源码下载】
2017/11/28 Javascript
使用JavaScript生成罗马字符的实例代码
2018/06/08 Javascript
Intellij IDEA搭建vue-cli项目的方法步骤
2018/10/20 Javascript
jQuery实现动态加载(按需加载)javascript文件的方法分析
2019/05/31 jQuery
一文看懂如何简单实现节流函数和防抖函数
2019/09/05 Javascript
用JS实现一个简单的打砖块游戏
2019/12/11 Javascript
python实现机器学习之多元线性回归
2018/09/06 Python
Python实现的在特定目录下导入模块功能分析
2019/02/11 Python
用python介绍4种常用的单链表翻转的方法小结
2020/02/24 Python
基于opencv实现简单画板功能
2020/08/02 Python
python中strip(),lstrip(),rstrip()函数的使用讲解
2020/11/17 Python
金宝贝童装官网:Gymboree
2016/08/31 全球购物
美国创意之家:BulbHead
2017/07/12 全球购物
ebookers英国:隶属全球最大的在线旅游公司Expedia
2017/12/28 全球购物
PHP高级工程师面试问题推荐
2013/01/18 面试题
税务干部鉴定材料
2014/02/11 职场文书
节约用水倡议书
2014/04/16 职场文书
不错的求职信范文
2014/07/20 职场文书
个人存款证明书
2014/10/18 职场文书
写给医院的感谢信
2015/01/22 职场文书
公司感谢信范文
2015/01/22 职场文书
2015年财政局工作总结
2015/05/21 职场文书
2016幼儿园教师节新闻稿
2015/11/25 职场文书
用python删除文件夹中的重复图片(图片去重)
2021/05/12 Python