Tôi cần truy xuất chiều cao hiển thị của một div trong một vùng có thể cuộn. Tôi tự cho mình là khá tốt với jQuery, nhưng điều này hoàn toàn khiến tôi thất vọng.
Giả sử tôi có một div màu đỏ trong một lớp bọc màu đen:
Trong hình trên, hàm jQuery sẽ trả về 248, phần hiển thị của div.
Khi người dùng cuộn qua đầu div, như trong hình trên, nó sẽ báo cáo 296.
Bây giờ, khi người dùng đã cuộn qua div, nó sẽ báo cáo lại 248.
Rõ ràng là các con số của tôi sẽ không nhất quán và rõ ràng như trong bản demo này, hoặc tôi chỉ viết mã cứng cho những con số đó.
Tôi có một chút lý thuyết:
- Nhận chiều cao của cửa sổ
- Lấy chiều cao của div
- Nhận phần bù ban đầu của div từ đầu cửa sổ
- Nhận phần bù khi người dùng cuộn.
- Nếu độ lệch là dương, có nghĩa là đỉnh của div vẫn còn hiển thị.
- nếu nó âm, phần trên của div đã bị cửa sổ che khuất. Tại thời điểm này, div có thể chiếm toàn bộ chiều cao của cửa sổ hoặc phần dưới cùng của div có thể hiển thị
- Nếu đáy của div đang hiển thị, hãy tìm ra khoảng cách giữa nó và đáy của cửa sổ.
Nó có vẻ khá đơn giản, nhưng tôi không thể quấn lấy nó. Tôi sẽ lấy một vết nứt khác vào sáng mai; Tôi chỉ nghĩ rằng một số thiên tài trong số các bạn có thể giúp đỡ.
Cảm ơn!
CẬP NHẬT: Tôi đã tự mình tìm ra điều này, nhưng có vẻ như một trong những câu trả lời dưới đây thanh lịch hơn, vì vậy tôi sẽ sử dụng câu trả lời đó thay thế. Đối với những người tò mò, đây là những gì tôi nghĩ ra:
$(document).ready(function() {
var windowHeight = $(window).height();
var overviewHeight = $("#overview").height();
var overviewStaticTop = $("#overview").offset().top;
var overviewScrollTop = overviewStaticTop - $(window).scrollTop();
var overviewStaticBottom = overviewStaticTop + $("#overview").height();
var overviewScrollBottom = windowHeight - (overviewStaticBottom - $(window).scrollTop());
var visibleArea;
if ((overviewHeight + overviewScrollTop) < windowHeight) {
// alert("bottom is showing!");
visibleArea = windowHeight - overviewScrollBottom;
// alert(visibleArea);
} else {
if (overviewScrollTop < 0) {
// alert("is full height");
visibleArea = windowHeight;
// alert(visibleArea);
} else {
// alert("top is showing");
visibleArea = windowHeight - overviewScrollTop;
// alert(visibleArea);
}
}
});