Scrollend, peristiwa JavaScript baru

Hapus fungsi waktu tunggu dan hilangkan bug-nya, berikut peristiwa yang benar-benar Anda perlukan: scrollend.

Sebelum peristiwa scrollend, tidak ada cara yang andal untuk mendeteksi bahwa scroll telah selesai. Artinya, peristiwa akan diaktifkan terlambat atau saat jari pengguna masih berada di layar. Ketidakpastian dalam mengetahui kapan scroll benar-benar berakhir, menyebabkan bug dan pengalaman yang buruk bagi pengguna.

Sebelum
document.onscroll = event => {
  clearTimeout(window.scrollEndTimer)
  window.scrollEndTimer = setTimeout(callback, 100)
}

Hal terbaik yang dapat dilakukan strategi setTimeout() ini adalah mengetahui apakah scroll telah berhenti untuk 100ms. Hal ini membuatnya lebih seperti peristiwa scroll telah dijeda, bukan peristiwa scroll telah berakhir.

Setelah peristiwa scrollend, browser akan melakukan semua evaluasi yang sulit ini untuk Anda.

Setelah
document.onscrollend = event => {…}

Ini baru barang bagus. Waktunya tepat dan penuh dengan kondisi yang bermakna sebelum memunculkan.

Browser Support

  • Chrome: 114.
  • Edge: 114.
  • Firefox: 109.
  • Safari: 26.2.

Source

Cobalah!

Detail acara

Peristiwa scrollend diaktifkan saat: - Browser tidak lagi menganimasikan atau menerjemahkan scroll. - Sentuhan pengguna telah dilepaskan. - Penunjuk pengguna telah melepaskan thumb scroll. - Penekanan tombol pengguna telah dilepaskan. - Scroll ke fragmen telah selesai. - Pengepasan posisi scroll telah selesai. - scrollTo() telah selesai. - Pengguna telah men-scroll area pandang visual.

Peristiwa scrollend tidak diaktifkan saat: - Gestur pengguna tidak menghasilkan perubahan posisi scroll (tidak terjadi terjemahan). - scrollTo() tidak menghasilkan terjemahan apa pun.

Alasan peristiwa ini membutuhkan waktu lama untuk hadir di platform web adalah karena banyaknya detail kecil yang memerlukan detail spesifikasi. Salah satu area yang paling kompleks adalah mengartikulasikan detail scrollend untuk Area Pandang Visual versus dokumen. Pertimbangkan halaman yang Anda perbesar. Anda dapat men-scroll saat dalam status diperbesar ini, dan tindakan ini tidak selalu men-scroll dokumen. Yakinlah bahwa interaksi scroll yang didorong oleh pengguna area pandang visual ini pun akan memunculkan peristiwa scrollend setelah selesai.

Menggunakan peristiwa

Seperti peristiwa scroll lainnya, Anda dapat mendaftarkan pemroses dengan beberapa cara.

addEventListener("scrollend",> (event) = {
  // scroll ended
});

aScrollingElement.addEventListener("scroll>end", (event) = {
  // scroll ended
});

atau, gunakan properti peristiwa:

document.onscrollend = (event) => {
  // scroll ended
};

aScrollingElement.onscrollend = (event) => {
  // scroll ended
};

Polyfill dan progressive enhancement

Jika Anda ingin menggunakan peristiwa baru ini sekarang, berikut saran terbaik kami. Anda dapat terus menggunakan strategi akhir scroll saat ini (jika ada) dan di awal, periksa dukungan dengan:

'onscrollend' in window
// true, if available

Tindakan ini akan melaporkan benar atau salah, bergantung pada apakah browser menawarkan peristiwa tersebut. Dengan pemeriksaan ini, Anda dapat membuat cabang kode:

if ('onscrollend' in window) {
  document.onscrollend = callback
}
else {
  document.onscroll => event = {
    clearTimeout(window.scrollEndTimer)
    window.scrollEndTimer = setTimeout(callback, 100)
  }
}

Ini adalah awal yang baik untuk meningkatkan kualitas peristiwa scrollend secara progresif saat tersedia. Anda juga dapat mencoba polyfill (NPM) yang saya buat yang melakukan hal terbaik yang dapat dilakukan browser:

import {scrollend} from "scrollyfills"

// then use scrollend as if it's existed this whole time
document.onscrollend = callback

Polyfill akan ditingkatkan secara progresif untuk menggunakan peristiwa scrollend bawaan browser jika tersedia. Jika tidak tersedia, skrip akan memantau peristiwa pointer dan scroll untuk melakukan estimasi terbaik terkait peristiwa yang mengakhirinya.

Kasus penggunaan

Sebaiknya hindari pekerjaan yang berat secara komputasi saat men-scroll. Praktik ini memastikan scroll bebas menggunakan memori dan pemrosesan sebanyak mungkin untuk menjaga pengalaman tetap lancar. Menggunakan peristiwa scrollend memberikan waktu yang tepat untuk memanggil dan melakukan pekerjaan berat, karena scroll tidak lagi terjadi.

Peristiwa scrollend dapat digunakan untuk memicu berbagai tindakan. Kasus penggunaan yang umum adalah menyinkronkan elemen UI terkait dengan posisi scroll yang berhenti. Misalnya: - Menyinkronkan posisi scroll carousel dengan indikator titik. - Menyinkronkan item galeri dengan metadatanya. - Mengambil data setelah pengguna men-scroll ke tab baru.

Bayangkan skenario seperti pengguna menggeser email. Setelah mereka selesai menggeser, Anda dapat melakukan tindakan berdasarkan tempat mereka men-scroll.

Anda juga dapat menggunakan peristiwa ini untuk menyinkronkan setelah scroll terprogram atau pengguna, atau tindakan seperti analisis logging.

Berikut adalah contoh yang baik saat beberapa elemen seperti panah, titik, dan fokus, perlu diperbarui berdasarkan posisi scroll. Tonton cara saya membuat carousel ini di YouTube. Selain itu, coba demo langsung.

Terima kasih kepada Mehdi Kazemi atas pekerjaan engineering-nya dalam hal ini dan Robert Flack atas panduan API dan implementasinya.