Saya telah meninjau dan menguji berbagai fungsi untuk mencegah kemampuan tubuh untuk menggulir saat berada di dalam div dan telah menggabungkan fungsi yang seharusnya berfungsi.
$('.scrollable').mouseenter(function() {
$('body').bind('mousewheel DOMMouseScroll', function() {
return false;
});
$(this).bind('mousewheel DOMMouseScroll', function() {
return true;
});
});
$('.scrollable').mouseleave(function() {
$('body').bind('mousewheel DOMMouseScroll', function() {
return true;
});
});
- Ini menghentikan semua pengguliran di mana karena saya ingin pengguliran masih dimungkinkan di dalam wadah
- Ini juga tidak menonaktifkan saat cuti mouse
Ada ide, atau cara yang lebih baik untuk melakukan ini?
jquery
mousewheel
RIK
sumber
sumber
Jawaban:
Pembaruan 2: Solusi saya didasarkan pada menonaktifkan pengguliran asli browser sama sekali (saat kursor berada di dalam DIV) dan kemudian secara manual menggulir DIV dengan JavaScript (dengan mengatur
.scrollTop
propertinya). Alternatif dan pendekatan IMO yang lebih baik adalah dengan hanya menonaktifkan scrolling browser secara selektif untuk mencegah scroll halaman, tetapi bukan scroll DIV. Lihat jawaban Rudie di bawah ini yang menunjukkan solusi ini.Ini dia:
Demo langsung: https://jsbin.com/howojuq/edit?js,output
Jadi Anda secara manual mengatur posisi gulir dan kemudian mencegah perilaku default (yang akan menggulir DIV atau seluruh halaman web).
Pembaruan 1: Seperti yang Chris catat dalam komentar di bawah, di versi jQuery yang lebih baru, informasi delta bersarang di dalam
.originalEvent
objek, yaitu jQuery tidak lagi mengeksposnya di objek Acara khusus dan kita harus mengambilnya dari objek Acara asli sebagai gantinya .sumber
-e.detail
, diuji di Firefox (Mac, Linux), Safari (Mac), dan Chromium (Linux)..detail
tidak sesuai dengan tanda.wheelData
(yang dimiliki Chrome / IE), jadi kita harus membalikkannya secara manual. Terima kasih telah memperbaiki jawaban saya.if( e.originalEvent ) e = e.originalEvent;
if ( $(this)[0].scrollHeight !== $(this).outerHeight() ) { //yourcode }
akan dijalankan hanya jika ada scrollbar.Jika Anda tidak peduli tentang kompatibilitas dengan versi IE yang lebih lama (<8), Anda dapat membuat plugin jQuery kustom dan kemudian memanggilnya pada elemen overflowing.
Solusi ini memiliki keunggulan dibandingkan yang diusulkan oleh Simime Vidas, karena tidak menimpa perilaku pengguliran - hanya memblokirnya jika diperlukan.
sumber
[Violation] Added non-passive event listener to a scroll-blocking 'mousewheel' event. Consider marking event handler as 'passive' to make the page more responsive.
Saya pikir terkadang acara mousescroll dapat dibatalkan: http://jsfiddle.net/rudiedirkx/F8qSq/show/
Di dalam event handler, Anda perlu mengetahui:
d = e.originalEvent.deltaY, dir = d < 0 ? 'up' : 'down'
karena angka positif berarti scrolling ke bawahscrollTop
untuk atas,scrollHeight - scrollTop - offsetHeight
untuk bawahJika kamu
top = 0
, ataubottom = 0
,batalkan acara:
e.preventDefault()
(dan bahkan mungkine.stopPropagation()
).Saya pikir lebih baik untuk tidak menimpa perilaku scrolling browser. Hanya batalkan jika memungkinkan.
Mungkin tidak benar-benar xbrowser, tetapi tidak terlalu sulit. Mungkin arah gulir ganda Mac itu rumit ...
sumber
Gunakan properti CSS di bawah ini
overscroll-behavior: contain;
untuk elemen anaksumber
lihat apakah ini membantu Anda:
demo: jsfiddle
edit:
coba ini:
sumber
Solusi yang tidak terlalu hacky, menurut saya adalah mengatur overflow yang tersembunyi di tubuh saat Anda mengarahkan mouse ke div yang dapat digulir. Ini akan mencegah badan dari menggulir, tetapi efek "melompat" yang tidak diinginkan akan terjadi. Solusi berikut mengatasi hal itu:
Anda dapat membuat kode Anda lebih pintar jika perlu. Misalnya, Anda dapat menguji apakah bodi sudah memiliki bantalan dan jika ya, tambahkan bantalan baru ke dalamnya.
sumber
Dalam solusi di atas ada sedikit kesalahan terkait Firefox. Dalam acara Firefox "DOMMouseScroll" tidak memiliki properti e.detail, untuk mendapatkan properti ini Anda harus menulis 'e.originalEvent.detail' berikut.
Berikut adalah solusi yang berfungsi untuk Firefox:
sumber
di sini solusi sederhana tanpa jQuery yang tidak merusak scroll asli browser (ini adalah: tidak ada scrolling buatan / jelek):
Demo langsung: http://jsfiddle.net/ibcaliax/bwmzfmq7/4/
sumber
Ini solusi yang saya gunakan dalam aplikasi.
Saya menonaktifkan body overflow dan menempatkan seluruh situs web html di dalam wadah div. Penampung situs web memiliki luapan sehingga pengguna dapat menggulir halaman seperti yang diharapkan.
Saya kemudian membuat div saudara (#Prevent) dengan indeks-z lebih tinggi yang mencakup seluruh situs web. Karena #Prevent memiliki indeks-z yang lebih tinggi, #Prevent tumpang tindih dengan penampung situs web. Saat #Prevent terlihat, mouse tidak lagi mengarahkan kursor ke penampung situs web, jadi pengguliran tidak dimungkinkan.
Anda tentu saja dapat menempatkan div lain, seperti modal Anda, dengan z-index yang lebih tinggi daripada #Prevent di markup. Ini memungkinkan Anda membuat jendela pop-up yang tidak mengalami masalah scrolling.
Solusi ini lebih baik karena tidak menyembunyikan scrollbar (efek lompatan). Itu tidak membutuhkan pendengar acara dan mudah diterapkan. Ia bekerja di semua browser, meskipun dengan IE7 & 8 Anda harus bermain-main (tergantung pada kode spesifik Anda).
html
css
jquery / js
nonaktifkan / aktifkan scroll
sumber
Saya perlu menambahkan acara ini ke beberapa elemen yang mungkin memiliki bilah gulir. Untuk kasus di mana tidak ada bilah gulir, bilah gulir utama tidak berfungsi sebagaimana mestinya. Jadi saya membuat sedikit perubahan pada kode @ Sime sebagai berikut:
Sekarang, hanya elemen dengan scrollbar yang akan mencegah scroll utama berhenti.
sumber
Versi javascript murni dari jawaban Vidas,
el$
adalah simpul DOM dari bidang yang Anda gulir.Pastikan Anda tidak memasang genap beberapa kali! Berikut ini contohnya,
Kata hati-hati , fungsi harus ada konstanta, jika Anda menginisialisasi ulang fungsi setiap kali sebelum melampirkannya, yaitu.
var func = function (...)
yangremoveEventListener
tidak akan bekerja.sumber
Anda dapat melakukan ini tanpa JavaScript. Anda dapat menyetel gaya pada kedua div menjadi
position: fixed
danoverflow-y: auto
. Anda mungkin perlu membuat salah satunya lebih tinggi dari yang lain dengan menyetelnyaz-index
(jika tumpang tindih).Berikut adalah contoh dasar di CodePen .
sumber
Berikut adalah plugin yang berguna untuk mencegah pengguliran induk saat menggulir div tertentu dan memiliki banyak opsi untuk dimainkan.
Lihat disini:
https://github.com/MohammadYounes/jquery-scrollLock
Pemakaian
Memicu Scroll Lock melalui JavaScript:
Memicu Scroll Lock melalui Markup:
Lihat Demo
sumber
hanya menawarkan ini sebagai solusi yang mungkin jika menurut Anda pengguna tidak akan memiliki pengalaman negatif pada perubahan yang jelas. Saya hanya mengubah kelas overflow tubuh menjadi tersembunyi ketika mouse berada di atas div target; lalu saya mengubah div tubuh menjadi luapan tersembunyi saat mouse pergi.
Secara pribadi saya tidak berpikir itu terlihat buruk, kode saya dapat menggunakan toggle untuk membuatnya lebih bersih, dan ada manfaat yang jelas untuk membuat efek ini mungkin terjadi tanpa pengguna menyadarinya. Jadi ini mungkin jawaban terakhir yang hackish-last-resort.
sumber