Une image mieux adaptée pourrait peut-être permettre d'obtenir un effet comparable...
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html lang="fr">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<meta name="generator" content="PSPad editor, www.pspad.com">
<title>Untitled</title>
<style type="text/css">
body{font:Garamond;text-align:center;}
h1{margin:13px;}
.blt{display:block;margin:0px;border:0px;position:absolute;height:11px;width:11px;}
</style>
<script type="text/javascript">
function $(k){return document.getElementById(k)}
// fixed time step,no relation to real time
var dlT=.01,lnG=10,rpK=10.3,msS=1,yGr=10,ksV=10,stV=0.1,stA=0.1,imS=11,krB=0.80;
sri="data:image/gif;base64,R0lGODlhCwALAKIAAOjo6Pj3+qKh5WFT8k5NhiMN4BEHrgIBZCH5BAEAAAAALAAAAAALAAsAAAM0CBoc+iCIQYVbouhihpPFMHGHEA3haBwEg27G2gaDwcUH6wjxmpcLwi/XekgISAtkwYAkAAA7";
var nLm=7,lum=new Array(),Sxx=Syy=0,chn='<img id="lm0" class="blt" style="visibility:hidden" src="'+sri+'">';
for (var k=1;k<=nLm;k++) chn+='<img id="lm'+k+'" class="blt" src="'+sri+'">';
document.write(chn);
window.onload=iniGui;
function iniGui(){var k;
for(k=0;k<=nLm;k++) lum[k]=new DefLum(k);
document.onmousemove=mouseEventGui;
setInterval("animGui()",20);
}
function DefLum(k){
this.obj=$('lm'+k);this.x=0;this.y=0;this.dx=0;this.dy=0;
}
function mouseEventGui(e) {var e=e?e:window.event;
Sxx=e.clientX+$('lm0').parentNode.scrollLeft;
Syy=e.clientY+$('lm0').parentNode.scrollTop;
}
function animGui(){var st=0;
lum[0].x=Sxx;
lum[0].y=Syy;
var d=document,h,l;
if (typeof(window.innerWidth)=='number') {l=window.innerWidth;h=window.innerHeight;}
else if (d.documentElement && d.documentElement.clientWidth) {l=d.documentElement.clientWidth;
h=d.documentElement.clientHeight;}
else if (d.body && d.body.clientWidth) {l=d.body.clientWidth;h=d.body.clientHeight;}
for (k=1;k<=nLm;k++){
var rpl=new VcT(0,0);
if (0<k) rplFrc(k-1,k,rpl);
if (k<nLm) rplFrc(k+1,k,rpl);
// resisitance de l'air
var frT=new VcT(-lum[k].dx*ksV,-lum[k].dy*ksV);
// accélération
var FsM=new VcT((rpl.x+frT.x)/msS,(rpl.y+frT.y)/msS+yGr);
// vitesse
lum[k].dx+=(dlT*FsM.x);
lum[k].dy+=(dlT*FsM.y);
// arrêt petits mouvements
if (Math.abs(lum[k].dx)<stV &&
Math.abs(lum[k].dy)<stV &&
Math.abs(FsM.x)<stA &&
Math.abs(FsM.y)<stA){lum[k].dx=0;lum[k].dy=0;}
// nouvelle position
lum[k].x+=lum[k].dx;
lum[k].y+=lum[k].dy;
// rebonds au sol et à droite (pour éviter le scrolling)
if (lum[k].y>=h-imS-1){if (lum[k].dy>0)lum[k].dy=krB*(-lum[k].dy);
lum[k].y=h-imS-1;}
if (lum[k].x>=l-imS-1){if (lum[k].dx>0)lum[k].dx=krB*(-lum[k].dx);
lum[k].x=l-imS-1;}
// Déplacements
lum[k].obj.style.left=lum[k].x+'px';
lum[k].obj.style.top=lum[k].y+'px';}
}
function VcT(x,y){this.x=x;this.y=y;}
function rplFrc(k,j,r){
var dx=(lum[k].x-lum[j].x);
var dy=(lum[k].y-lum[j].y);
var sq=Math.sqrt(dx*dx+dy*dy);
if (lnG<sq){var rpF=rpK*(sq-lnG);r.x+=(dx/sq)*rpF;r.y+=(dy/sq)*rpF;}
}
</script>
</head>
<body>
<h1>Guirlande</h1>
</body>
</html>
Attention l'image est incluse dans le code ! Ceci ne fonctionne sous cette forme qu'avec IE 8 (et non avec les versions antérieures) !