11548 sujets

JavaScript, DOM et API Web HTML5

Bonjour à tous,

Je vous explique mon problème. J'ai un div en absolute qui possède une hauteur fixe. Je désire connaitre la hauteur du contenu de ce div sachant que ce contenu est composé de div en absolute.

Voici un cas théorique :


<div id='div_1' style='position:absolute; height:150px; width:150px; overflow:absolute;'>
<div id='div_2' style='position:absolute; height:300px; width:150px;'></div>
<div id='div_3' style='position:absolute; height:300px; width:150px;'></div>
<div id='div_4' style='position:absolute; height:300px; width:150px;'></div>
</div>



Je n'ai pas mis les top: et Left: mais c'est éléments div_2 à 4 peuvent, dans ce cas théorique, être positionné n'importe ou même se chevaucher. Il est également possible que ces div aboslute contiennent également des div en absolute et dans ce cas, il faut évidemment la hauteur totale du tout.


J'utilise prototype et jusqu'à présent voici la solution trouvée:


J'essaye de trouver l'élement dans le div principal qui se trouve positioné le plus bas et en faisant la différence entre la position du div principal et l'element le plus bas et sa hauteur, j'ai la hauteur du contenu.

(en prototype)
J'utilise $('div_1')).descendants().each({}) comme ça j'ai tous les éléments. Mais évidemment comme pour chaque élement il faut obtenir la taille et la position... ça prend du temps.

Donc j'ai dans mon code (php) placé un div avec un id bien précis dans l'élément le plus bas de la boite dont je désire connaitre la taille. Avec hidden et bottom:0px; Et ensuite côté javascript je fait la différent entre la position sur la page de cet élément et le conteneur. C'est beaucoup plus performant évidemment mais hélas ce n'est pas générique. Donc ma fonction qui calcul la taille fait d'abord une première boucle sur le dernier élement injecté. Et si il n'y a pas de dernier élément fait la première boucle non performante.

Quand je parle de peu performant, dans mon test, la boite contient 400 éléments et ça prend 0.2 sec. Avec la boucle optimisée c'est évidemment quasi instantané.


Avez-vous une idée pour obtenir la taille du contenu de manière plus optimale ?

Merci,
Utiliser la bibliothèque JQuery (http://jquery.com) et son plugin Dimension (http://plugins.jquery.com/project/dimensions) et sa documentation (http://brandonaaron.net/docs/dimensions/).
Modifié par PiR2 (15 Sep 2008 - 13:53)
Merci pour les infos ! Bon j'ai peut être mal compris mais parmi ces fonctions laquelle me permettrait de connaître la taille du contenu ?

* height : je pense pas ça me donnerais 150px
* innerHeight : je pense pas ça me donnerais +/-150px (excludes the border and includes the padding)
* outerHeight : Ca donnerais +/-150px (includes the border and padding by default)

Dans mon exemple (voir 1ier post) en imaginant que div_2 ... div_4 soient positionnés l'un en dessous de l'autre, la hauteur que je désire obtenir est 900px. Et dans le cas ou div_3 et 4 sont superposés, en dessous de div_2, cela doit donner 600px. C'est la hauteur du contenu de div_1 et non la hauteur de div_1 que je recherche.


Si le contenu n'était pas en absolute, il me suffirait d'enlever la propriété height de div_1 pour ensuite faire un div_1.height(). Mais comme le contenu est en absolute, le div_1 sans hauteur fixe fait 0 de hauteur.
Modifié par Vodnok (15 Sep 2008 - 21:09)