Korzystając z jQuery, chciałbym wyłączyć przewijanie treści:
Mój pomysł to:
- Zestaw
body{ overflow: hidden;}
- Uchwyć prąd
scrollTop();/scrollLeft()
- Powiązanie ze zdarzeniem body scroll, ustaw scrollTop / scrollLeft na przechwyconą wartość.
Czy jest lepszy sposób?
Aktualizacja:
Proszę zobaczyć mój przykład i powód, dla którego jest to http://jsbin.com/ikuma4/2/edit
Wiem, że ktoś pomyśli „dlaczego nie używa po prostu position: fixed
na panelu?”.
Nie sugeruj tego, bo mam inne powody.
Odpowiedzi:
Jedyny sposób, w jaki to zrobiłem, jest podobny do tego, co opisałeś:
Następnie, gdy będziesz gotowy, aby ponownie zezwolić na przewijanie, cofnij to wszystko.
Edycja: nie ma powodu, dla którego nie mogę podać kodu, ponieważ zadałem sobie trud, aby go wykopać ...
źródło
auto
, zostanie ono nadpisane. Musiałem zachować istniejące ustawienie, więc to również zwiększa koszty.html
i zabody
pomocąoverflow: hidden
jest niewystarczające? Nadal potrzebujemy obsługi zdarzeń.Spowoduje to całkowite wyłączenie przewijania:
Przywrócić:
Przetestowałem to na Firefoksie i Chrome.
źródło
height: 100%
efektywnie blokuje przewijanie w aktualnej pozycji bez skakania - przynajmniej na najnowszym Chrome.Spróbuj tego
źródło
$('#element').off('scroll touchmove mousewheel');
body
przewijanie, a jednocześnie zezwolić na przewijanie w obrębie innych elementów podrzędnych, które mająoverflow: scroll
?Podaję tylko małe dostrojenie rozwiązania przez tfe . W szczególności dodałem dodatkową kontrolę, aby upewnić się, że nie ma przesunięcia zawartości strony (czyli przesunięcia strony ), gdy pasek przewijania jest ustawiony na
hidden
.Dwie funkcje JavaScript
lockScroll()
iunlockScroll()
można zdefiniować odpowiednio, aby zablokować i odblokować przewijanie strony.gdzie założyłem, że
<body>
nie ma początkowego depozytu zabezpieczającego.Zauważ, że chociaż powyższe rozwiązanie działa w większości praktycznych przypadków, nie jest ostateczne, ponieważ wymaga dalszego dostosowania dla stron, które zawierają na przykład nagłówek z
position:fixed
. Przejdźmy do tego szczególnego przypadku z przykładem. Przypuśćmy, że takz
Następnie należałoby dodać następujących funkcji
lockScroll()
orazunlockScroll()
:Na koniec zwróć uwagę na możliwą wartość początkową marginesów lub wypełnień.
źródło
marginRight
imarginLeft
:)możesz użyć tego kodu:
źródło
Aby wyłączyć przewijanie, spróbuj tego:
zresetować:
źródło
Napisałem wtyczkę jQuery do obsługi tego: $ .disablescroll .
Zapobiega przewijaniu w przypadku zdarzeń związanych z kółkiem myszy, ruchem dotykowym i naciśnięciem klawisza, takich jak Page Down.
Tutaj jest demo .
Stosowanie:
źródło
Możesz dołączyć funkcję do przewijania zdarzeń i zapobiegania jej domyślnemu zachowaniu.
https://jsfiddle.net/22cLw9em/
źródło
Jedna linijka wyłączająca przewijanie, w tym środkowy przycisk myszy.
edycja : i tak nie ma potrzeby korzystania z jQuery, poniżej to samo co powyżej w waniliowym JS (to znaczy bez frameworków, tylko JavaScript):
this.documentElement.scrollTop - standard
this.body.scrollTop - zgodność z IE
źródło
$("body").css("overflow", "hidden");
$("body").css("overflow", "initial");
źródło
Nie możesz po prostu ustawić wysokości ciała na 100% i ukryć przelewu? Zobacz http://jsbin.com/ikuma4/13/edit
źródło
Ktoś wysłał ten kod, który ma problem z nie zachowaniem pozycji przewijania po przywróceniu. Powodem jest to, że ludzie zwykle stosują go do html i body lub tylko do body, ale powinien być stosowany tylko do html. W ten sposób po przywróceniu pozycja przewijania zostanie zachowana:
Przywrócić:
źródło
'overflow': 'auto',
używać'overflow': 'initial',
Może to działać lub nie do Twoich celów, ale możesz rozszerzyć jScrollPane, aby uruchomić inne funkcje, zanim wykona przewijanie. Tylko trochę to przetestowałem, ale mogę potwierdzić, że możesz wskoczyć i całkowicie zapobiec przewijaniu. Wszystko co zrobiłem to:
<script type="text/javascript" src="script/jquery.jscrollpane.js"></script>
positionDragY(destY, animate)
funkcjiUruchom events.html, a zobaczysz normalnie przewijane okienko, które z powodu interwencji w kodowanie nie będzie się przewijać.
W ten sposób możesz kontrolować wszystkie paski przewijania przeglądarki (patrz fullpage_scroll.html).
Więc prawdopodobnie następnym krokiem jest dodanie wywołania do innej funkcji, która uruchamia się i wykonuje magię zakotwiczenia, a następnie decyduje, czy kontynuować przewijanie, czy nie. Masz również wywołania API do ustawiania scrollTop i scrollLeft.
Jeśli chcesz uzyskać więcej pomocy, napisz, do czego zmierzasz!
Mam nadzieję, że to pomogło.
źródło
Tutaj umieściłem odpowiedź, która może pomóc: jQuery simplemodal wyłącz przewijanie
Pokazuje, jak wyłączyć paski przewijania bez przesuwania tekstu. Możesz zignorować fragmenty dotyczące simplemodal.
źródło
Jeśli chcesz tylko wyłączyć przewijanie za pomocą nawigacji za pomocą klawiatury, możesz zastąpić zdarzenie keydown.
źródło
Wypróbuj ten kod:
źródło
Możesz zakryć okno przewijalnym elementem div, aby zapobiec przewijaniu zawartości strony. A ukrywając i pokazując, możesz zablokować / odblokować zwój.
Zrób coś takiego:
źródło
Dla osób, które mają wyśrodkowane układy (przez
margin:0 auto;
), oto połączenieposition:fixed
rozwiązania wraz z proponowanym rozwiązaniem @tfe .Skorzystaj z tego rozwiązania, jeśli występuje przyciąganie stron (ze względu na wyświetlanie / ukrywanie paska przewijania).
…w połączeniu z…
… I wreszcie CSS dla
.modal-noscroll
…Zaryzykowałbym stwierdzenie, że jest to bardziej właściwe rozwiązanie niż jakiekolwiek inne dostępne rozwiązania, ale nie przetestowałem go jeszcze tak dokładnie…: P
Edycja: pamiętaj, że nie mam pojęcia, jak źle może to działać (czytaj: wysadzić) na urządzeniu dotykowym.
źródło
Możesz także użyć do tego DOM. Powiedzmy, że masz funkcję, którą nazywasz w ten sposób:
I to wszystko! Mam nadzieję, że to pomoże oprócz wszystkich innych odpowiedzi!
źródło
Oto, co ostatecznie zrobiłem:
CoffeeScript:
JavaScript:
źródło
Nie jestem pewien, czy ktoś wypróbował moje rozwiązanie. Ten działa na całym body / html, ale bez wątpienia można go zastosować do dowolnego elementu, który uruchamia zdarzenie przewijania.
Po prostu włącz i wyłącz scrollLock, jeśli potrzebujesz.
Oto przykład JSFiddle
Mam nadzieję, że ten komuś pomoże.
źródło
Myślę, że najlepszym i czystym rozwiązaniem jest:
A z jQuery:
Ten detektor zdarzeń powinien blokować przewijanie. Po prostu je usuń, aby ponownie włączyć przewijanie
źródło