Bootstrap modal
automatycznie dodaje klasę modal-open
do ciała, gdy wyświetlane jest modalne okno dialogowe, i usuwa je, gdy okno dialogowe jest ukryte. Dlatego możesz dodać następujące elementy do swojego CSS:
body.modal-open {
overflow: hidden;
}
Można argumentować, że powyższy kod należy do bazy kodu Bootstrap CSS, ale jest to łatwa poprawka, aby dodać go do swojej witryny.
Aktualizacja 8 lutego 2013 r.
To przestało działać w programie Bootstrap w wersji 2.3.0 Twittera - nie dodają już modal-open
klasy do ciała.
Obejściem tego problemu byłoby dodanie klasy do ciała, gdy modal ma zostać pokazany, i usunięcie go, gdy modal jest zamknięty:
$("#myModal").on("show", function () {
$("body").addClass("modal-open");
}).on("hidden", function () {
$("body").removeClass("modal-open")
});
Aktualizacja 11 marca 2013
Wygląda na to, że modal-open
klasa powróci w Bootstrap 3.0, jawnie w celu zapobieżenia przewijaniu:
Ponownie wprowadza .modal-open na ciele (dzięki czemu możemy nuke tam przewijać)
Zobacz: https://github.com/twitter/bootstrap/pull/6342 - spójrz na sekcję modalną .
modal-open
powróci w Bootstrap 3, więc po uruchomieniu powinno być bezpiecznie usunąć powyższy kod.Akceptowana odpowiedź nie działa na urządzeniach mobilnych (przynajmniej iOS 7 z Safari 7) i nie chcę, aby MOAR JavaScript działał na mojej stronie, gdy CSS to zrobi.
Ten CSS zapobiegnie przewijaniu strony w tle pod modalem:
Jednak ma również niewielki efekt uboczny polegający na przewijaniu do góry.
position:absolute
rozwiązuje to, ale ponownie wprowadza możliwość przewijania na telefonie komórkowym.Jeśli znasz swoją rzutnię ( moja wtyczka do dodawania rzutni do
<body>
), możesz po prostu dodać przełącznik css dlaposition
.Dodam to również, aby zapobiec przeskakiwaniu strony leżącej w lewo / w prawo podczas pokazywania / ukrywania modali.
ta odpowiedź jest postem x.
źródło
position: fixed
ciała.Po prostu ukryj przepełnienie ciała, aby nie przewijało się ono. Gdy ukryjesz modal, przywróć go do automatycznego.
Oto kod:
źródło
Możesz spróbować ustawić rozmiar ciała na rozmiar okna z przepełnieniem: ukryty, gdy modal jest otwarty
źródło
Musisz wyjść poza odpowiedź @ charlietfl i wziąć pod uwagę paski przewijania, w przeciwnym razie możesz zobaczyć przepływ dokumentów.
Otwarcie modalu:
body
szerokośćbody
przepełnienie nahidden
Jawnie ustaw szerokość ciała na wartość z kroku 1.
Zamknięcie modalu:
body
przepełnienie naauto
Ustaw
body
szerokość naauto
Inspirowany przez: http://jdsharp.us/jQuery/minute/calculate-scrollbar-width.php
źródło
$body.css("overflow", "auto");
ostatni krok :)Ostrzeżenie: poniższa opcja nie dotyczy Bootstrap v3.0.x, ponieważ przewijanie w tych wersjach zostało wyraźnie ograniczone do samego modalu. Jeśli wyłączysz zdarzenia koła, możesz przypadkowo uniemożliwić niektórym użytkownikom przeglądanie zawartości w modach o wysokościach większych niż wysokość rzutni.
Jeszcze inna opcja: wydarzenia z kół
Przewijania zdarzeń nie można anulować. Możliwe jest jednak anulowanie kółka myszy i zdarzeń kółka . Wielkim zastrzeżeniem jest to, że nie wszystkie starsze przeglądarki obsługują je, Mozilla dopiero niedawno dodała obsługę tych ostatnich w Gecko 17.0. Nie znam pełnej wersji, ale IE6 + i Chrome je obsługują.
Oto jak je wykorzystać:
JSFiddle
źródło
overflow:hidden
lepiej na razie.źródło
Nie mogłem sprawić, by działał w Chrome tylko przez zmianę CSS, ponieważ nie chciałem, aby strona przewijała się z powrotem na górę. To działało dobrze:
źródło
Spróbuj tego:
zadziałało dla mnie. (obsługuje IE8)
źródło
position: fixed
.Mam nadzieję że to pomoże...
źródło
Dodawanie klasy „is-modal-open” lub modyfikowanie stylu tagu body za pomocą javascript jest w porządku i będzie działać tak, jak powinno. Ale problem, z którym się spotkamy, polega na tym, że ciało staje się przepełnione: ukryte, przeskoczy na górę, (scrollTop zmieni się na 0). Stanie się to problemem później.
Jako rozwiązanie tego problemu, zamiast zmieniać przepełnienie tagu body: ukryty zmień go na tag HTML
źródło
Nie jestem pewien co do tego kodu, ale warto spróbować.
W jQuery:
Jak powiedziałem wcześniej, nie jestem w 100% pewien, ale mimo wszystko spróbuj.
źródło
Od listopada 2017 Chrome wprowadził nową właściwość css
overscroll-behavior: contain;
co rozwiązuje ten problem, chociaż w chwili pisania ma ograniczoną obsługę wielu przeglądarek.
poniższe łącza zawierają pełne informacje i obsługę przeglądarki
źródło
Najlepszym rozwiązaniem jest rozwiązanie tylko dla css
body{overflow:hidden}
używane przez większość z tych odpowiedzi. Niektóre odpowiedzi zawierają poprawki, które zapobiegają również „skokowi” spowodowanemu znikaniem paska przewijania; jednak żaden nie był zbyt elegancki. Napisałem więc te dwie funkcje, które wydają się działać całkiem dobrze.Sprawdź ten jsFiddle, aby zobaczyć, czy jest w użyciu.
źródło
open modal
szerokości przycisków. Chrome na 8Wielu sugeruje „przepełnienie: ukryte” na ciele, co nie będzie działać (przynajmniej w moim przypadku), ponieważ spowoduje to przewinięcie strony do góry.
To rozwiązanie działa dla mnie (zarówno na telefonach komórkowych, jak i komputerach) przy użyciu jQuery:
Spowoduje to, że przewijanie modalu zadziała i zapobiegnie przewijaniu strony internetowej w tym samym czasie.
źródło
Możesz użyć następującej logiki, przetestowałem ją i działa (nawet w IE)
źródło
Nie jestem w 100% pewien, że to zadziała z Bootstrap, ale warto spróbować - działało z Remodal.js, który można znaleźć na github: http://vodkabears.github.io/remodal/ i miałoby to sens dla metod być całkiem podobnym.
Aby zatrzymać przeskakiwanie strony na górę, a także zapobiec właściwemu przesunięciu zawartości, dodaj klasę do
body
momentu uruchomienia modalu i ustaw następujące reguły CSS:To
position:static
i oneheight:auto
łączą się, aby zatrzymać przeskakiwanie treści w prawo.overflow-y:hidden;
Zatrzymuje strony od bycia przewijane za modalnej.źródło
Na podstawie tego skrzypka: http://jsfiddle.net/dh834zgw/1/
następujący fragment kodu (używając jquery) wyłączy przewijanie okna:
I w twoim css:
Teraz, kiedy usuwasz modal, nie zapomnij usunąć klasy noscroll z tagu html:
źródło
overflow
należy tego ustawićhidden
? +1, ponieważ to działało dla mnie (za pomocąhidden
).Miałem pasek boczny, który został wygenerowany przez hack pola wyboru. Ale głównym pomysłem jest zapisanie przewijania dokumentu i nie zmienianie go podczas przewijania okna.
Po prostu nie podobało mi się przeskakiwanie strony, gdy ciało staje się „przepełnione: ukryte”.
źródło
Niestety żadna z powyższych odpowiedzi nie rozwiązała moich problemów.
W mojej sytuacji strona internetowa pierwotnie ma pasek przewijania. Ilekroć klikam moduł, pasek przewijania nie zniknie, a nagłówek przesunie się nieco w prawo.
Potem próbowałem dodać
.modal-open{overflow:auto;}
(co większość osób poleciło). Naprawdę naprawiło to problemy: pasek przewijania pojawia się po otwarciu modalu. Pojawia się jednak inny efekt uboczny: „tło pod nagłówkiem przesunie się nieco w lewo wraz z innym długim paskiem za modalem”Na szczęście po dodaniu
{padding-right: 0 !important;}
wszystko jest naprawione idealnie. Zarówno nagłówek, jak i tło nie poruszały się, a moduł nadal utrzymuje pasek przewijania.Mam nadzieję, że pomoże to tym, którzy nadal tkwią w tym problemie. Powodzenia!
źródło
Większość elementów jest tutaj, ale nie widzę żadnej odpowiedzi, która łączy to wszystko.
Problem jest trojaki.
(1) zapobiega przewijaniu strony leżącej u jej podstaw
(2) i usuń pasek przewijania
(3) posprzątaj po zwolnieniu modalu
Jeśli modal nie jest pełnoekranowy, zastosuj wiązania .modal do nakładki pełnoekranowej.
źródło
Moje rozwiązanie dla Bootstrap 3:
ponieważ dla mnie jedyny
overflow: hidden
wbody.modal-open
klasie nie uniemożliwił przesunięcia strony w lewo z powodu oryginałumargin-right: 15px
.źródło
Właśnie to zrobiłem w ten sposób ...
Ale kiedy zniknął scroller, wszystko przesunęło się o 20 pikseli, więc dodałem
zaraz po tym.
Pracuje dla mnie.
źródło
Jeśli modalne są 100% wysokości / szerokości, „mouseenter / urlopu” będzie działało, aby łatwo włączyć / wyłączyć przewijanie. To naprawdę działało dla mnie:
źródło
pracował dla mnie
źródło
Dlaczego nie zrobić tego tak jak Bulma? Gdy modal jest aktywny, dodaj do html swoją klasę .is-clipped, która jest przepełniona: ukryta! Ważna; I to wszystko.
Edycja: Okey, Bulma ma ten błąd, więc musisz dodać także inne rzeczy, takie jak
źródło
Ponieważ dla mnie ten problem występował głównie w systemie iOS, udostępniam kod, który można naprawić tylko w systemie iOS:
źródło
Żadna z powyższych odpowiedzi nie działała dla mnie idealnie. Więc znalazłem inny sposób, który działa dobrze.
Wystarczy dodać
scroll.(namespace)
słuchacza i zestawscrollTop
z następującychdocument
do ostatniego z jego wartość ...a także usuń detektor ze swojego skryptu.
aktualizacja
wydaje się, że to nie działa dobrze na chromie. jakieś sugestie, aby to naprawić?
źródło
To działało dla mnie:
źródło
Dla tych, którzy zastanawiają się, jak uzyskać zdarzenie przewijania dla modalu bootstrap 3:
źródło