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 相关文章推荐
做网页的一些技巧(续)
Feb 01 Javascript
jquery实现滑动图片自己测试的例子
Nov 05 Javascript
JS获取表格内指定单元格html内容的方法
Mar 31 Javascript
js识别uc浏览器的代码
Nov 06 Javascript
Bootstrap创建可折叠的组件
Feb 23 Javascript
微信小程序自定义导航隐藏和显示功能
Jun 13 Javascript
JavaScript模拟文件拖选框样式v1.0的实例
Aug 04 Javascript
javascript实现Java中的Map对象功能的实例详解
Aug 21 Javascript
Bootstrap图片轮播效果详解
Oct 17 Javascript
微信小程序实现登录注册tab切换效果
Dec 29 Javascript
微信小程序webview 脚手架使用详解
Jul 22 Javascript
vue实现简单全选和反选功能
Sep 15 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下escape解码函数的实现方法
2010/08/08 PHP
php字符串按照单词进行反转的方法
2015/03/14 PHP
关于laravel-admin ueditor 集成并解决刷新的问题
2019/10/21 PHP
PHP+Redis链表解决高并发下商品超卖问题(实现原理及步骤)
2020/08/03 PHP
用js脚本控制asp.net下treeview的NodeCheck的实现代码
2010/03/02 Javascript
jquery中使用ajax获取远程页面信息
2011/11/13 Javascript
jquery中dom操作和事件的实例学习-表单验证
2011/11/30 Javascript
基于iframe实现类似于ajax的页面无刷新
2014/05/31 Javascript
JavaScript使用function定义对象并调用的方法
2015/03/23 Javascript
javascript中数组方法汇总
2015/07/07 Javascript
用JavaScript判断CSS浏览器类型前缀的两种方法
2015/10/08 Javascript
jquery实现移动端点击图片查看大图特效
2020/09/11 Javascript
jquery单击文字或图片内容放大并居中显示
2017/06/23 jQuery
在React中如何优雅的处理事件响应详解
2017/07/24 Javascript
详解10分钟学会vue滚动行为
2017/09/21 Javascript
详解js删除数组中的指定元素
2018/10/31 Javascript
使用Object.defineProperty如何巧妙找到修改某个变量的准确代码位置
2018/11/02 Javascript
探索JavaScript中私有成员的相关知识
2019/06/13 Javascript
bootstrap 日期控件 datepicker被弹出框dialog覆盖的解决办法
2019/07/09 Javascript
three.js 如何制作魔方
2020/07/31 Javascript
vue监听键盘事件的相关总结
2021/01/29 Vue.js
python删除特定文件的方法
2015/07/30 Python
简单了解OpenCV是个什么东西
2017/11/10 Python
浅谈dataframe中更改列属性的方法
2018/07/10 Python
django框架模型层功能、组成与用法分析
2019/07/30 Python
Python csv文件的读写操作实例详解
2019/11/19 Python
python读写Excel表格的实例代码(简单实用)
2019/12/19 Python
CSS图片翻转动画技术详解(IE也实现了)
2014/04/03 HTML / CSS
HTML5上传文件显示进度的实现代码
2012/08/30 HTML / CSS
门卫岗位安全职责
2013/12/13 职场文书
《天安门广场》教学反思
2014/04/23 职场文书
住宅质量保证书
2014/04/29 职场文书
2014县政府领导班子三严三实对照检查材料思想汇报
2014/09/26 职场文书
上班旷工检讨书
2015/08/15 职场文书
2019让人心动的商业计划书
2019/06/27 职场文书
MySQL详解进行JDBC编程与增删改查方法
2022/06/16 MySQL