2010-08-24 11 views
15

Je veux faire correspondre la taille des parents avec la hauteur totale de ses enfants, de sorte que le contenu ne coule pas de la bordure du parent. J'utilise le code suivant:Calculer la hauteur des enfants de div en utilisant jQuery

$("#leftcolumn").each(function(){ 
    totalHeight=totalHeight+$(this).height(); 
    }); 

Va-t-il parcourir tous les enfants div? Parfois, cela fonctionne parfois non.

En outre, j'ai essayé le code suivant, en supposant qu'il considérera tous ses enfants. Mais le résultat est étrange et donne une hauteur doublée par rapport au résultat correct.

$("#leftcolumn > *").each(function(){ 
    totalHeight=totalHeight+$(this).height(); 
}); 

Merci d'avance.

+0

question assez stupide, mais avez-vous déclarer la variable totalheight au début? comme "var totalHeight = 0;" Le second exemple que vous avez posté devrait fonctionner, mais comme suggéré par jAndy, vous devriez utiliser outerHeight() au lieu de height() pour plus de fiabilité. – Kranu

+0

@ Kranu, Merci pour le commentaire - "Question assez stupide" :) Pourquoi avez-vous supposé que je ne l'ai pas déclaré au début. J'ai mentionné que cela fonctionne parfois et parfois non. Je n'étais pas sûr de la façon dont .each fonctionne. Mais, maintenant je l'ai compris. De toute façon, vous devriez vous attendre à de telles questions stupides de la part de nouveaux. Merci encore. – KutePHP

+1

Hey KutePHP, Kranu parlait probablement de sa propre question, pas la tienne :) Il nous arrive à tous d'oublier d'init une variable, c'est pourquoi nous avons besoin de linters et hinters :) – cipak

Répondre

38

Essayez comme si:

var totalHeight = 0; 

$("#leftcolumn").children().each(function(){ 
    totalHeight = totalHeight + $(this).outerHeight(true); 
}); 

http://api.jquery.com/outerHeight/ prend margins, paddings et borders dans le calcul qui doit retourner un résultat plus fiable.

+11

outerHeight ne prend pas en compte la marge sauf si tu passes dans le paramètre booléen "true", et il serait plus facile d'utiliser + =. Ainsi, la deuxième ligne devrait se lire: totalHeight + = $ (this) .outerHeight (true); – TheBoss

+2

Assurez-vous d'utiliser 'var totalHeight' au-dessus de ceci quelque part afin que votre variable ne soit pas attachée à la fenêtre. – Brad

+0

Je devais aussi empêcher l'effondrement de la marge avec un 'overflow: auto' sur certains éléments enfants, puis tous les calculs renvoyaient des valeurs correctes prenant en compte la marge – danjah

-1
$('#leftColumn').children().each(function(){ 
    var Totalheight += $(this).Height(); 
})var parentHeight = $('#leftColumn').Height(); 
if(parentHeight===TotalHeight) 
{//Do the nasty part} 
else 
{//Do the Good part} 
+0

La variable devrait être déclarée en dehors de la boucle $ .each, sinon elle serait écrasée pour chaque enfant et non accessible à la portée extérieure. JS est également sensible à la casse: 'TotalHeight! = Totalheight',' $ (el) .Height()! = $ (El) .height() ' – Josiah

7

Une autre approche consiste à calculer la distance entre les feuilles supérieure et plus inférieure décalages dans l'élément, ce qui expliquerait les éléments positionnés non statiques.

J'ai seulement testé ceci dans une page et environnement, donc je ne suis pas du tout sûr comment il est sûr à utiliser. S'il vous plaît poster un commentaire si les codes sont très mauvais ou si cela mérite une amélioration.

var topOffset = bottomOffset = 0, 
    outer = true; 
$el.children().each(function(i, e){ 
    var $e = $(e), 
     eTopOffset = $e.offset().top, 
     eBottomOffset = eTopOffset + (outer ? $e.outerHeight() : $e.height()); 

    if (eTopOffset < topOffset) { 
     topOffset = eTopOffset; 
    } 
    if (eBottomOffset > bottomOffset) { 
     bottomOffset = eBottomOffset; 
    } 
}); 

var childrenHeight = bottomOffset - topOffset - $el.offset().top; 
4

Si vous voulez ignorer les éléments cachés, vous pouvez les filtrer:

$("#leftcolumn").children().filter(':visible').each(function(){ 
    totalHeight += $(this).outerHeight(); 
}); 
+2

Vous pouvez le raccourcir à:' .children (': visible') ' –

Questions connexes