如何使用
jquery为图像重新创建此类型的移动:
http://www.istockphoto.com/stock-video-12805249-moving-particles-loop-soft-green-hd-1080.php
我打算将它用作网页背景.如果jquery不可能,我将使用flash as3.但我更喜欢jquery.
解决方法
编辑:
Raphael肯定更适合这个,因为它支持IE. jQuery的问题在于,由于CSS的限制,圆角在IE中很难做到……在Raphael交叉浏览器圈子里没有汗水.
jsFiddle with Raphael – all browsers:
(虽然它可能看起来更好speeded up in IE)
(function() { var paper,circs,i,nowX,nowY,timer,props = {},toggler = 0,elie,dx,dy,rad,cur,opa; // Returns a random integer between min and max // Using Math.round() will give you a non-uniform distribution! function ran(min,max) { return Math.floor(Math.random() * (max - min + 1)) + min; } function moveIt() { for(i = 0; i < circs.length; ++i) { // Reset when time is at zero if (! circs[i].time) { circs[i].time = ran(30,100); circs[i].deg = ran(-179,180); circs[i].vel = ran(1,5); circs[i].curve = ran(0,1); circs[i].fade = ran(0,1); circs[i].grow = ran(-2,2); } // Get position nowX = circs[i].attr("cx"); nowY = circs[i].attr("cy"); // Calc movement dx = circs[i].vel * Math.cos(circs[i].deg * Math.PI/180); dy = circs[i].vel * Math.sin(circs[i].deg * Math.PI/180); // Calc new position nowX += dx; nowY += dy; // Calc wrap around if (nowX < 0) nowX = 490 + nowX; else nowX = nowX % 490; if (nowY < 0) nowY = 490 + nowY; else nowY = nowY % 490; // Render moved particle circs[i].attr({cx: nowX,cy: nowY}); // Calc growth rad = circs[i].attr("r"); if (circs[i].grow > 0) circs[i].attr("r",Math.min(30,rad + .1)); else circs[i].attr("r",Math.max(10,rad - .1)); // Calc curve if (circs[i].curve > 0) circs[i].deg = circs[i].deg + 2; else circs[i].deg = circs[i].deg - 2; // Calc opacity opa = circs[i].attr("fill-opacity"); if (circs[i].fade > 0) { circs[i].attr("fill-opacity",Math.max(.3,opa - .01)); circs[i].attr("stroke-opacity",opa - .01)); } else { circs[i].attr("fill-opacity",Math.min(1,opa + .01)); circs[i].attr("stroke-opacity",opa + .01)); } // Progress timer for particle circs[i].time = circs[i].time - 1; // Calc damping if (circs[i].vel < 1) circs[i].time = 0; else circs[i].vel = circs[i].vel - .05; } timer = setTimeout(moveIt,60); } window.onload = function () { paper = Raphael("canvas",500,500); circs = paper.set(); for (i = 0; i < 30; ++i) { opa = ran(3,10)/10; circs.push(paper.circle(ran(0,500),ran(0,ran(10,30)).attr({"fill-opacity": opa,"stroke-opacity": opa})); } circs.attr({fill: "#00DDAA",stroke: "#00DDAA"}); moveIt(); elie = document.getElementById("toggle"); elie.onclick = function() { (toggler++ % 2) ? (function(){ moveIt(); elie.value = " Stop "; }()) : (function(){ clearTimeout(timer); elie.value = " Start "; }()); } }; }());
第一次尝试jQuery解决方案如下:
这个jQuery尝试在IE中几乎失败,在FF中很慢. Chrome和Safari做得很好:
jsFiddle example for all browsers (IE is not that good)
(我没有在IE中实现淡入淡出,而且IE没有圆角…而且JS也比较慢,所以整体看起来很糟糕)
jsFiddle example for Chrome and Safari only (4x more particles)
(function() { var x,y,$elie,pos,$that,vel,deg,fade,curve,ko,mo,oo,grow,len; // Returns a random integer between min and max // Using Math.round() will give you a non-uniform distribution! function ran(min,max) { return Math.floor(Math.random() * (max - min + 1)) + min; } function moveIt() { $("div.spec").each(function(i,v) { $elie = $(v); if (! $elie.data("time")) { $elie.data("time",ran(30,100)); $elie.data("deg",ran(-179,180)); $elie.data("vel",ran(3,10)); $elie.data("curve",1)); $elie.data("fade",1)); $elie.data("grow",ran(-2,2)); } vel = $elie.data("vel"); deg = $elie.data("deg"); fade = $elie.data("fade"); curve = $elie.data("curve"); grow = $elie.data("grow"); len = $elie.width(); if (grow > 0) len = Math.min(len + grow,50); else len = Math.max(len + grow,20); $elie.css("-moz-border-radius",len/2); $elie.css("border-radius",len/2); $elie.css("width",len); $elie.css("height",len); pos = $elie.position(); $elie.data("time",$elie.data("time") - 1); if (curve) $elie.data("deg",(deg + 5) % 180); else $elie.data("deg",(deg - 5) % 180); ko = $elie.css("-khtml-opacity"); mo = $elie.css("-moz-opacity"); oo = $elie.css("opacity"); if (fade) { $elie.css("-khtml-opacity",Math.max(ko - .1,.5)); $elie.css("-moz-opacity",Math.max(mo - .1,.5)); $elie.css("opacity",Math.max(oo - .1,.5)); } else { $elie.css("-khtml-opacity",Math.min(ko - -.1,1)); $elie.css("-moz-opacity",Math.min(mo - -.1,1)); $elie.css("opacity",Math.min(oo - -.1,1)); } if (vel < 3) $elie.data("time",0); else $elie.data("vel",vel - .2); nowX = pos.left; nowY = pos.top; x = vel * Math.cos(deg * Math.PI/180); y = vel * Math.sin(deg * Math.PI/180); nowX = nowX + x; nowY = nowY + y; if (nowX < 0) nowX = 490 + nowX; else nowX = nowX % 490; if (nowY < 0) nowY = 490 + nowY; else nowY = nowY % 490; $elie.css("left",nowX); $elie.css("top",nowY); }); } $(function() { $(document.createElement('div')).appendTo('body').attr('id','Box'); $elie = $("<div/>").attr("class","spec"); // Note that math random is inclussive for 0 and exclussive for Max for (i = 0; i < 100; ++i) { $that = $elie.clone(); $that.css("top",495)); $that.css("left",495)); $("#Box").append($that); } timer = setInterval(moveIt,60); $("input").toggle(function() { clearInterval(timer); this.value = " Start "; },function() { timer = setInterval(moveIt,60); this.value = " Stop "; }); }); }());