Saya sedang mengerjakan aplikasi web berbasis iPad, dan perlu mencegah overscrolling sehingga tidak terlihat seperti halaman web. Saat ini saya menggunakan ini untuk membekukan viewport dan menonaktifkan overscroll:
document.body.addEventListener('touchmove',function(e){
e.preventDefault();
});
Ini berfungsi dengan baik untuk menonaktifkan overscroll tetapi aplikasi saya memiliki beberapa div yang dapat digulir, dan kode di atas mencegahnya menggulir .
Saya hanya menargetkan iOS 5 dan yang lebih baru jadi saya telah menghindari solusi peretasan seperti iScroll. Sebagai gantinya saya menggunakan CSS ini untuk div saya yang dapat digulir:
.scrollable {
-webkit-overflow-scrolling: touch;
overflow-y:auto;
}
Ini berfungsi tanpa skrip overscroll dokumen, tetapi tidak menyelesaikan masalah pengguliran div.
Tanpa plugin jQuery, apakah ada cara untuk menggunakan perbaikan overscroll tetapi mengecualikan div $ ('. Scrollable') saya?
EDIT:
Saya menemukan sesuatu yang merupakan solusi yang layak:
// Disable overscroll / viewport moving on everything but scrollable divs
$('body').on('touchmove', function (e) {
if (!$('.scrollable').has($(e.target)).length) e.preventDefault();
});
Area pandang masih bergerak saat Anda menggulir melewati awal atau akhir div. Saya ingin menemukan cara untuk menonaktifkannya juga.
Jawaban:
Ini menyelesaikan masalah saat Anda menggulir melewati awal atau akhir div
Perhatikan bahwa ini tidak akan berfungsi jika Anda ingin memblokir seluruh pengguliran halaman saat div tidak memiliki overflow. Untuk memblokirnya, gunakan event handler berikut, bukan yang langsung di atas (diadaptasi dari pertanyaan ini ):
sumber
.scrollable
secara langsung (yang awalnya saya coba dalam memecahkan masalah ini). Jika Anda seorang pemula JavaScript dan ingin kode mudah untuk menghapus penangan ini di suatu tempat, kedua baris ini bekerja dengan baik untuk saya!$(document).off('touchmove');
DAN$('body').off('touchmove touchstart', '.scrollable');
Menggunakan jawaban Tyler Dodge yang luar biasa terus tertinggal di iPad saya, jadi saya menambahkan beberapa kode pelambatan, sekarang cukup lancar. Terkadang ada sedikit lompatan saat menggulir.
Selain itu, menambahkan CSS berikut memperbaiki beberapa gangguan rendering ( sumber ):
sumber
Pertama-tama, cegah tindakan default di seluruh dokumen Anda seperti biasa:
Kemudian hentikan penyebaran elemen kelas Anda ke tingkat dokumen. Ini menghentikannya mencapai fungsi di atas dan dengan demikian e.preventDefault () tidak dimulai:
Sistem ini tampaknya lebih alami dan kurang intensif daripada menghitung kelas pada semua gerakan sentuh. Gunakan .on () daripada .bind () untuk elemen yang dibuat secara dinamis.
Juga pertimbangkan tag meta berikut untuk mencegah terjadinya hal-hal yang tidak menguntungkan saat menggunakan div yang dapat digulir:
sumber
Bisakah Anda menambahkan sedikit lebih banyak logika ke kode penonaktifan overscroll Anda untuk memastikan elemen yang ditargetkan bukan salah satu yang ingin Anda scroll? Sesuatu seperti ini:
sumber
Solusi terbaik untuk ini adalah css / html: Buat div untuk membungkus elemen Anda, jika Anda belum memilikinya Dan setel ke posisi tetap dan luapan tersembunyi. Opsional, atur tinggi dan lebar menjadi 100% jika Anda ingin memenuhi seluruh layar dan tidak lain adalah seluruh layar
sumber
Periksa apakah elemen yang dapat digulir sudah digulir ke atas saat mencoba untuk menggulir ke atas atau ke bawah saat mencoba untuk menggulir ke bawah dan kemudian mencegah tindakan default untuk menghentikan seluruh halaman agar tidak bergerak.
sumber
Saya sedang mencari cara untuk mencegah semua tubuh menggulir saat ada popup dengan area yang dapat digulir (pop-down "keranjang belanja" yang memiliki tampilan keranjang Anda yang dapat digulir).
Saya menulis solusi yang jauh lebih elegan dengan menggunakan javascript minimal untuk hanya mengaktifkan kelas "noscroll" di tubuh Anda ketika Anda memiliki popup atau div yang ingin Anda gulir (dan tidak "menggulung" seluruh badan halaman).
sementara browser desktop mengamati overflow: hidden - iOS tampaknya mengabaikannya kecuali Anda menyetel posisinya ke tetap ... yang menyebabkan seluruh halaman menjadi lebar aneh, jadi Anda juga harus menyetel posisi dan lebar secara manual. gunakan css ini:
dan jquery ini:
sumber
Saya telah bekerja sedikit tanpa jquery. Tidak sempurna tetapi berfungsi dengan baik (terutama jika Anda memiliki scroll-x di scoll-y) https://github.com/pinadesign/overscroll/
Bebas untuk berpartisipasi dan meningkatkannya
sumber
Solusi ini tidak mengharuskan Anda untuk menempatkan kelas yang dapat digulir pada semua div yang dapat digulir, jadi lebih umum. Pengguliran diperbolehkan pada semua elemen yang merupakan, atau merupakan turunan dari, elemen INPUT yang dapat diedit konten dan pengguliran tambahan atau otomatis.
Saya menggunakan pemilih khusus dan saya juga menyimpan hasil pemeriksaan di elemen untuk meningkatkan kinerja. Tidak perlu memeriksa elemen yang sama setiap saat. Ini mungkin memiliki beberapa masalah karena baru saja ditulis tetapi saya pikir akan saya bagikan.
sumber
Meskipun menonaktifkan semua acara "touchmove" mungkin tampak seperti ide yang bagus, segera setelah Anda membutuhkan elemen lain yang dapat digulir pada halaman itu akan menimbulkan masalah. Selain itu, jika Anda hanya menonaktifkan peristiwa "touchmove" pada elemen tertentu (mis. Body jika Anda ingin halaman tidak dapat digulir), segera setelah diaktifkan di tempat lain, IOS akan menyebabkan penyebaran yang tidak dapat dihentikan di Chrome saat URL matikan bar.
Meskipun saya tidak dapat menjelaskan perilaku ini, sepertinya satu-satunya cara untuk mencegah tampaknya mengatur posisi tubuh
fixed
. Satu-satunya masalah yang dilakukan adalah Anda akan kehilangan posisi dokumen - hal ini sangat mengganggu pada modals misalnya. Salah satu cara untuk mengatasinya adalah dengan menggunakan fungsi VanillaJS sederhana ini:Dengan menggunakan solusi ini, Anda dapat memiliki dokumen tetap dan elemen lain di halaman Anda dapat melimpah dengan menggunakan CSS sederhana (misalnya,
overflow: scroll;
). Tidak perlu kelas khusus atau apa pun.sumber
Inilah solusi yang kompatibel dengan zepto
sumber
yang ini berfungsi untuk saya (javascript biasa)
html:
sumber
Coba ini Ini akan bekerja dengan sempurna.
sumber
Saya memiliki keberuntungan yang mengejutkan dengan sederhana:
Ini berfungsi dengan baik untuk menonaktifkan overscroll untuk pop-up atau menu dan tidak memaksa bilah browser untuk muncul seperti saat menggunakan posisi: tetap. TAPI - Anda perlu menyimpan posisi gulir sebelum mengatur ketinggian tetap dan mengembalikannya saat menyembunyikan pop-up, jika tidak, browser akan menggulir ke atas.
sumber