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 判断 object 的特定类转载
Feb 01 Javascript
Javascript优化技巧(文件瘦身篇)
Jan 28 Javascript
在javascript中随机数 math random如何生成指定范围数值的随机数
Oct 21 Javascript
易被忽视的js事件问题总结
May 14 Javascript
AngularJs表单验证实例详解
May 30 Javascript
JS锚点的设置与使用方法
Sep 05 Javascript
JavaScript定义数组的三种方法(new Array(),new Array('x','y')
Oct 04 Javascript
js中数组的常用方法小结
Dec 30 Javascript
js 索引下标之li集合绑定点击事件
Jan 12 Javascript
JavaScript日期工具类DateUtils定义与用法示例
Sep 03 Javascript
JS实现TITLE悬停长久显示效果完整示例
Feb 11 Javascript
详解JavaScript中的数据类型,以及检测数据类型的方法
Sep 17 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
星际争霸教主Flash的ID由来:你永远不会知道他之前的ID是www!
2019/01/18 星际争霸
php adodb连接不同数据库
2009/03/19 PHP
PHP+redis实现微博的推模型案例分析
2019/07/10 PHP
JS中实现replaceAll的方法(实例代码)
2013/11/12 Javascript
js计算两个时间之间天数差的实例代码
2013/11/19 Javascript
JavaScript 基本概念
2015/01/20 Javascript
JavaScript中操作字符串小结
2015/05/04 Javascript
浅谈javascript原型链与继承
2015/07/13 Javascript
JavaScript实现跨浏览器的添加及删除事件绑定函数实例
2015/08/04 Javascript
js实现prototype扩展的方法(字符串,日期,数组扩展)
2016/01/14 Javascript
javascript html5实现表单验证
2016/03/01 Javascript
微信小程序 轮播图swiper详解及实例(源码下载)
2017/01/11 Javascript
Webpack打包慢问题的完美解决方法
2017/03/16 Javascript
js绑定事件和解绑事件
2017/04/27 Javascript
bootstrap table插件的分页与checkbox使用详解
2017/07/23 Javascript
微信禁止下拉查看URL的处理方法
2017/09/28 Javascript
vue-cli开发环境实现跨域请求的方法
2018/04/07 Javascript
JavaScript偏函数与柯里化实例详解
2019/03/27 Javascript
vue canvas绘制矩形并解决由clearRec带来的闪屏问题
2019/09/02 Javascript
vue 全局环境切换问题
2019/10/27 Javascript
解决vue项目本地启动时无法携带cookie的问题
2021/02/06 Vue.js
python生成器,可迭代对象,迭代器区别和联系
2018/02/04 Python
深入理解Python中的 __new__ 和 __init__及区别介绍
2018/09/17 Python
python opencv如何实现图片绘制
2020/01/19 Python
如何使用PyCharm将代码上传到GitHub上(图文详解)
2020/04/27 Python
网易微博Web App用HTML5开发的过程介绍
2012/06/13 HTML / CSS
data:image data url 文件转为Blob上传后端的方法
2019/07/16 HTML / CSS
元宵节晚会主持人串词
2014/03/25 职场文书
幼儿园的门卫岗位职责
2014/04/10 职场文书
学习优秀党员杨宗兴先进事迹材料思想汇报
2014/09/14 职场文书
2014院党委领导班子及其成员群众路线对照检查材料思想汇报
2014/10/04 职场文书
高校自主招生教师推荐信
2015/03/23 职场文书
2015年计生工作总结范文
2015/04/24 职场文书
2015年秋季小班开学寄语
2015/05/27 职场文书
舞出我人生观后感
2015/06/16 职场文书
搞笑Gif:这么白这么长的腿像极了一楼的女朋友
2022/03/21 杂记