2013-07-17 24 views
7

Sử dụng Javascript hoặc jQuery đơn giản, tôi cần có chiều cao đầy đủ của một phần tử cuộn. Nhưng thuộc tính DOM scrollHeightis apparently not 100% reliable.Trả lại giá trị của phần tử scrollHeight một cách đáng tin cậy mà không sử dụng thuộc tính `scrollHeight`

Tôi đã hình dung tạm thời đưa ra các mục một chiều cao css của auto, kiểm tra ra kích thước của nó, sau đó trả lại css với giá trị trước của nó (mà bản thân có vấn đề - làm thế nào để tôi nhận được css height:100% thay vì height:1012px như jQuery .css('height') sẽ trở lại). Nhưng sau đó tôi đã tìm ra rằng do cách jQuery áp dụng phong cách css trực tiếp đến một yếu tố, chỉ cần áp dụng phong cách '' lợi nhuận nó để giá trị phong cách-tờ-tuyên bố bình thường của nó, vì vậy về mặt lý thuyết tôi có thể làm điều này:

$el.css('height', 'auto'); 
scrollHeight = $el.height(); 
$el.css('height', ''); 

Nhưng điều này không hiệu quả. height:auto không ghi đè kiểu gốc của nguyên tố của tôi là 100% và làm cho phần tử chiếm toàn bộ chiều cao mong muốn của nó.

Vì vậy, bây giờ tôi đang suy nghĩ một cái gì đó nhiều hơn dọc theo những dòng này: sử dụng vị trí của phần tử đầu tiên của phần tử con đầu tiên và vị trí của phần tử con cuối cùng để có được chiều cao. (Tôi có thể điều chỉnh cho padding và margin nếu cần thiết, đây chỉ là một bằng chứng của khái niệm.)

function scrollHeight($el) { 
    var lastEl = $el.children(':last'); 
    return (
     lastEl.position().top 
     + lastEl.height() 
     - $el.children(':first').position().top; 
    ); 
} 

Một số lao động trong các Math.max($el[0].scrollHeight, $el.height()) cũng có thể hữu ích ...

Có phải đó là một ý tưởng khủng khiếp? Tôi không thể là người duy nhất cần biết scrollHeight của một phần tử DOM và nó có độ tin cậy, không thay đổi khi mục được cuộn và làm việc trong tất cả các trình duyệt chính cũng như IE 8 (mặc dù nó sẽ là thú vị khi biết một giải pháp cho IE 6 & 7).

+1

IE 6 và 7? thậm chí Google (có, ngay cả trên trang bắt đầu trắng :)) đã giảm hỗ trợ cho hai fellas đó –

+0

Bạn có thể cung cấp một jsfiddle tái tạo vấn đề của bạn không? –

+0

@ RokoC.Buljan Đó là một điểm khá tốt. Công ty của riêng tôi chỉ rời IE7 trong năm qua ... vì vậy đó là lý do tại sao tôi nghĩ tôi muốn biết làm thế nào để hỗ trợ nó, ngay cả khi nó trở nên khan hiếm trong tự nhiên. Nhưng tôi sẽ cập nhật câu hỏi để phản ánh điều này. – ErikE

Trả lời

6

Thay vì

$el.css('height', 'auto');

Thử -

$el.attr('style', 'height: auto !important');

tôi đề cập đến cố gắng này bởi vì bạn nói -

height: auto không trọng ban đầu yếu tố của tôi phong cách 100% và làm cho nguyên tố chiếm hết chiều cao mong muốn của nó.

+1

Vâng, điều đó thực sự cho thấy vấn đề ở đâu.Do các yếu tố tổ tiên được định vị hoàn toàn với các giá trị 'height' và' overflow' ngăn trẻ lấy chiều cao đầy đủ của nó, ngay cả đề xuất cập nhật của bạn cũng không hoạt động. Xin lỗi vì đã để lại thông tin đó. Một jsfiddle sẽ là một ý tưởng hay. – ErikE

+1

Vì vậy, việc sử dụng '.css ('height', 'auto')' sẽ hoạt động tốt. Đề nghị của bạn là tuyệt vời mặc dù và chỉ cho tôi đi đúng hướng: một số phong cách từ trước đã ngăn chặn 'tự động' làm bất cứ điều gì. Phong cách đó là 'bottom: 0; top: 0' thậm chí không cần thiết. Tôi sẽ nói xin lỗi vì đã lãng phí thời gian của bạn, nhưng nó không thực sự là một sự lãng phí - bạn có 35 đại diện cho đến nay và giúp tôi với vấn đề của tôi, cộng với tôi đã học được điều gì đó. Cảm ơn bạn! – ErikE

+0

@ErikE Cảm ơn, vui vì tôi có thể giúp: ~) – Ross

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