Ada lebih dari 30 jawaban untuk pertanyaan ini, dan tidak satupun dari mereka menggunakan solusi JS murni yang sangat sederhana yang telah saya gunakan. Tidak perlu memuat jQuery hanya untuk menyelesaikan ini, karena banyak yang mendorong.
Untuk mengetahui apakah elemen tersebut berada dalam viewport, pertama-tama kita harus menentukan posisi elemen dalam tubuh. Kita tidak perlu melakukan ini secara rekursif seperti yang pernah saya pikirkan. Sebagai gantinya, kita bisa menggunakan element.getBoundingClientRect()
.
pos = elem.getBoundingClientRect().top - document.body.getBoundingClientRect().top;
Nilai ini adalah perbedaan Y antara bagian atas objek dan bagian atas tubuh.
Kami kemudian harus memberi tahu apakah elemen tersebut dalam tampilan. Sebagian besar implementasi bertanya apakah elemen lengkap berada dalam viewport, jadi inilah yang akan kita bahas.
Pertama-tama, posisi atas jendela adalah: window.scrollY
.
Kita bisa mendapatkan posisi bawah jendela dengan menambahkan ketinggian jendela ke posisi atasnya:
var window_bottom_position = window.scrollY + window.innerHeight;
Mari kita membuat fungsi sederhana untuk mendapatkan posisi teratas elemen:
function getElementWindowTop(elem){
return elem && typeof elem.getBoundingClientRect === 'function' ? elem.getBoundingClientRect().top - document.body.getBoundingClientRect().top : 0;
}
Fungsi ini akan mengembalikan posisi teratas elemen dalam jendela atau akan kembali 0
jika Anda memberikan sesuatu selain elemen dengan .getBoundingClientRect()
metode. Metode ini sudah ada sejak lama, jadi Anda tidak perlu khawatir browser Anda tidak mendukungnya.
Sekarang, posisi teratas elemen kami adalah:
var element_top_position = getElementWindowTop(element);
Dan posisi dasar elemen adalah:
var element_bottom_position = element_top_position + element.clientHeight;
Sekarang kita dapat menentukan apakah elemen tersebut dalam viewport dengan memeriksa apakah posisi bawah elemen lebih rendah dari posisi atas viewport dan dengan memeriksa apakah posisi teratas elemen lebih tinggi dari posisi bawah viewport:
if(element_bottom_position >= window.scrollY
&& element_top_position <= window_bottom_position){
//element is in view
else
//element is not in view
Dari sana, Anda dapat melakukan logika untuk menambah atau menghapus in-view
kelas pada elemen Anda, yang kemudian dapat Anda tangani dengan efek transisi di CSS Anda.
Saya benar-benar kagum bahwa saya tidak menemukan solusi ini di tempat lain, tetapi saya percaya bahwa ini adalah solusi paling bersih dan paling efektif, dan itu tidak mengharuskan Anda memuat jQuery!