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 相关文章推荐
jquery中常用的SET和GET
Jan 13 Javascript
JS+CSS 制作的超级简单的下拉菜单附图
Nov 22 Javascript
JavaScript中奇葩的假值示例应用
Mar 11 Javascript
Javascript模仿淘宝信用评价实例(附源码)
Nov 26 Javascript
JavaScript函数节流和函数防抖之间的区别
Feb 15 Javascript
Bootstrap模态框(Modal)实现过渡效果
Mar 17 Javascript
详解Angular 4.x 动态创建组件
Apr 25 Javascript
node.js+jQuery实现用户登录注册AJAX交互
Apr 28 jQuery
bootstrap table sum总数量统计实现方法
Oct 29 Javascript
如何让你的JS代码更好看易读
Dec 01 Javascript
vue 纯js监听滚动条到底部的实例讲解
Sep 03 Javascript
es5 类与es6中class的区别小结
Nov 09 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
海贼王:最美的悬赏令!
2020/03/02 日漫
NOD32 v2.70.32 简体中文封装版 提供下载了
2007/02/27 PHP
PHP 设置MySQL连接字符集的方法
2011/01/02 PHP
PHP操作Memcache实例介绍
2013/06/14 PHP
php使用curl检测网页是否被百度收录的示例分享
2014/01/31 PHP
php中header跳转使用include包含解决参数丢失问题
2015/05/08 PHP
PHP实现QQ空间自动回复说说的方法
2015/12/02 PHP
JavaScript子窗口ModalDialog中操作父窗口对像
2012/12/11 Javascript
js图片自动切换效果处理代码
2013/05/07 Javascript
jQuery动态添加删除select项(实现代码)
2013/09/03 Javascript
js实现获取两个日期之间所有日期的方法
2016/06/17 Javascript
vue 动态改变静态图片以及请求网络图片的实现方法
2018/02/07 Javascript
js中DOM事件绑定分析
2018/03/18 Javascript
基于Vue2x实现响应式自适应轮播组件插件VueSliderShow功能
2018/05/16 Javascript
mpvue中使用flyjs全局拦截的实现代码
2018/09/13 Javascript
EasyUI 数据表格datagrid列自适应内容宽度的实现
2019/07/18 Javascript
js设计模式之代理模式及订阅发布模式实例详解
2019/08/15 Javascript
如何正确理解vue中的key详解
2019/11/02 Javascript
Js实现复选框的全选、全不选反选功能代码实例
2020/02/28 Javascript
[01:45]IMBATV TI4前线报道-选手到达
2014/07/07 DOTA
Python语法快速入门指南
2015/10/12 Python
深入解析Python设计模式编程中建造者模式的使用
2016/03/02 Python
基于python中的TCP及UDP(详解)
2017/11/06 Python
Python控制Firefox方法总结
2019/06/03 Python
python 环境搭建 及python-3.4.4的下载和安装过程
2019/07/20 Python
Python Tkinter图形工具使用方法及实例解析
2020/06/15 Python
Python远程linux执行命令实现
2020/11/11 Python
Python3.8.2安装包及安装教程图文详解(附安装包)
2020/11/28 Python
python爬虫多次请求超时的几种重试方法(6种)
2020/12/01 Python
python画图时设置分辨率和画布大小的实现(plt.figure())
2021/01/08 Python
伦敦剧院及景点门票:Encore Tickets
2018/07/01 全球购物
State Cashmere官网:半零售价可持续蒙古羊绒
2020/02/26 全球购物
完美主义个人的自我评价
2014/02/17 职场文书
经典洗发水广告词
2014/03/13 职场文书
新郎婚礼答谢词
2015/01/04 职场文书
试用期旷工辞退通知书
2015/04/17 职场文书