Có hơn 30 câu trả lời cho câu hỏi này và không ai trong số họ sử dụng giải pháp JS đơn giản, tuyệt vời mà tôi đang sử dụng. Không cần phải tải jQuery chỉ để giải quyết vấn đề này, vì nhiều người khác đang thúc đẩy.
Để cho biết phần tử có nằm trong khung nhìn hay không, trước tiên chúng ta phải xác định vị trí phần tử trong phần thân. Chúng ta không cần phải làm điều này một cách đệ quy như tôi từng nghĩ. Thay vào đó, chúng ta có thể sử dụng element.getBoundingClientRect()
.
pos = elem.getBoundingClientRect().top - document.body.getBoundingClientRect().top;
Giá trị này là chênh lệch Y giữa đỉnh của vật và đỉnh của thân.
Sau đó chúng ta phải cho biết nếu phần tử nằm trong tầm nhìn. Hầu hết các triển khai đều hỏi liệu phần tử đầy đủ có nằm trong khung nhìn hay không, vì vậy đây là những gì chúng ta sẽ đề cập.
Trước hết, vị trí trên cùng của cửa sổ là: window.scrollY
.
Chúng ta có thể có được vị trí dưới cùng của cửa sổ bằng cách thêm chiều cao của cửa sổ vào vị trí trên cùng của nó:
var window_bottom_position = window.scrollY + window.innerHeight;
Cho phép tạo một chức năng đơn giản để có được vị trí hàng đầu của phần tử:
function getElementWindowTop(elem){
return elem && typeof elem.getBoundingClientRect === 'function' ? elem.getBoundingClientRect().top - document.body.getBoundingClientRect().top : 0;
}
Hàm này sẽ trả về vị trí trên cùng của phần tử trong cửa sổ hoặc nó sẽ trả về 0
nếu bạn chuyển cho nó một cái gì đó không phải là phần tử có.getBoundingClientRect()
phương thức. Phương pháp này đã có từ lâu, vì vậy bạn không cần phải lo lắng về việc trình duyệt của mình không hỗ trợ.
Bây giờ, vị trí hàng đầu của yếu tố của chúng tôi là:
var element_top_position = getElementWindowTop(element);
Và vị trí dưới cùng của phần tử là:
var element_bottom_position = element_top_position + element.clientHeight;
Bây giờ chúng ta có thể xác định xem phần tử có nằm trong chế độ xem hay không bằng cách kiểm tra xem vị trí dưới cùng của phần tử có thấp hơn vị trí trên cùng của chế độ xem hay không và bằng cách kiểm tra xem vị trí trên cùng của phần tử có cao hơn vị trí dưới cùng của chế độ xem không:
if(element_bottom_position >= window.scrollY
&& element_top_position <= window_bottom_position){
//element is in view
else
//element is not in view
Từ đó, bạn có thể thực hiện logic để thêm hoặc xóa in-view
lớp trên phần tử của mình, sau đó bạn có thể xử lý các hiệu ứng chuyển tiếp trong CSS của mình.
Tôi hoàn toàn ngạc nhiên khi tôi không tìm thấy giải pháp này ở bất kỳ nơi nào khác, nhưng tôi tin rằng đây là giải pháp sạch nhất và hiệu quả nhất và nó không yêu cầu bạn phải tải jQuery!