Próbuję wyłączyć pasek przewijania html / body rodzica, gdy korzystam z lightbox. Głównym słowem tutaj jest „ wyłącz” . Ja nie chce go ukryć overflow: hidden;
.
Powodem tego jest to, overflow: hidden
że strona przeskakuje i zajmuje obszar, w którym znajdował się zwój.
Chcę wiedzieć, czy można wyłączyć pasek przewijania, wciąż go wyświetlając.
javascript
jquery
html
css
Dejan.S
źródło
źródło
Odpowiedzi:
Jeśli stronę pod nakładką można „naprawić” u góry, po otwarciu nakładki można ustawić
powinieneś nadal widzieć prawy pasek przewijania, ale zawartość nie jest przewijana. Po zamknięciu nakładki po prostu przywróć te właściwości za pomocą
Właśnie zaproponowałem ten sposób tylko dlatego, że nie trzeba zmieniać żadnego zdarzenia przewijania
Aktualizacja
Możesz także wprowadzić niewielką poprawę: jeśli uzyskasz
document.documentElement.scrollTop
właściwość za pomocą javascript tuż przed otwarciem warstwy, możesz dynamicznie przypisać tę wartość jakotop
właściwość elementu body: dzięki takiemu podejściu strona pozostanie na swoim miejscu, bez względu na to, czy „ ponownie na górze lub jeśli już przewinąłeś.Css
JS
źródło
$('body').css('top', -($('body').scrollTop()) + 'px').addClass('noscroll');
Cztery małe dodatki do wybranego rozwiązania:
Kompletne rozwiązanie, które wydaje się działać w większości przeglądarek:
CSS
Wyłącz przewijanie
Włącz przewijanie
Dzięki Fabrizio i Dejanowi za postawienie mnie na właściwej drodze, a Brodingo za rozwiązanie podwójnego paska przewijania
źródło
afterLoad()
iafterClose
wywołań zwrotnych. Może być przydatny dla innych osób szukających tego pytania.scrollTop
tak że wiersz 2 kodu „Wyłącz przewijanie” może być wyrażony jako$( window ).scrollTop()
.if (scrollTop < 0) { scrollTop = 0; }
. Oto pełny kod wyłączający gist.github.com/jayd3e/2eefbbc571cd1668544b .Z dołączonym jQuery:
wyłączyć
włączyć
stosowanie
źródło
Jestem OP
Dzięki pomocy fcalderan udało mi się stworzyć rozwiązanie. Zostawiam tutaj moje rozwiązanie, ponieważ zapewnia przejrzystość sposobu jego używania i dodaje bardzo ważny szczegół,
width: 100%;
Dodaję tę klasę
to działało dla mnie i korzystałem z Fancyapp.
źródło
To działało naprawdę dobrze dla mnie ....
po prostu owiń te dwa wiersze kodu tym, co decyduje o tym, kiedy zamierzasz zablokować przewijanie.
na przykład
źródło
Nie można wyłączyć zdarzenia przewijania, ale można wyłączyć powiązane akcje prowadzące do przewijania, takie jak kółko myszy i ruch dotykowy:
źródło
Możesz ukryć pasek przewijania ciała za pomocą
overflow: hidden
i jednocześnie ustawić margines, aby zawartość nie przeskakiwała:Następnie możesz dodać wyłączony pasek przewijania do strony, aby wypełnić lukę:
Zrobiłem dokładnie to dla mojej własnej implementacji lightbox. Wygląda na to, że do tej pory działał dobrze.
źródło
To jest rozwiązanie, z którym poszliśmy. Po prostu zapisz pozycję przewijania po otwarciu nakładki, przewiń z powrotem do zapisanej pozycji za każdym razem, gdy użytkownik spróbuje przewinąć stronę, i wyłącz słuchacza po zamknięciu nakładki.
W IE jest nieco przesadzony, ale działa jak urok w Firefox / Chrome.
źródło
z-index
wśród.overlay-shown
być większa niż ustalone cel. (Mam ten kod działający w trakcie produkcji na stronie ze stałym nagłówkiem i działa dobrze.)body
znacznika. Wczoraj eksperymentowałem z twoim kodem i mam stały nagłówek na górze mojej strony. Jeśli obsłużę przewijanie za pomocąbody
znacznika, pasek przewijania będzie pod stałym nagłówkiem.$("body")
używamy$(window)
. I zamiastz-index: -1
nakładki, aby ją ukryć, możesz użyćvisibility: hidden
lub podobnej. Zobacz jsfiddle.net/8p2gfeha, aby szybko sprawdzić, czy działa. Naprawiony nagłówek nie pojawia się już na pasku przewijania. W końcu postaram się włączyć te zmiany do odpowiedzi.Miałem podobny problem: menu po lewej stronie, które, gdy się pojawi, zapobiega przewijaniu. Gdy tylko wysokość została ustawiona na 100vh, pasek przewijania zniknął, a zawartość szarpnęła w prawo.
Jeśli więc nie przeszkadza ci pozostawienie włączonego paska przewijania (ale ustawienie okna na pełną wysokość, aby nigdzie się nie przewijało), inną możliwością jest ustawienie małego dolnego marginesu, który będzie wyświetlał paski przewijania:
źródło
overflow:hidden
zapobiega wpływowi marginesu?możesz zachować przepełnienie: ukryty, ale ręcznie zarządzać pozycją przewijania:
przed pokazaniem zachowaj ślad aktualnej pozycji przewijania:
powinno działać
źródło
Surowym, ale działającym sposobem będzie wymuszenie przewijania z powrotem na górę, a tym samym skuteczne wyłączenie przewijania:
Po otwarciu lightbox podnieś flagę, a podczas zamykania opuść flagę.
Przypadek testowy na żywo .
źródło
Lubię trzymać się metody „przepełnienie: ukryty” i po prostu dodać dopełnienie, które jest równe szerokości paska przewijania.
Uzyskaj funkcję szerokości paska przewijania, LostSource .
Podczas wyświetlania nakładki dodaj klasę „noscroll” do html i dodaj padding-right do body:
Podczas ukrywania usuń klasę i dopełnienie:
Styl noscroll jest taki:
Zauważ, że jeśli masz jakieś elementy z pozycją: naprawiono, musisz również dodać dopełnienie do tych elementów.
źródło
<div id="lightbox">
znajduje się w<body>
elemencie, więc przewijając lightbox, przewijasz również ciało. Rozwiązaniem jest nie przedłużanie<body>
elementu o ponad 100%, umieszczenie długiej zawartości wewnątrz innegodiv
elementu i dodanie paska przewijania, jeśli to konieczne, do tegodiv
elementu za pomocąoverflow: auto
.Teraz przewijanie lightbox (i
body
również) nie ma żadnego efektu, ponieważ ciało nie jest dłuższe niż 100% wysokości ekranu.źródło
Wszystkie systemy oparte na javascript modal / lightbox używają przepełnienia podczas wyświetlania modal / lightbox, na tagu HTML lub tagu body.
Gdy lightbox jest pokazany, js wypycha przepełnienie ukryte na html lub tagu body. Gdy lightbox jest ukryty, niektóre usuwają ukryte, inne wypychają automatyczne przelewanie na HTML lub tagu treści.
Programiści pracujący na komputerach Mac nie widzą problemu z paskiem przewijania.
Wystarczy zastąpić ukryty przez rozbrojenie, aby zawartość nie ślizgała się pod modą usunięcia paska przewijania.
Lightbox otwarty / pokaż:
Lightbox zamknij / ukryj:
źródło
Jeśli stronę pod nakładką można „naprawić” u góry, po otwarciu nakładki można ustawić
podaj tę klasę do przewijalnego ciała, powinieneś nadal widzieć prawy pasek przewijania, ale zawartość nie jest przewijana.
Aby zachować pozycję strony, zrób to w jquery
Po zamknięciu nakładki po prostu przywróć te właściwości za pomocą
Właśnie zaproponowałem ten sposób tylko dlatego, że nie trzeba zmieniać żadnego zdarzenia przewijania
źródło
CSS
JS
Teraz wystarczy wywołać funkcje
źródło
Możesz to zrobić za pomocą Javascript:
A następnie wyłącz go, gdy twój lightbox jest zamknięty.
Ale jeśli Twój lightbox zawiera pasek przewijania, nie będziesz mógł przewijać, gdy jest otwarty. To dlatego, że
window
zawiera zarównobody
i#lightbox
. Musisz więc użyć architektury takiej jak ta:A następnie zastosuj
onscroll
wydarzenie tylko w dniu#global
.źródło