2010-08-24 58 views
15

Tôi muốn đối sánh chiều cao của cha mẹ với tổng chiều cao của 'trẻ em', vì vậy nội dung không chảy ra khỏi đường viền của cha mẹ. Tôi đang sử dụng mã sau:Tính chiều cao của trẻ em div bằng cách sử dụng jQuery

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

Nó sẽ lặp qua tất cả các con của div? Đôi khi, nó hoạt động đôi khi nó không.

Ngoài ra, tôi đã thử mã sau đây, giả sử nó sẽ xem xét tất cả các con của nó. Nhưng kết quả là lạ và cho chiều cao gấp đôi từ kết quả chính xác.

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

Xin cảm ơn trước.

+0

câu hỏi Khá ngu ngốc, nhưng bạn đã khai báo biến totalHeight ngay từ đầu? giống như "var totalHeight = 0;" Ví dụ thứ hai bạn đã đăng sẽ hoạt động, nhưng như jAndy đề xuất, bạn nên sử dụng outerHeight() thay vì height() để có độ tin cậy cao hơn. – Kranu

+0

@ Kranu, Cảm ơn lời nhận xét - "Câu hỏi khá ngu ngốc" :) Tại sao bạn cho rằng tôi chưa khai báo nó lúc đầu. Tôi đã đề cập rằng nó hoạt động đôi khi và đôi khi nó không. Tôi không chắc chắn về cách thức hoạt động. Nhưng, bây giờ tôi đã tìm ra. Dù sao, bạn sẽ mong đợi những câu hỏi ngu ngốc như vậy từ những câu hỏi mới. Cảm ơn một lần nữa. – KutePHP

+1

Hey KutePHP, Kranu có lẽ đang nói về câu hỏi của riêng mình, không phải của bạn :) Nó xảy ra với tất cả chúng ta quên để init một biến, đó là lý do tại sao chúng ta cần linters và hinters :) – cipak

Trả lời

38

Hãy thử nó như vậy:

var totalHeight = 0; 

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

http://api.jquery.com/outerHeight/ mất margins, paddingsborders vào tính toán mà phải trả lại một kết quả đáng tin cậy hơn.

+11

outerHeight không tính đến lợi nhuận trừ khi bạn vượt qua trong tham số Boolean "true", và nó sẽ là neater để sử dụng + =. Vì vậy, dòng thứ hai nên đọc: totalHeight + = $ (this) .outerHeight (true); – TheBoss

+2

Hãy chắc chắn sử dụng 'var totalHeight' ở trên một nơi nào đó để biến của bạn không được đính kèm vào cửa sổ. – Brad

+0

Tôi cũng cần ngăn chặn margin bị thu hẹp với 'overflow: auto' trên một số phần tử con, sau đó tất cả các tính toán trả lại giá trị chính xác khi ký quỹ vào tài khoản – 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

Biến sẽ cần phải được khai báo bên ngoài vòng lặp $ .each, nếu không nó sẽ bị ghi đè cho mỗi đứa trẻ và không thể tiếp cận với phạm vi bên ngoài. JS cũng phân biệt chữ hoa chữ thường: 'TotalHeight! = Totalheight',' $ (el) .Height()! = $ (El) .height() ' – Josiah

7

cách tiếp cận khác là tính toán khoảng cách giữa các từ trên và ở dưới cùng offsets bên trong phần tử, đó sẽ chiếm vị trí bất kỳ yếu tố không tĩnh.

Tôi chỉ thử nghiệm điều này trong một trang và môi trường, vì vậy tôi không chắc chắn về cách sử dụng an toàn. Xin vui lòng gửi bình luận nếu là mã rất xấu hoặc nếu nó xứng đáng được cải thiện.

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

Nếu bạn muốn bỏ qua yếu tố ẩn, bạn có thể lọc chúng ra:

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

Bạn có thể viết tắt nó thành:' .children (': visible') ' –

Các vấn đề liên quan