javascript运动框架(三)
迟到了好几天,不好意思哈!
继续来优化一下javascript运动框架的代码。
之前的代码存在bug,当重复点击时速度会加快,那么怎么解决这个bug呢?
现在我们就来解决一下,
其实很简单,
在开始运动时,关闭已有计时器。
思考一下:如何让很多物体同时动,而且他们至今不会互相影响呢。
      1、单独给每个物体加一个计时器
      2、当鼠标移进去宽度增长至800,当鼠标移出时,宽度慢慢减小至原本宽度 
具体代码如下:
<script type="text/javascript">
			window.onload = function(){
				var oDiv = document.getElementsByTagName('p');
				var timer;
				function getStyle(obj,name){
					//currentStyle:当前的样式
					if(obj.currentStyle){
					 	 return	obj.currentStyle[name];//不兼容谷歌和火狐
					}else{
						 //getComputedStyle:计算过后的样式
					     return getComputedStyle(obj,false)[name];//不兼容IE8--
					}
		      }
				function move(obj,name,target,dur,fn){
					clearInterval(obj.timer);
					var count = parseInt(dur/30);//总次数
					var start = parseFloat(getStyle(obj,name));//开始的距离
					var dis = target - start;//距离
//					步长
					var step = dis/count;
					var n = 0;//当前步数
					obj.timer = setInterval(function(){
						n++;
						obj.style[name] = start+ n*step +'px';
					   if(n == count){
					   	 clearInterval(obj.timer)
					     fn && fn();
					   }
					
					},30)
				}
			  for(var i=0;i<oDiv.length;i++){
			  	oDiv[i].onmouseover = function(){
			  		move(this,'width',800,1000)
			  	}
			  	oDiv[i].onmouseout = function(){
			  		move(this,'width',30,1000)
			  	}
			  }
			}
		</script>
开始的位置和结束的位置都为随机的,用JSON来传递多个值,那要怎么写呢?
     实现思路:1、把name,target两个形参改为json
               2、然后用for in循环。遍历属性和值。
在move()函数里,把开始位置和距离。改为用json
大致就是这样。
                                        var start = {};
					var dis = {};
					
					for(var name in json){
						start[name] = parseFloat(getStyle(obj,name));
					    dis[name] = json[name] - start[name];
					}
在运动的时候都有快慢,有运动曲线,这怎么写呢?
写一个判断条件,传一个参数easing,当满足条件时,相对应的速度快慢。
obj.timer = setInterval(function(){
						n++;
						for(var name in json){
							var a = n/count;
							switch(easing){
								case 'linear':
								  var cur = start[name] + a*dis[name];
								  break;
								case 'ease-in':
								  var cur = start[name] + Math.pow(a,3)*dis[name];
								  break;
								case 'ease-out':
								  var a = 1-n/count;
								  var cur = start[name] + (1-Math.pow(a,3))*dis[name];
								  break;
							}
							
							
							
							if(name == 'opacity'){
								obj.style[name] = cur;
								obj.style.filter = 'alpha('+cur*100+')';
							}else{
								obj.style[name] = cur +'px';
							}
						}
当然会有默认的,有的不需要设置,默认就可以了。这就是我们的终极运动框架!!!!
window.onload = function(){
				var oDiv = document.getElementsByTagName('p')[0];
                var timer;
				function getStyle(obj,name){
					//currentStyle:当前的样式
					if(obj.currentStyle){
					 	 return	obj.currentStyle[name];//不兼容谷歌和火狐
					}else{
						 //getComputedStyle:计算过后的样式
					     return getComputedStyle(obj,false)[name];//不兼容IE8--
					}
		      }
				//complete = dur,easing,fn
				function move(obj,json,complete){
					clearInterval(obj.timer);
					
					var complete = complete || {};
					complete.dur = complete.dur || 1000;
					complete.easing = complete.easing || 'ease-out';
					
					var count = parseInt(complete.dur/30);//总次数
					var start = {};//{width:300,height:300}
					var dis = {};
					//{width:300,height:300}
					for(var name in json){
						start[name] = parseFloat(getStyle(obj,name));
					    dis[name] = json[name] - start[name];
					}
				    var n = 0;//当前步数
					obj.timer = setInterval(function(){
						n++;
						for(var name in json){
							var a = n/count;
							switch(complete.easing){
								case 'linear':
								  var cur = start[name] + a*dis[name];
								  break;
								case 'ease-in':
								  var cur = start[name] + Math.pow(a,3)*dis[name];
								  break;
								case 'ease-out':
								  var a = 1-n/count;
								  var cur = start[name] + (1-Math.pow(a,3))*dis[name];
								  break;
							}
							
							
							
							if(name == 'opacity'){
								obj.style[name] = cur;
								obj.style.filter = 'alpha('+cur*100+')';
							}else{
								obj.style[name] = cur +'px';
							}
						}
										
					    if(n == count){
					   	   clearInterval(obj.timer)
					       complete.fn && complete.fn();
					     }
					
					},30)
				}
				
			  	oDiv.onmouseover = function(){
			  		move(this,{width:300,height:300},{dur:3000,easing:'ease-in'})
			  	}
			  	oDiv.onmouseout = function(){
			  		move(this,{width:50,height:50},{dur:3000,fn:function(){
			  			move(oDiv,{opacity:0})
			  		}})
			  	}
			  	
			 }
javascript运动框架(三)的更多相关文章
- 【repost】JavaScript运动框架之速度时间版本
		
一.JavaScript运动框架之速度版 1.1 运动框架的实现思路 运动,其实就是在一段时间内改变 left . right . width . height . opactiy 的值,到达目的地之 ...
 - 好程序员技术教程分享JavaScript运动框架
		
好程序员技术教程分享JavaScript运动框架,有需要的朋友可以参考下. JavaScript的运动,即让某元素的某些属性由一个值变到另一个值的过程.如让div的width属性由200px变到400 ...
 - JavaScript 运动框架 Step by step(转)
		
1,运动原理 Js运动,本质来说,就是让 web 上 DOM 元素动起来.而想要 DOM 动起来,改变其自身的位置属性,比如高宽,左边距,上边距,透明度等.动画的原理就是把不同状态的物体,串成连续的样 ...
 - 【原生JS组件】javascript 运动框架
		
大家都知道JQuerry有animate方法来给DOM元素进行运动,CSS3中也有transition.transform来进行运动.而使用原生的Javascript来控制元素运动,须要写非常多运动的 ...
 - javascript运动框架
		
下面这个一个运动框架可以控制元素在一个属性上的运动,同时,可以调用回调函数. /* 获取元素某个属性的值 @obj: 对象 @attr: 属性值 */ function getStyle(obj, a ...
 - javaScript运动框架之匀速运动
		
运动框架 1.在开始运动时,关闭已有定时器 2.把运动和停止隔开(if/else) 匀速运动的停止条件 运动终止条件:距离足够近 Demo代码 <!DOCTYPE html> <ht ...
 - JavaScript 运动框架
		
<script> window.onload=function (){ var oDiv=document.getElementById("div1"); oDiv.o ...
 - javascript运动框架(二)
		
紧接着上面写的... 给div加一个边框,border:1px solid black window.onload = function(){ var div = document.getE ...
 - 适用于CSS2的各种运动的javascript运动框架
		
<script> window.onload = function() { //var oDiv1 = document.getElementById('box1'); //var oDi ...
 
随机推荐
- Robot Framework+Oracle
			
本篇记录Robot Framework连接oracle数据库的安装 1.基础环境首先,robotframework的基础环境+DatabaseLibrary环境要准备好,这两个环境的搭建在前面已经讲过 ...
 - 更改maven中央仓库
			
前言 1.由于原生的中央仓库 http://repo1.maven.org/maven2/,有一些包不在里面,目前流行的仓库有 http://mvnrepository.com/ 2.找出连接 2.1 ...
 - 开涛spring3(4.3) - 资源 之 4.3 访问Resource
			
4.3.1 ResourceLoader接口 ResourceLoader接口用于返回Resource对象:其实现可以看作是一个生产Resource的工厂类. public interface Re ...
 - java集合(4)- java中HashSet详解
			
HashSet 的实现 对于 HashSet 而言,它是基于 HashMap 实现的,HashSet 底层采用 HashMap 来保存所有元素,因此 HashSet 的实现比较简单,查看 HashSe ...
 - python socket+tcp三次握手四次撒手学习+wireshark抓包
			
Python代码: server: #!/usr/bin/python # -*- coding: UTF-8 -*- # 文件名:server.py import socket # 导入 socke ...
 - SmartCoder每日站立会议10
			
站立会议内容: 准备为上交第一阶段项目进行加班,将各个页面联系起来,静态地图变为动态转换,考虑地图全屏或者是小屏即消息展示方式 1.站立会议照片: 2.任务展板: 3.燃尽图:
 - [oracle]Oracle数据库安全管理
			
目录 + 1.数据库安全控制策略概述 + 2.用户管理 + 3.资源限制与口令管理 + 4.权限管理 + 5.角色管理 + 6.审计 1.数据库安全控制策略概述 安全性是评估一个数据库的重 ...
 - DOM详解
			
浏览器工作的基本流程 1.浏览器开始解析html文档,构建DOM树(DOM tree),DOM树的节点由文档的标签.属性.文本等组成:2.解析外部CSS文件及style标签中的样式信息,这些样式信息将 ...
 - 从零开始的JS生活(二)——BOM、DOM与JS中的事件
			
上回书说道,JS中变量.运算符.分支结构.循环和嵌套循环等内容.本回就由本K给大伙唠唠JS中的BOM.DOM和事件. 一."花心大萝卜"--BOM 1.震惊,FFF团为何对BOM举 ...
 - Oracle ORA-39726压缩表删除字段处理方法
			
今天在往一个压缩表增加一个字段可以增加成功,但在删除的时候报了个ORA-39726 unsupported add/drop column operation on compressed tables ...