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实现的文字按钮表单特效整理
Dec 07 Javascript
jQuery点击按钮弹出遮罩层且内容居中特效
Dec 14 Javascript
基于JavaScript实现文字超出部分隐藏
Feb 29 Javascript
json传值以及ajax接收详解
May 24 Javascript
手机Web APP如何实现分享多平台功能
Aug 19 Javascript
vue.js中$watch的用法示例
Oct 04 Javascript
bootstrap select插件封装成Vue2.0组件
Apr 17 Javascript
Webpack常见静态资源处理-模块加载器(Loaders)+ExtractTextPlugin插件
Jun 29 Javascript
axios 处理 302 状态码的解决方法
Apr 10 Javascript
基于jQuery实现挂号平台首页源码
Jan 06 jQuery
Javascript如何实现扩充基本类型
Aug 26 Javascript
vue 修改 data 数据问题并实时显示操作
Sep 07 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文件读写操作之文件读取方法详解
2011/01/13 PHP
浅析application/x-www-form-urlencoded和multipart/form-data的区别
2014/06/22 PHP
PHP基于GD库实现的生成图片缩略图函数示例
2017/07/05 PHP
visual studio code 调试php方法(图文详解)
2017/09/15 PHP
PHP给源代码加密的几种方法汇总(推荐)
2018/02/06 PHP
仿服务器端脚本方式的JS模板实现方法
2007/04/27 Javascript
jQuery一步一步实现跨浏览器的可编辑表格,支持IE、Firefox、Safari、Chrome、Opera
2009/08/28 Javascript
通过隐藏option实现select的联动效果
2009/11/10 Javascript
jquery 输入框数字限制插件
2009/11/10 Javascript
js展开闭合效果演示代码
2013/07/24 Javascript
解决Vue页面固定滚动位置的处理办法
2017/07/13 Javascript
vue移动端轻量级的轮播组件实现代码
2018/07/12 Javascript
Bootstrap4 gulp 配置详解
2019/01/06 Javascript
微信小程序实现的五星评价功能示例
2019/04/25 Javascript
微信小程序与webview交互实现支付功能
2019/06/07 Javascript
vue iview多张图片大图预览、缩放翻转
2019/07/13 Javascript
ES6中let、const的区别及变量的解构赋值操作方法实例分析
2019/10/15 Javascript
在Python的Flask中使用WTForms表单框架的基础教程
2016/06/07 Python
详解python中executemany和序列的使用方法
2017/08/12 Python
itchat接口使用示例
2017/10/23 Python
Python将多个excel表格合并为一个表格
2021/02/22 Python
使用python为mysql实现restful接口
2018/01/05 Python
遗传算法python版
2018/03/19 Python
python3+PyQt5自定义视图详解
2018/04/24 Python
vue.js实现输入框输入值内容实时响应变化示例
2018/07/07 Python
正则给header的冒号两边参数添加单引号(Python请求用)
2019/08/09 Python
Python 脚本的三种执行方式小结
2019/12/21 Python
Python命令行参数定义及需要注意的地方
2020/11/30 Python
美国婚礼和派对礼品网站:Kate Aspen(新娘送礼会、迎婴派对)
2018/03/28 全球购物
波兰最大的度假胜地和城市公寓租赁运营商:Sun & Snow
2018/10/18 全球购物
小学生学习感言
2014/03/10 职场文书
专项法律服务方案
2014/06/11 职场文书
安全标兵事迹材料
2014/08/17 职场文书
转正申请报告格式
2015/05/15 职场文书
Pytorch distributed 多卡并行载入模型操作
2021/06/05 Python
海弦WR-800F
2022/04/05 无线电