2009-08-19 6 views
0

J'ai une page qui contient des DIV contenant des phrases courtes (un ou deux mots) de tailles de police différentes, qui doivent être positionnées de gauche à droite selon un paramètre numérique, et verticalement afin de ne pas se chevaucher.Positionner les Divs de façon semi-aléatoire, sans chevauchement

Il est comme un nuage de tags, mais il y a des informations contenues dans l'axe des y et (« sang-froid » dans ce cas - http://cool-wall.appspot.com)

Comment dois-je mettre ces derniers dehors? J'utilise actuellement une série très désordonnée de DIVs comme ceci:

<div style="position:absolute; top:150px;left:10px;right:10px;bottom:10px"> 

<!-- then, repeated, with different top, left and font-size values --> 

    <div style="align:center; margin:0; border:none; padding:0; float:left; visibility:visible; position:absolute; top:21%; left:56%; font-size:11px"> 
    <div style="margin-top:0%; margin-right:50%; margin-bottom:0%; margin-left:-50%;"> 
     <a href="foo"><span style="display:inline"> &larr; </span></a> 
     <a href="bar"><span style="display:inline"> Buzz </span></a> 
     <span style="display:inline"> &rarr; </span> 
    </div> 
    </div> 

    <!-- of course, followed by a close div --> 

</div> 

J'utilise une feuille de style pour extraire certains de ces styles, et je me rends compte qu'il est assez pauvre CSS (et HTML) ... mais c'était tout ce que je pouvais bidouiller ensemble pour faire (presque) ce que je voulais faire. Le principal problème avec ce qui précède (en plus d'être déroutant) est que je ne peux pas définir le positionnement de sorte qu'il ne se chevauche pas, car je ne sais pas quelle sera la taille de la police ni comment elle s'affichera à l'écran.

Content d'utiliser JavaScript pour l'obtenir correctement. Mais je ne sais pas par où commencer. Des conseils?

Répondre

0

La valeur x est définie sur chacun, vous voulez être aussi haut sur la page que possible (le plus bas y) car il peut aller sans chevauchement Pas trop mal:

1) Rendu le conteneur - position: relative; Rendez chaque élément à l'intérieur du conteneur avec "position: absolute, top: 0, left: -1000;" - dessinez-les tous hors de l'écran.

2) Un par un, déplacez l'élément vers le x-coorinate nécessaire et y = 0; Vérifiez avec tous les précédents éléments de rendu pour voir si elle entre en collision, si elle le fait, le déplacer vers le bas un pixel jusqu'à ce qu'il ne pas entrer en collision:

var regions = []; 
for(var i = 0; i < items.length; i++){ 
    var item = items[i]; 

    item.style.x = getX(item); // however you get this... 
    var region = YAHOO.util.Dom.getRegion(item); 
    var startingTop = region.top; 
    for(var iReg = 0; iReg < regions.length; iReg++){ 
    var existingRegion = regions[iRegion]; 
    while(region.intersect(existingRegion)){ 
     region.top++; 
     region.bottom++; 
    } 
    item.style.y = (region.top - startingTop) + 'px'; 
    } 
} 

Il est important de mettre à jour juste la région et ne se déplace pas en fait le nœud dom 1px à la fois pour des raisons de performance.

Placez les éléments les plus importants en premier et ils afficheront avec plus de priorité que les éléments inférieurs.

+0

Cela semble vraiment bien. Mais je pense qu'il y a quelques bugs dans le code ci-dessus: "... regions [iRegion];" devrait être "régions [iReg]"; Et vous devez ajouter les régions au tableau situé en bas de la boucle for la plus externe: regions.push (region); ... En outre, il nécessite le code YUI de Yahoo, qui je pense est le mieux instancié par:

1

Il existe une propriété javascript sur l'objet dom qui vous indiquera la hauteur de la balise si vous avez la largeur définie. Je crois qu'il est appelé clientHeight

alerte (document.getElementById ('myElement'). OffsetHeight);

Essayez que (voir aussi http://www.webdeveloper.com/forum/archive/index.php/t-121578.html)

OU

Essayez cette

<span style="margin-top:${randomNumber}px;margin-bottom:${randomNumber}">randomtext</span> 
<span style="margin-top:${randomNumber}px;margin-bottom:${randomNumber}">randomtext</span> 
.. 
<span style="margin-top:${randomNumber}px;margin-bottom:${randomNumber}">randomtext</span> 

ont tous votre élément d'affichage juste en ligne, les sorties dans un ordre aléatoire, puis définissez la marge aléatoire de leur . Cela pourrait être fait avec le code côté serveur (ou javascript si vous voulez le côté client).

+0

Est-il possible de faire cela automatiquement, sans faire beaucoup de calculs en JavaScript? D'après ce que je peux dire, avec cette propriété, je devrais avoir une fonction pour calculer les parties de l'écran qui sont prises avec DIV, et soit garder une trace de cela ou recalculer chaque fois ... non? –

+0

Pas avec la position absolue.La seule façon que je peux voir pour faire ce que vous voulez faire est avec Javascript. Les éléments flottants les font flotter vers la gauche (ou la droite) de l'écran et occupent autant d'espace horizontal que possible. Cependant, cela ne fonctionne pas pour l'espace vertical. Le javascript pour faire une telle chose ne serait pas trop difficile. Vous n'avez qu'à faire une boucle sur les éléments participant à cela et en utilisant la largeur et la hauteur, calculer le meilleur endroit pour les mettre. – Zoidberg

+0

OK, intéressant. En outre, vous avez mentionné que cela fonctionne "si vous avez la largeur définie". Je ne sais pas jusqu'à quel point il sera rendu, car cela dépend du rendu de la police et de la taille de la police. Je pense que j'aurais aussi besoin d'une fonction similaire pour obtenir la largeur, donc je peux faire le calcul de l'utilisation de l'écran. Je suppose que je peux utiliser offsetWidth de la même manière? –

0

Ne placez absolument pas vos éléments. C'est la raison pour laquelle ils tombent l'un sur l'autre ....

+0

OK, mais comment les positionner? Je veux une valeur X absolue et toute valeur Y qui ne provoque pas de chevauchement. –

Questions connexes