Javascript 移动的海绵宝宝

news/2024/7/4 6:40:30

效果描述:

做一个简单的动画效果,刚刷新页面时,SpongeBob在页面的左上角位置,随着时间推移,他匀速向右移动,直到右侧抵达页面右侧停下来。

分析:

SpongeBob作为一张图片被存放在<img>里面,<img>又被存放在<div>里面。

图片运动的本质:盒子的位移变化

只变化一次还不够,因此需要setInterval这个定时器

位移,读取时使用offsetLeft属性,赋值时使用style.left属性

注意:

1. 前者无单位,后者有

2. 只有对于具有定位属性的元素,left属性才有意义

即,存放图片的div元素必须要加

position: absolute;

当然relative也能动起来,但是一般是父元素相对定位,子元素绝对定位 

停下来的本质:清除定时器

JS代码

    var div = document.querySelector('div');var inter = setInterval(callback,100);function callback(){if(div.offsetLeft>1500-div.clientWidth)clearInterval(inter);div.style.left = div.offsetLeft+10+'px';}    

那么,如果海绵宝宝的朋友派大星,章鱼哥也来了,是不是每个海洋生物都要重写一次上面的代码?

这时候可以选择把动画效果封装成一个函数moveRight(obj,speed),那个对象要移动,直接调用就可以了,参数1存放对象,参数2存放setInterval的间隔,值越大,移动速度越慢。

    function moveRight(obj,speed){var inter = setInterval(callback,speed);function callback(){if(obj.offsetLeft>1500-obj.clientWidth)clearInterval(inter);obj.style.left = obj.offsetLeft+10+'px';}    }moveRight(div,10);

但是如果每一次有一个新成员要移动,都要申请一个变量inter来存放定时器,会开辟大量的内存空间。这时候可以利用每个对象自带属性这个特征,来命名各自的定时器,即 将var inter 改成obj.inter

    function moveRight(obj,speed){obj.inter = setInterval(callback,speed);function callback(){if(obj.offsetLeft>1500-obj.clientWidth)clearInterval(obj.inter);obj.style.left = obj.offsetLeft+10+'px';}    }

现在再回头来开,一刷新页面元素就开始移动是很奇怪的。也就是说动画一般都会有一个触发事件。问题来了,如果某个元素的触发时间多次发生,岂不是开启了多个定时器?

答案是肯定的,对于这里封装的动画函数来说,开启多个定时器直接造成的结果就是海洋生物会移动得非常之快。如何解决?

其实只要保证定时器的唯一性即可,可以在函数的开头加上这么一句

clearInterval(obj.timer);


http://lihuaxi.xjx100.cn/news/240763.html

相关文章

使用HTML5监測站点性能

在这个信息爆炸的互联网时代&#xff0c;越来越多的人缺少了等待的耐心。站点性能对于一个站点来说越来越重要。下面为监控到的站点打开时间对跳出率的影响&#xff1a; 当站点打开时间在0-1秒时&#xff0c;跳出率为12% 当站点打开时间在1-2秒时&#xff0c;跳出率为26% 当站点…

使用Apache对Tomcat进行负载均衡

翻译&#xff1a;疯狂的技术宅原文标题&#xff1a;Load balancing tomcat with Apache原文链接&#xff1a;http://programmergate.com/loa...本文首发微信公众号&#xff1a;充实的脑洞有时候我们需要把自己的应用部署在多个Tomcat实例上&#xff0c;这种场景通常是在使用大量…

JavaScript 慢慢移动的海绵宝宝

前情提要&#xff1a;Javascript 移动的海绵宝宝 这个海绵宝宝是匀速运动、突然停下来的&#xff0c;有点不合理。现实中我们跑步都是速度慢慢减小到0。 要实现这个效果&#xff0c;就必须速度逐渐减小&#xff0c;本质上是盒子的步长逐渐减小。 step (targetLocation - nowL…

『科学计算』可视化二元正态分布3D科学可视化实战

二元正态分布可视化本体 由于近来一直再看kaggle的入门书&#xff08;sklearn入门手册的感觉233&#xff09;&#xff0c;感觉对机器学习的理解加深了不少&#xff08;实际上就只是调包能力加强了&#xff09;&#xff0c;联想到假期在python科学计算上也算是进行了一些尝试学…

还有这种操作?

【GDB调试】 用bat避免路径问题 :a g cyc.cpp -g -Wall -o cyc -m32 gdb32 cyc.exe pause goto a debuger.bat开O2在调试中容易出现奇怪错误&#xff0c;尽量不要开&#xff01; 常用命令&#xff1a; ---------- help info 输出所有cmd指令 r 运行 ---------- b 100 在100行前…

从前端框架到前端架构参考资料

参考资料 • Wiki - MVC https://zh.wikipedia.org/wiki/MVC • Wiki - MVVM https://zh.wikipedia.org/wiki/MVVM • Mustach https://github.com/janl/mustache.js#usage • Handlebars Introduction | Handlebars • React React – A JavaScript library for building us…

Mysql 小数点后最多保留两位数

CAST(money/100 as DECIMAL(10,2)) AS num 转载于:https://www.cnblogs.com/moxiaoping/p/7611090.html

Java中的策略模式实例教程

策略模式是一种行为模式。用于某一个具体的项目有多个可供选择的算法策略&#xff0c;客户端在其运行时根据不同需求决定使用某一具体算法策略。 策略模式也被称作政策模式。实现过程为&#xff0c;首先定义不同的算法策略&#xff0c;然后客户端把算法策略作为它的一个参数。使…