2009-08-17 11 views
4

J'ai un titulaire div sur la page où je veux charger de petites images dans une position aléatoire comme un collage avec un remplissage de 10px sur chacun.Générer une position d'élément aléatoire et éviter le chevauchement en JavaScript

Comment puis-je m'assurer que les images ne se chevauchent jamais l'une l'autre ou ne se chevauchent pas? Existe-t-il un plugin ou une fonction que je pourrais utiliser?

Mon code à ce jour:

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

<script type="text/javascript"> 
$(document).ready(function(){ 
$("#my_canvas img").each(
function(intIndex) { 

var l = Math.floor(Math.random() * $("#my_canvas").width()); 
var t = Math.floor(Math.random() * $("#my_canvas").height()); 

$(this).css("left", l); 
$(this).css("top", t); 

$(this).bind(
    "click", 
     function() { 
      alert("l=" + l + " t=" + t); 
     } 
    ); 

} 

); 

});

<style type="text/css"> 
    #my_canvas 
    { 
     background: #eee; 
     border: black 1px solid; 
     width: 800px; 
     height: 400px; 
    } 
    #my_canvas img 
    { 
     padding: 10px; 
     position:absolute; 
    } 
</style> 

<div id="my_canvas"> 
    <img src="images/1.jpg" /> 
    <img src="images/9.jpg" /> 
    <img src="images/2.jpg" /> 
    <img src="images/3.jpg" /> 
    <img src="images/4.jpg" /> 
    <img src="images/5.jpg" /> 
    <img src="images/6.jpg" /> 
    <img src="images/7.jpg" /> 
    <img src="images/8.jpg" /> 
</div> 
+1

vous pouvez les assigner à une grille, puis ils se chargent chacun à une position peu aléatoire dans leur propre cellule réservée/espace ne se chevauchent jamais et restent "aléatoire". Si vous voulez qu'ils soient complètement aléatoires, vous devrez ajouter la position et la taille dans un tableau et calculer pour chaque image s'il n'est pas @ les mêmes coordonnées d'une image précédente. aucune idée si quelque chose comme ça a été mis dans un plugin avant même si – Sander

Répondre

0

Je suppose qu'il n'y a pas de plugin. Je vais implémenter cela comme suggéré par Sander en faisant une grille div prédéfinie et en chargeant juste des images aléatoires à ces divs. C'est plus facile et plus rapide que de calculer des dimensions/positions d'image et fait à peu près le même travail. Je ne suis pas au hasard, mais visuellement bon :)

3

Conserver les coordonnées cueillies dans un tableau, afin que vous puissiez comparer les coordonnées de chaque nouvelle image que vous placez contre la précédente.

Si les coordonnées sélectionnées chevauchent une image précédente, choisissez de nouvelles coordonnées. Limitez le nombre d'essais de sorte que si vous ne pouvez pas placer une image avec par exemple 1000 essais, vous recommencez avec la première image.

2

Désolé de trouver un ancien message, mais j'ai récemment rencontré un problème similaire et il m'a fallu du temps pour trouver la solution parfaite - que je voulais maintenant partager. Il y a des arbres pour y parvenir.


1) La dure

Si vous souhaitez mettre en œuvre sur votre propre, vous obtiendrez probablement le meilleur résultat correspondant à vos besoins. Cela demande du temps et beaucoup de tests, mais en réalité ce n'est pas si compliqué d'implémenter une telle fonctionnalité par vous-même. Vous pouvez utiliser les fonctions aléatoires Math.floor(Math.random() * Max) + Min pour calculer une position aléatoire dans l'élément parent. Après le positionnement du premier élément, vous devez stocker les coordonnées de l'élément, dans un tableau par exemple. Maintenant, avant de montrer l'élément suivant, vous pouvez utiliser le tableau pour vérifier s'il y a des chevauchements - si c'est le cas, vous pouvez simplement calculer une nouvelle position. Ce n'est pas le moyen le plus efficace de le faire, mais cela fonctionnera plutôt bien pour des quantités d'éléments moins importantes. Mais je suis à peu près certain que si vous l'avez implémenté, il n'est pas trop difficile d'optimiser votre algorithme pour le rendre plus efficace.

2) La solution de contournement façon

La deuxième façon d'y parvenir est des moyens plus facile que la première manière, mais pas aussi flexible. Par conséquent, vous devez utiliser une disposition prédéfinie - une sorte de grille. Supposons donc que vous avez un conteneur avec 100 blocs de grille, donc 100 éléments pour y mettre vos éléments. Vous pouvez maintenant calculer un nombre aléatoire compris entre 1 et 100 et ajouter votre élément au conteneur de grille. Il est assez facile d'éviter les chevauchements, mais cette façon de procéder ne correspond pas toujours à vos besoins.

3) La manière la plus simple Si vous avez fait une recherche pendant un bon moment, il n'y avait pas un seul plugin qui correspond à mes besoins. J'ai donc créé un seul, que j'ai publié et qui peut être utilisé gratuitement. Vous pouvez le trouver sous manuelmaurer.at/randposplugin.php. C'est assez flexible donc je pense que celui-ci serait le moyen le plus facile pour vous d'atteindre vos objectifs.