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 相关文章推荐
抽出www.templatemonster.com的鼠标悬停加载大图模板的代码
Jul 11 Javascript
js异或加解密效果代码
Jun 25 Javascript
javascript获取xml节点的最大值(实现代码)
Dec 11 Javascript
对 jQuery 中 data 方法的误解分析
Jun 18 Javascript
Javascript前端UI框架Kit使用指南之kitjs事件管理
Nov 28 Javascript
jquery实现红色竖向多级向右展开的导航菜单效果
Aug 31 Javascript
Bootstrap按钮功能之查询按钮和重置按钮
Oct 26 Javascript
Node.js连接mongodb实例代码
Jun 06 Javascript
微信小程序排坑指南详解
May 23 Javascript
原生JS与CSS实现软件卸载对话框功能
Dec 05 Javascript
JS轮播图的实现方法
Aug 24 Javascript
vue 实现上传组件
May 31 Vue.js
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 $_SERVER当前完整url的写法
2009/11/12 PHP
php 无限分类的树类代码
2009/12/03 PHP
PHP仿tp实现mvc框架基本设计思路与实现方法分析
2018/05/23 PHP
PHP将英文数字转换为阿拉伯数字实例讲解
2019/01/28 PHP
PHP获取ttf格式文件字体名的方法示例
2019/03/06 PHP
PHP常用正则表达式精选(推荐)
2019/05/28 PHP
utf8的编码算法 转载
2006/12/27 Javascript
javascript Demo模态窗口
2009/12/06 Javascript
IE6下通过a标签点击切换图片的问题
2010/11/14 Javascript
jqPlot 图表中文API使用文档及源码和在线示例
2012/02/07 Javascript
一个JavaScript获取元素当前高度的实例
2014/10/29 Javascript
javascript实现不同颜色Tab标签切换效果
2016/04/27 Javascript
bootstrap table复杂操作代码
2016/11/01 Javascript
JS+H5 Canvas实现时钟效果
2018/07/20 Javascript
JS/jQuery实现超简单的Table表格添加,删除行功能示例
2019/07/31 jQuery
微信小程序中悬浮窗功能的实现代码
2019/08/02 Javascript
vue 指令和过滤器的基本使用(品牌管理案例)
2019/11/04 Javascript
JS实现随机抽取三人
2019/11/06 Javascript
vue 扩展现有组件的操作
2020/08/14 Javascript
vue如何使用rem适配
2021/02/06 Vue.js
JavaScript仿京东轮播图效果
2021/02/25 Javascript
[01:07]2015国际邀请赛 中国区预选赛精彩回顾
2015/06/15 DOTA
python pdb调试方法分享
2014/01/21 Python
Python操作Access数据库基本步骤分析
2016/09/19 Python
Python控制多进程与多线程并发数总结
2016/10/26 Python
Python 专题二 条件语句和循环语句的基础知识
2017/03/19 Python
使用 Python 实现微信公众号粉丝迁移流程
2018/01/03 Python
python 实现语音聊天机器人的示例代码
2018/12/02 Python
python实现kmp算法的实例代码
2019/04/03 Python
python sklearn常用分类算法模型的调用
2019/10/16 Python
Python tkinter常用操作代码实例
2020/01/03 Python
Django实现内容缓存实例方法
2020/06/30 Python
Python 里最强的地图绘制神器
2021/03/01 Python
凯蒂·佩里个人女鞋品牌:Katy Perry Collections
2019/04/04 全球购物
环境工程大学生个人的自我评价
2013/10/08 职场文书
java如何实现socket连接方法封装
2021/09/25 Java/Android