JS中图片飞飞效果

摘要:
当鼠标在界面上移动时,一系列图片会跟随移动。效果如下:实现的基本思想是准备五个img标记,并将它们放在一个div中,以便于控制。div的定位方法设置为固定。设置定位方法是为了解决当滚动条出现在页面上时,图片也可以用鼠标移动的问题。因此,它可以通过环路控制。在代码中,setTimeout传递一个匿名函数,该函数需要引用外部变量。

当鼠标在界面上移动的时候,后面有一连串的图片跟随者一起飘动,效果如下:

JS中图片飞飞效果第1张JS中图片飞飞效果第2张

 

    实现的基本思想:准备五个img标签,为了方便控制都放在一个div里面,设置div的定位方式为 fixed,设置成这中定位方式主要是为了解决在页面出现滚动条的情况下,图片还能够跟随鼠标移动。然后再鼠标移动的时候,延时给每一个图片设置定位的left和top距离就OK了。HTML和CSS代码如下:

 1 <html xmlns="http://www.w3.org/1999/xhtml">
 2     <head>
 3         <style type="text/css" rel="stylesheet">
 4             div{
 5                     width:100px;
 6                     height:80px;
 7                     
 8                     position:fixed;
 9         </style>
10     </head>
11 
12     <body>    
13             <div ><img src="images/tianshi.gif" alt="天使" /></div>
14             <div><img src="images/tianshi.gif" alt="天使" /></div>
15             <div><img src="images/tianshi.gif" alt="天使" /></div>
16             <div><img src="images/tianshi.gif" alt="天使" /></div>
17             <div><img src="images/tianshi.gif" alt="天使" /></div>
18     </body>
19 </html>

 

    在JS中,给当前文档对象注册一个事件,之所以注册给document而不是body是因为,当页面中没有内容的时候,body基本上是没有大小而言。代码如下:

JS中图片飞飞效果第3张JS中图片飞飞效果第4张
 1     <script type="text/javascript" >
 2         window.onload = function(){
 3             document.onmousemove = function(evt){
 4                 var e = evt || window.event;
 5                 //拿到鼠标当前的坐标
 6                 var x = parseInt(e.clientX) + 5;
 7                 var y = parseInt(e.clientY) + 5;
 8                 //获取页面上的div控件
 9                 var imgs = document.getElementsByTagName('div');
10 
11                 setTimeout(function(){
12                         imgs[0].style.left = x + 'px';
13                         imgs[0].style.top = y + 'px';
14                 },0);
15                 setTimeout(function(){
16                     //    var j = i;
17                         imgs[1].style.left = x + 'px';
18                         imgs[1].style.top = y + 'px';
19                 },50);
20                 setTimeout(function(){
21                         imgs[2].style.left = x + 'px';
22                         imgs[2].style.top = y + 'px';
23                 },100);
24                 setTimeout(function(){
25                         imgs[3].style.left = x + 'px';
26                         imgs[3].style.top = y + 'px';
27                 },150);
28                 setTimeout(function(){
29                         imgs[4].style.left = x + 'px';
30                         imgs[4].style.top = y + 'px';
31                 },200);
32             };
33         }
34     </script>
简单繁琐代码段

    通过上面的代码基本上就已经实现了我们想要的效果,但是非常的繁琐,如果想再添加几个图片,又需要重新的拷贝一大片,还需要计算时间等,不过比较容易理解。

    从上面的代码中可以看出,其实每一个setTimeout中代码都是一样的,不同的是imags的索引而已,而且 在每一个setTimeout中传递的都是一个匿名函数。故可以通过一个循环来进行控制,在代码中setTimeout里面传递的是一个匿名函数,是需要引用外部变量的。但由于循环变量i在循环执行完成后已经是5,而在引用它的匿名函数中并不会被驻留,于是最后通过给一个自我执行的匿名函数传参的方式,来使每一个匿名函数来给里面的匿名函数(闭包)维护一个变量作用域。改良后的代码如下:

 1     <script type="text/javascript" >
 2         window.onload = function(){
 3             document.onmousemove = function(evt){
 4                 var e = evt || window.event;
 5                 //拿到鼠标当前的坐标
 6                 var x = parseInt(e.clientX) + 5;
 7                 var y = parseInt(e.clientY) + 5;
 8                 //获取页面上的div控件
 9                 var imgs = document.getElementsByTagName('div');
10                 
11                 for(var i=0;i<imgs.length;i++){
12                     //通过参数的形式把i传递过来,就能够将每一个i的值一直保存在内存中,直到闭包的匿名函数不在使用它
13                     (function(j){
14                         setTimeout(function(){
15                             imgs[j].style.left = x + 'px';
16                             imgs[j].style.top = y + 'px';
17                         },j*40)
18                     })(i);
19                 };
20             };
21         }
22     </script>

 

 

免责声明:文章转载自《JS中图片飞飞效果》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Windows API 教程(七) hook 钩子监听Notepad++操作技巧集合下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

js读取文件fileReader

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xm...

nodejs下function,new function和this的研究

转:http://www.html5china.com/html5-article-3023-1.html 重点我都高亮了! 由于在使用nodejs之前接触js也比较少,最近一直被js的function和new function所困惑,由于两者都可以呈现出面向对象的样子,不知道两者的差别在哪里,就此问题做了一些研究。在研究的过程中发现this指针是个...

js:自定义属性(获取、设置、移除)

1、获取属性的值的方法 (1)element.属性 <body> <input id="input1" value="未失去焦點"></input> <script> input1.onblur=function(){...

13个JavaScript图表(JS图表)图形绘制插件【转】

现在网络上又有越来越多的免费的(JS 图表)JavaScript图表图形绘制插件。我之前给一家网站做过复杂的图形,我们用的是 highchart。在那段时间,没有很多可供选择的插件。但现在不同了,很容易就可以找到很多功能非常不错的图表库。个人而言,此类插件的上升,是因为: 1. Flash 过去是最佳解决方案,但很多人多在从那迁移; 2. 现代浏览器及其更...

Js 跨域之李代桃僵

1. 跨域的方法大致有七计 javascript的同源策略 同源策略是指协议,主机和端口 相同,就是为同源,不管后面在跟什么参数,否则都是跨域 个人觉得服务器上设置代理页面 或者设置跨域头cros最方便 锦囊一 在服务器上设置代理页面 ,如果是有类似nginx 服务的话,可以配置nginx 反向代理,因为跨域只针对浏览器. 比如nginx.conf ser...

一款优秀的前端JS框架—AngularJS

  前  言 AngularJS 是一个 JavaScript 框架。它可通过 <script> 标签添加到 HTML 页面。 AngularJS 通过 指令 扩展了 HTML,且通过 表达式 绑定数据到 HTML。 AngularJS 是一个 JavaScript 框架。它是一个以 JavaScript 编写的库。 AngularJS 是以...