2010-08-17 5 views
3

j'ai vu un JQuery aléatoire Example et
je tentais de mettre en œuvre la même chose en utilisant HTML5 et CSS Canvas + + JS avec des images.JQuery aléatoire Effet utilisant Html5 [Canvas + CSS + JS]

mais trouver l'animation/le dessin en utilisant le bit Canvas difficile.

J'ai juste eu l'idée de créer autant de toiles que d'images et ensuite d'essayer de déplacer la toile pour l'animation aléatoire.

Y a-t-il des bibliothèques pour obtenir la même chose?

Tout le monde peut m'aider avec les mêmes.

Edit:
Voici comment je suis arrivé l'effet en utilisant Jquery .. (quelques bugs THR) j'ai obtenu l'effet en utilisant Jquery et certains libraries..but il est essentiellement Thr valeurs manipulation CSS ...
J'essayais de faire quelque chose avec juste apis de dessin basé sur la toile.

<!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"> 
<head> 
    <title></title> 

<style type="text/css"> 
canvas 
{ 
position: absolute; 
top: 0px; 
left: 0px; 
width: 800px; 
height:600px; 
} 
.easing_example { 
border:1px solid #777777; 
padding:0.5em; 
position:relative; 
width:4em; 
} 
img {display:none;} 
.landscape #ps_container{ width: 1000px; height: 600px; } 

#ecard-wrapper{ margin: 20px auto; width: 980px; } 
#ps_container{ border: 1px solid #c2c2c2; margin: 25px 20px 0 0; overflow: hidden; position: relative; float: left; } 


</style> 

    <script src="js/jquery-1.4.2.js" type="text/javascript"> 
    </script> 

    <script src="js/jquery.easing.1.3.js" type="text/javascript"> 
    </script> 

    <script src="js/jquery-css-transform.js" type="text/javascript"> 
    </script> 
    <script src="js/jquery-animate-css-rotate-scale.js" type="text/javascript"> 
    </script> 





    <script type="text/javascript"> 
    var viewport = { obj: null, width: 0, height: 0 }; 
    var timerId=null; 
    var timeInterval=10; 
    var factor=5; 
    var topZIndex=0; 


    var currentCanvasCount=0; 

    function CVImage() 
    { 
     this.ImageSource = null;//string 
     this.size ={ x: 0, y: 0 }; 
     this.position = {x: 0, y: 0}; 
     this.Rotate = 0; 
     this.Canvas = null; 
     this.Context = null; 
     this.Image =null; 
    } 


    CVImage.prototype.draw = function() 
    { 
     var img = new Image();    
     img.src = this.ImageSource; 
     this.Image=img; 
     var context = this.Context; 
     context.drawImage(img,this.position.x - this.size.x /2,this.position.y - this.size.y /2, 
     this.size.x, this.size.y);     
    } 

    CVImage.prototype.update =function(){ 
     var context = this.Context; 
     context.save(); 
     context.clearRect(0,0, this.Canvas.width, this.Canvas.height); 
     context.translate(this.size.x/2,this.size.y/2); 
     context.rotate(this.Rotate * Math.PI/180); 
     this.draw(); 
     context.restore(); 
    } 

    CVImage.prototype.slideOut =function(){ 
     var context = this.Context; 
     var canvas = this.Canvas; 
     $(canvas) 
       .animate(
          {left: 10,top: -20}, 
        { 
          duration: 700, 
          easing: 'easeOutBack' 
        }) 
       .animate(
          {rotate: '20deg',top:-250,left:375}, 
        { 
          duration: 1000, 
          easing: 'easeOutBack', 
          complete : function(){topZIndex--;$(this).css("z-index", topZIndex);} 

        }) 
       .animate(
          {top:0,left: 0,rotate: '0deg'}, 
        { 
          duration: 1000, 
          easing: 'easeOutBack', 
          complete:continueAnimation 
        }); 

    } 


    function continueAnimation() 
     {  
      if(currentCanvasCount >0) 
      { 
      var canvasObj = CanvasArr[currentCanvasCount-1]; 
      if(canvasObj!=null) 
      { 
      canvasObj.slideOut(); 
      currentCanvasCount--; 
      } 
      } 
      else if(currentCanvasCount == 0) 
      { 
      startShuffle(); 
      } 

     } 

     $(document).ready(function() { 
     init();  

       $("#start_flip").click(function(){ 
          startShuffle(); 

       });  
     }); 


     var CanvasArr = new Array();   
     function startShuffle(){ 
      var i =0; 
      currentCanvasCount=CanvasArr.length; 
      continueAnimation(); 
     } 


     function init() 
     { 

      var i = 0;   
      viewport.obj = $('#ps_container'); 
      viewport.width = viewport.obj[0].clientWidth; 
      viewport.height = viewport.obj[0].clientHeight; 

      var images = $(".images_collection img"); 
      for (i = 0; i < images.length ; i++) 
      { 
       var cid = "canvas_" + ""+i; 
       var canvas = document.getElementById(cid); 
       canvas.width = viewport.width; 
       canvas.height = viewport.height; 
       var ctx = canvas.getContext('2d'); 
       var cvimg = new CVImage(); 
       cvimg.ImageSource = images[i].src; 
       cvimg.size.x = parseInt(images[i].width); 
       cvimg.size.y = parseInt(images[i].height); 
       cvimg.position.x = 350; 
       cvimg.position.y = 250; 
       cvimg.Canvas = canvas;   
       cvimg.Context = ctx;   
       CanvasArr.push(cvimg); 
      } 
      DrawCanvas();   
      //timerId = setInterval(DrawCanvas,timeInterval); 
     } 

     function DrawCanvas() 
     { 
     var i =0; 
     var canv =null; 
     for(i=0;i<CanvasArr.length;i++) 
      { 
      canv = CanvasArr[i]; 
      canv.update(); 
      } 
     }  



    </script> 

</head> 
<body> 


     <a href="#" id="start_flip">START SHUFFLE</a> 

     <a href="#" id="stop_flip">STOPP SHUFFLE</a> 

     <div class="easing_example" id="easing_example_3" style="left: 0px;">Click Me</div> 

    <div id="images_collection" class="images_collection" style="display: none"> 
     <a href="#"> 
      <img src="images/Chichen Itza.jpg" alt="" /></a> <a href="#"> 
       <img src="images/Great Wall of China.jpg" alt="" /></a> <a href="#"> 
        <img src="images/Machu Picchu.jpg" alt="" /></a> 
    </div> 

    <div id="ecard-wrapper" class="landscape"> 
    <div id="ps_container" style="display: block; position: fixed; top: 150px; left: 80px"> 
     <canvas id="canvas_0" height="800" width="600" ></canvas> 
     <canvas id="canvas_1" height="800" width="600" ></canvas> 
     <canvas id="canvas_2" height="800" width="600" ></canvas> 
     <canvas id="canvas_3" height="800" width="600" ></canvas> 
    </div> 
    </div> 

</body> 
</html> 

Merci à tous.

+0

Y a-t-il une raison pour laquelle vous essayez de réimplémenter? Si vous recherchez des bibliothèques pour réaliser cet effet, pourquoi ne pas simplement utiliser l'implémentation JQuery avec laquelle vous liez? – Ben

+0

bien que j'ai réalisé l'effet en utilisant Jquery et quelques bibliothèques .. mais c'est fondamentalement thr manipulant des valeurs de CSS ... j'essayais de faire quelque chose avec juste apis de dessin basé par toile. – Amitd

Répondre

2

Si vous créez un canevas pour chaque image, il ne serait pas différent de l'approche CSS, ce qui le rendrait redondant. Mais si vous voulez dessiner sur un très grand canevas, et si vous comprenez le z-index et l'animation, ce n'est pas trop difficile à réaliser. Lire this primer on canvas animation.

Les étapes seraient:

  1. Préparer toutes les images à tirer en utilisant l'objet new Image et en définissant sa src.
  2. Au plus vous dessinez est deux images à la fois. Dites au début, vous avez l'image 1 devant l'image 2. Dessinez d'abord l'image 2, puis dessinez l'image 1 par-dessus. (Dans le premier cadre, vous devez peut-être dessiner seule image 1)
  3. image Animer 1 pour le déplacer plus loin de l'image 2, avec ordre de dessin identique à l'étape 2.
  4. Une fois qu'il est assez loin, changer la l'ordre de dessin, de sorte que l'image 1 soit dessinée en premier, puis l'image 2. Animez l'image 1 pour la rapprocher de l'image 2, jusqu'à ce qu'elle passe en dessous.
  5. Une fois que l'image 1 est sous l'image 2, vous pouvez l'échanger avec l'image 3 et la répéter.
+0

"Au plus, vous dessinez est deux images à la fois." - Pas vrai, essayez de cliquer plusieurs fois sur le carré de la page d'exemple en succession rapide. – Nickolay

+0

Si vous comprenez le mécanisme, il est assez trivial d'implémenter plus de deux images. Vous avez juste besoin d'ajouter plus de couches. – syockit