转行学开发,代码100天——2018-04-25

今天继续学习JavaScript的运动实现——多物体运动框架的介绍及其应用。

首先来看一个简单的例子。如下图,要使图中3个红色盒子实现鼠标移入变宽,移出缩回的动作。

<div id="div1"></div>
<div id="div2"></div>
<div id="div3"></div>
    <style type="text/css">
div{
width: 100px;
height: 20px;
background-color: red;
margin-top: 10px;
}
</style>
<script type="text/javascript">
window.onload = function(){
var oDiv = document.getElementsByTagName("div");
for (var i = 0; i < oDiv.length; i++) {
oDiv[i].onmouseover = function(){
startMove(this,400);
}
oDiv[i].onmouseout = function(){
startMove(this,30);
}
}
}; //多物体运动框架
var timer = null;
function startMove(obj,iTarget)
{
clearInterval(timer);
timer = setInterval(function(){
var speed = (iTarget-obj.offsetWidth)/6;
speed = speed>0?Math.ceil(speed):Math.floor(speed);
if(obj.offsetWidth ==iTarget){ clearInterval(timer);
}else{
obj.style.width = obj.offsetWidth+speed+"px";
}
},300);
}
</script>

可以看到,我们期望通过一个函数startMove函数实现鼠标的移入移出事件,同时给三个盒子添加这种效果。

但稍微留意,发现这里明显存在一个问题,即当鼠标快速在三个盒子上移动时,鼠标离开的盒子宽度并不会缩小到指定值,而是停留在某一位置。

这种效果显然不是我们期待的效果。那....哪里出错了呢?

查看startMove函数,发现这种基本逻辑并没有什么问题,但是将这个函数同时应用与多个物体,就出了问题。

原来是因为多物体共用一个定时器的原因。

于是将公有定时器取消,将每个物体分配一个定时器,简单地说就是给每个物体添加一个定时器属性,修改如下:

//多物体运动框架
// var timer = null;
function startMove(obj,iTarget)
{
clearInterval(obj.timer);
obj.timer = setInterval(function(){
var speed = (iTarget-obj.offsetWidth)/6;
speed = speed>0?Math.ceil(speed):Math.floor(speed);
if(obj.offsetWidth ==iTarget){ clearInterval(obj.timer);
}else{
obj.style.width = obj.offsetWidth+speed+"px";
}
},300);
}

如此,便不会出现上述问题了。

     

很好,“各回各家,各找各妈”,互不干扰。

至此,一个多物体运动的框架也基本形成了。

上述的示例是通过对公有定时器变量私有化,即对多物体对象添加定时器属性的方式,实现多物体调用同一函数时互不相扰。(生活中类似的例子也很常见,比如两个小孩同时喜欢一个玩具,一个想这样玩,另一个想那样玩,两人互不相让最终。。。。所以,给他们一人一个玩具,各玩各的,就会和谐很多~~)。

见到了定时器变量不能公有化使用的例子,如果是修改其他变量呢?

不妨对样式透明度属性值修改来看看究竟。

如下4个红盒子,当鼠标移入移出时要求其透明度变化,实现淡入淡出的效果。

<script type="text/javascript">
window.onload = function(){ var oDiv = document.getElementsByTagName("div");
for (var i = 0; i < oDiv.length; i++) {
oDiv[i].onmouseover = function(){
console.log("mouseover");
startMove(this,100);
}
oDiv[i].onmouseout = function(){
console.log("mouseout");
startMove(this,30);
}
} // 渐变函数
var alpha =30;
function startMove(obj,iTarget){
clearInterval(obj.timer);
obj.timer = setInterval(function(){
var speed =(iTarget-alpha)/6;
speed = speed>0?Math.ceil(speed):Math.floor(speed);
if (alpha ==iTarget) {
clearInterval(obj.timer);
}else{
alpha+=speed;
obj.style.filter ="alpha(opacity:"+alpha+")";
obj.style.opacity = alpha/100;
}
},100);
}
}; </script>

这段代码中,先将定时器私有化,但是在移动鼠标时,方盒的颜色变化并不理想。

这...难道alpha变量也不能共用?

是的,在多物体运动中避免使用公共变量。

多物体中避免使用公共变量。!!!

多物体中避免使用公共变量。!!!

多物体中避免使用公共变量。!!!

(重要的事情说三遍...)

简单的处理就是将变量私有化,即作为多物体对象的一个属性处理。

这样就不会出现之前的问题了。

总结一下:多物体运动中所有变量均不能共用。变量要作为物体的属性处理。

day40—JavaScript多物体运动框架的更多相关文章

  1. javascript链式运动框架案例

    javascript链式运动框架 任务描述: 当鼠标移入红色矩形时,该矩形宽度逐渐增加至400px,之后高度逐渐增加至400px; 当鼠标移出红色矩形时,该矩形高度逐渐减小至200px,之后宽度逐渐减 ...

  2. 多物体运动框架案例一:多个Div的宽度运动变化

    多物体运动框架,鼠标移入Div,此Div逐渐变宽,鼠标移出后,此Div逐渐缩短恢复原长度. <!doctype html> <html> <head> <ti ...

  3. javascript多物体运动案例:多物体淡入淡出

    javascript多物体运动案例:多物体淡入淡出 任务描述: 补充代码,当鼠标移入红色区域时,该区域透明度逐渐增加至不透明;当鼠标移出该红色区域时,该区域透明度逐渐恢复至初始程度. 效果图: < ...

  4. Javascript 链式运动框架——逐行分析代码,让你轻松了解运动的原理

    所谓链式运动,就是一环扣一环.我们的很多运动实际上来说指的就是分阶段的,第一个阶段动完,下个阶段开始动. 这个链式运动框架就是用来处理这些问题的. 我们先来看下之前的运动框架,以下是Javascrip ...

  5. Javascript 多物体运动——逐行分析代码,让你轻松了解运动的原理

    我们先来看下之前的运动的代码,是否支持多物体运动,会出现怎么样的问题. <style type="text/css"> div { width: 100px; heig ...

  6. Javascript 多物体运动1

    多物体运动 <!DOCTYPE html><html> <head>  <meta charset="UTF-8">  <ti ...

  7. js实现多物体运动框架并兼容各浏览器

    首先,我们须要知道在js中获取对象的宽度如offsetWidth等.可能会存在一些小小的bug.原因之中的一个在于offsetWidth只不过获取盒子模型中内容的部分宽度.并不包括内边距,边框和外边距 ...

  8. javascript学习之运动框架

    模仿新浪博客首页的,最新评论: <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"&g ...

  9. Javascript之链式运动框架1

    第一部分:HTML内容: <script src="6-1.js"></script> <script> window.onload=funct ...

随机推荐

  1. ceph部署问题解决

    注意:1.ceph-deploy实用程序将输出文件到当前目录.执行ceph-deploy时确保你在这个目录下.2.不要使用sudo调用ceph-deploy,要么以root用户身份运行它,因为它不会发 ...

  2. APM全链路监控--日志收集篇

    一.监控的意义: 随着互联网普及的广度和深度,对于项目的监控显得格外重要:无论是web服务器进程.内存.cpu等资源监控,还是爬虫程序请求频率,状态码以及储存结果的监控,都需要一个及时的反馈机制. 二 ...

  3. [Python3 练习] 005 汉诺塔1 递归解法

    题目:汉诺塔 I (1) 描述 传说,在世界中心贝拿勒斯(在印度北部)的圣庙外有左中右三根足够长的柱子(塔) 左边柱子上套着 64 片金片,金片按"上小下大"排,其余两根是空柱子 ...

  4. 时间、金钱在java、数据库中的变量类型之总结

    在编写程序时,总是有些变量的类型搞不很明白,现将目前涉及到的变量总结一下: 1.“时间”类型 (1).在数据库中的变量类型是:DateTime 比如: operateTime DATETIME,//数 ...

  5. SCAU 2015 GDCPC team_training0

    A.题目:http://acm.timus.ru/problem.aspx?space=1&num=2024 题意:求一个包含K个不同字符的集合的最大长度,还有组成这个长度的集合的个数 做法: ...

  6. python学习第五十天shutil模块的用法

    什么shutil模块,就是对高级的文件,文件夹,压缩包进行处理的模块,下面简单讲述其用法. 文件和文件夹的操作 拷贝文件内容 import shutil shutil.copyfileobj(open ...

  7. 把java(springboot)程序打包docker镜像

    前言:要在docker运行java(jar包)程序,就要把程序打包成docker镜像(以下简称镜像),可以先理解为镜像就是jar包 打包需要程序代码,java本身的打包环境(包括jdk和maven), ...

  8. Elasticsearch学习,请先看这一篇!

    原文:Elasticsearch学习,请先看这一篇! 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn ...

  9. 基本SQL查询语句

    使用Emp表和Dept表完成下列练习 Emp员工表 empno ename job Mgr Hiredate Sal Comm Deptno 员工号 员工姓名 工作 上级编号 受雇日期 薪金 佣金 部 ...

  10. Maven 集成Tomcat插件(引用)

    Maven已经是Java的项目管理标配,如何在JavaEE开发使用Maven调用Web应用,是很多同学关心的问题.本文将介绍,Maven如何介绍Tomcat插件. Maven Tomcat插件现在主要 ...