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和CSS速查手册
Aug 20 Javascript
String.prototype实现的一些javascript函数介绍
Nov 22 Javascript
Javascript基础知识(一)核心基础语法与事件模型
Sep 29 Javascript
jQuery EasyUI Dialog拖不下来如何解决
Sep 28 Javascript
Bootstrap编写一个兼容主流浏览器的受众巨幕式风格页面
Jul 01 Javascript
深入理解JS正则表达式---分组
Jul 18 Javascript
快速解决js中window.location.href不工作的问题
Nov 02 Javascript
JavaScript 事件流、事件处理程序及事件对象总结
Apr 01 Javascript
关于使用axios的一些心得技巧分享
Jul 02 Javascript
微信小程序 功能函数小结(手机号验证*、密码验证*、获取验证码*)
Dec 08 Javascript
vue踩坑记录之数组定义和赋值问题
Mar 20 Javascript
vue 关闭浏览器窗口的时候,清空localStorage的数据示例
Nov 06 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 数组二分法查找函数代码
2010/02/16 PHP
php中字符集转换iconv函数使用总结
2014/10/11 PHP
浅析Yii2中GridView常见操作
2016/04/22 PHP
PHP5.5.15+Apache2.4.10+MySQL5.6.20配置方法分享
2016/05/06 PHP
php实现微信企业付款到个人零钱功能
2018/10/09 PHP
php中访问修饰符的知识点总结
2019/01/27 PHP
php反序列化长度变化尾部字符串逃逸(0CTF-2016-piapiapia)
2020/02/15 PHP
收藏一些不常用,但是有用的代码
2007/03/12 Javascript
js中方法重载如何实现?以及函数的参数问题
2013/08/01 Javascript
JS对象转换为Jquery对象实现代码
2013/12/29 Javascript
简单谈谈Javascript函数中的arguments
2017/02/09 Javascript
深入理解在JS中通过四种设置事件处理程序的方法
2017/03/02 Javascript
jQuery实现广告条滚动效果
2017/08/22 jQuery
利用js编写网页进度条效果
2017/10/08 Javascript
vue 组件中slot插口的具体用法
2018/04/03 Javascript
element-ui 的el-button组件中添加自定义颜色和图标的实现方法
2018/10/26 Javascript
如何在JavaScript中优雅的提取循环内数据详解
2019/03/04 Javascript
快速解决layui弹窗按enter键不停弹窗的问题
2019/09/18 Javascript
js实现简单放大镜效果
2020/03/07 Javascript
vue-drag-chart 拖动/缩放图表组件的实例代码
2020/04/10 Javascript
python批量创建指定名称的文件夹
2019/03/21 Python
python读写csv文件的方法
2019/08/13 Python
python 读取数据库并绘图的实例
2019/12/03 Python
详解python 破解网站反爬虫的两种简单方法
2020/02/09 Python
python爬虫开发之urllib模块详细使用方法与实例全解
2020/03/09 Python
Python lambda表达式原理及用法解析
2020/08/18 Python
会计电算化专业个人的自我评价
2013/11/24 职场文书
办公室文员工作自我评价
2013/12/01 职场文书
工商管理专业毕业生自我鉴定2014
2014/10/04 职场文书
财务工作失误检讨书
2015/02/19 职场文书
单位接收证明格式
2015/06/18 职场文书
优秀党员主要事迹范文
2015/11/05 职场文书
css实现文章分割线样式的多种方法总结
2021/04/21 HTML / CSS
CSS的class与id常用的命名规则
2021/05/18 HTML / CSS
Python内置数据结构列表与元组示例详解
2021/08/04 Python
Python代码实现双链表
2022/05/25 Python