Bir mod açıldığında BODY'nin kaymasını önleyin


347

Web sitemdeki Modal ( http://twitter.github.com/bootstrap adresinden ) açılırken fare tekerleğini kullanırken vücudumun kaydırmayı durdurmasını istiyorum .

Modal açıldığında aşağıdaki javascript parçasını aramaya çalıştım ama başarılı olamadım

$(window).scroll(function() { return false; });

VE

$(window).live('scroll', function() { return false; });

Lütfen web sitemizin IE6 desteği düştüğünü, IE7 + 'nın uyumlu olması gerektiğini unutmayın.

Yanıtlar:


470

Kalıcı bir iletişim kutusu görüntülendiğinde Bootstrap's modalsınıfı otomatik olarak modal-opengövdeye ekler ve iletişim kutusu gizlendiğinde sınıfı kaldırır. Bu nedenle CSS'nize aşağıdakileri ekleyebilirsiniz:

body.modal-open {
    overflow: hidden;
}

Yukarıdaki kodun Bootstrap CSS kod tabanına ait olduğunu iddia edebilirsiniz, ancak bu sitenize eklemek için kolay bir çözümdür.

Güncelleme 8 Şubat 2013
Bu, artık Bootstrap v. 2.3.0 sürümünde çalışmayı durdurdu - artık modal-opensınıfı vücuda eklemiyorlar.

Geçici çözüm, mod gösterilmek üzereyken sınıfı gövdeye eklemek ve mod kapalıyken kaldırmaktır:

$("#myModal").on("show", function () {
  $("body").addClass("modal-open");
}).on("hidden", function () {
  $("body").removeClass("modal-open")
});

Güncelleme 11 Mart 2013 Görünüşe göre modal-opensınıf, kaymayı önlemek amacıyla Bootstrap 3.0'da geri dönecek:

Gövde üzerinde .modal-open'ı yeniden üretir (böylece oradaki kaydırmayı tıkayabiliriz)

Bkz. Https://github.com/twitter/bootstrap/pull/6342 - Kalıcı bölüme bakın.


2
bu artık bootstrap 2.2.2'de çalışmaz. Umarım .modal-open gelecekte geri gelecek ... github.com/twitter/bootstrap/issues/5719
ppetrid

2
@ppetrid Geri dönmesini beklemiyorum. Bu yazıya dayanarak: github.com/twitter/bootstrap/wiki/Upcoming-3.0-changes (aşağıya bakın). Alıntı: "Artık iç modal kaydırma yok. Bunun yerine, modals içeriğini barındırmak için büyür ve sayfa modal barındırmak için kaydırır."
MartinHN

2
@Bagata Cool - modal-openBootstrap 3'te geri dönecek, bu yüzden başlatıldığında yukarıdaki kodu kaldırmak güvenli olmalıdır.
MartinHN

2
Bu yüzden aşağı inmeye devam etmelisiniz, eğer seçilen cevap sizi tatmin etmiyorsa, böyle taşlar bulma şansınız vardır. 97 + oylu bir cevap daha az sevdim yorumlar altında çok derin gömülü beklemiyorduk.
Mohd Abdul Mujib

2
bununla ilgili sorun, bir kalıcı mod açıldığında belgenin yukarı kaymasını önlemek için body.modal-open {overflow: visible} eklemeniz gerekir. Çözümünüz şu anda çalışıyor, bir modal açıldıktan sonra belgenin en üste kayarsa dezavantajı
patrick

120

Kabul edilen cevap mobil cihazlarda çalışmıyor (en azından Safari 7 ile iOS 7) ve CSS'nin ne zaman yapacağımı MOAR JavaScript'in sitemde çalışmasını istemiyorum.

Bu CSS, arka plan sayfasının modun altına kaymasını önleyecektir:

body.modal-open {
    overflow: hidden;
    position: fixed;
}

Bununla birlikte, esasen yukarı kaydırmanın hafif bir yan etkisi vardır. position:absolutebunu çözer, ancak mobil cihazda kaydırma özelliğini yeniden sunar.

Görünümünüzü biliyorsanız (görünüm penceresi eklemek için eklentim) için<body> sadece bir css geçiş ekleyebilirsiniz position.

body.modal-open {
    // block scroll for mobile;
    // causes underlying page to jump to top;
    // prevents scrolling on all screens
    overflow: hidden;
    position: fixed;
}
body.viewport-lg {
    // block scroll for desktop;
    // will not jump to top;
    // will not prevent scroll on mobile
    position: absolute; 
}

Ayrıca, modülleri gösterirken / gizlerken alttaki sayfanın sola / sağa sıçramasını önlemek için de ekliyorum.

body {
    // STOP MOVING AROUND!
    overflow-x: hidden;
    overflow-y: scroll !important;
}

bu cevap bir x yazısı.


7
Teşekkürler! Cep telefonları (en azından iOS ve Android yerel tarayıcı) başım ağrıyor ve position: fixedvücutta olmadan çalışmazdı .
Raul Rene

Ayrıca modals gösterirken / gizlerken sayfanın sola / sağa zıplamasını önlemek için kod eklediğiniz için teşekkür ederiz. Bu son derece yararlıydı ve iOS 9.2.1 çalıştıran bir iPhone 5c'de Safari'de yaşadığım bir sorunu düzelttiğini doğruladım.
Elijah Lofgren

6
Kaydırma işlemini en üst düzeye çıkarmak için, sınıfı eklemeden önce konum kaydedebilirsiniz, daha sonra sınıf kaldırıldıktan sonra window yapın. Kaydedilen konuma gidin. Kendim için şu şekilde düzelttim: pastebin.com/Vpsz07zd .
Alet

Bunun sadece çok temel ihtiyaçlara uygun olacağını düşünmeme rağmen, yararlı bir düzeltmeydi. Teşekkürler.
Steve Benner

33

Sadece vücut taşmasını gizleyin ve vücudun kaymasını önler. Kipi gizlediğinizde, otomatik moda geri döndürün.

İşte kod:

$('#adminModal').modal().on('shown', function(){
    $('body').css('overflow', 'hidden');
}).on('hidden', function(){
    $('body').css('overflow', 'auto');
})

Mükemmel! Bu bana yardımcı oldu. Teşekkürler.
pfcodes

21

Gövde boyutunu taşma ile pencere boyutuna ayarlamayı deneyebilirsiniz: mod açıkken gizli


12
Bunu yaptığınızda, ekran her açıldığında ekranı hareket ettirir, bu uygun değildir, sadece arka plan kaydırmasını devre dışı bırakmam gerekiyor
xorinzor

kaydırma çubukları tarayıcı ile ilgili olduğundan emin olun ve onlarla fazla bir şey yapamazsınız
charlietfl

kalıcı olarak "sabit" olarak ayarlayabilirsiniz böylece kaydırma sırasında hareket olmaz
charlietfl

8
onun modal kaydırma durdurmak hakkında değil, onun arka planda vücut kaydırma durdurmak hakkında
xorinzor

1
vücut taşarsa kayan penceredir. Örneğin, kaydırma çubukları belgenin bir parçası değildir.
charlietfl

18

@ Charlietfl'in cevabının ötesine geçmeniz ve kaydırma çubuklarını hesaba katmanız gerekir, aksi takdirde belge yeniden akışını görebilirsiniz.

Kipin açılması:

  1. bodyGenişliği kaydedin
  2. Taşmayı şu bodydeğere ayarla:hidden
  3. Gövde genişliğini adım 1'deki genişliğe ayarlayın.

    var $body = $(document.body);
    var oldWidth = $body.innerWidth();
    $body.css("overflow", "hidden");
    $body.width(oldWidth);

Kipin kapatılması:

  1. Taşmayı şu bodydeğere ayarla:auto
  2. bodyGenişliği olarak ayarlaauto

    var $body = $(document.body);
    $body.css("overflow", "auto");
    $body.width("auto");

İlham kaynağı: http://jdsharp.us/jQuery/minute/calculate-scrollbar-width.php


Daha iyi bir terim olmaması nedeniyle "ürkek" bir ekran alıyordum ve buradaki anahtar genişlik ayarlarını takip ediyordu. Bir ton teşekkürler.
Hcabnettek

1
@Hcabnettek Evet: "gergin" == "belge yeniden akış". Sana yardım ettiğine sevindim! :-)
jpap

bunun için bir css çözümü var mı? tüm tarayıcılarda ve mobil cihazlarda çalışır mı?
Ruben

sadece bir yazım hatası: $body.css("overflow", "auto");Son adımda olmalı :)
schneikai

Ah adamım, ne harika bir fikir. @jpap, uzun zamandır beni rahatsız eden belge yeniden akış sorununu çözmeme yardımcı oldunuz.
Goran Radulovic

17

Uyarı: Aşağıdaki seçenek, Bootstrap v3.0.x ile ilgili değildir, çünkü bu sürümlerde kaydırma modun kendisiyle sınırlıdır. Tekerlek olaylarını devre dışı bırakırsanız, bazı kullanıcıların yükseklikleri görüntü alanı yüksekliğinden daha büyük olan içerikleri görüntülemesini yanlışlıkla engelleyebilirsiniz.


Yine Başka Bir Seçenek: Wheel Events

Kaydırma olay, iptal edilemeyen. Ancak fare tekerleği ve tekerlek olaylarını iptal etmek mümkündür . Büyük uyarı, tüm eski tarayıcıların onları desteklememesi, Mozilla'nın son zamanlarda Gecko 17.0'daki ikincisi için destek eklemesi. Tam yayılımı bilmiyorum, ancak IE6 + ve Chrome bunları destekliyor.

Bunlardan nasıl yararlanacağınız aşağıda açıklanmıştır:

$('#myModal')
  .on('shown', function () {
    $('body').on('wheel.modal mousewheel.modal', function () {
      return false;
    });
  })
  .on('hidden', function () {
    $('body').off('wheel.modal mousewheel.modal');
  });

JSFiddle


JSFiddle'ınız Firefox 24, Chrome 24 veya IE9 üzerinde çalışmaz.
AxeEffect

@AxeEffect şimdi çalışıyor olmalıdır. Tek sorun Bootstrap kütüphanesine yapılan dış referansların değişmiş olmasıydı. Söylediğin için teşekkürler.
merv

2
Bu, dokunmatik cihazların kaymasını engellemez, overflow:hiddenşimdilik daha iyidir.
Webinan

5
hepsi çalışıyor ancak mobil cihazlar için çalışmıyor. -__- Android 4.1 ve Chrome'u test etti
Tower Jimmy

@TowerJimmy muhtemelen bunun için dokunma veya sürükleme olaylarını iptal etmeniz gerekiyor (mümkünse)
xorinzor

9
/* =============================
 * Disable / Enable Page Scroll
 * when Bootstrap Modals are
 * shown / hidden
 * ============================= */

function preventDefault(e) {
  e = e || window.event;
  if (e.preventDefault)
      e.preventDefault();
  e.returnValue = false;  
}

function theMouseWheel(e) {
  preventDefault(e);
}

function disable_scroll() {
  if (window.addEventListener) {
      window.addEventListener('DOMMouseScroll', theMouseWheel, false);
  }
  window.onmousewheel = document.onmousewheel = theMouseWheel;
}

function enable_scroll() {
    if (window.removeEventListener) {
        window.removeEventListener('DOMMouseScroll', theMouseWheel, false);
    }
    window.onmousewheel = document.onmousewheel = null;  
}

$(function () {
  // disable page scrolling when modal is shown
  $(".modal").on('show', function () { disable_scroll(); });
  // enable page scrolling when modal is hidden
  $(".modal").on('hide', function () { enable_scroll(); });
});

9

Yalnızca CSS'yi değiştirerek Chrome'da çalışmasını sağlayamadım, çünkü sayfanın en üste geri dönmesini istemedim. Bu iyi çalıştı:

$("#myModal").on("show.bs.modal", function () {
  var top = $("body").scrollTop(); $("body").css('position','fixed').css('overflow','hidden').css('top',-top).css('width','100%').css('height',top+5000);
}).on("hide.bs.modal", function () {
  var top = $("body").position().top; $("body").css('position','relative').css('overflow','auto').css('top',0).scrollTop(-top);
});

1
Bu benim için bootstrap 3.2 üzerinde çalışan tek çözüm.
volx757

1
Açısal malzeme sidenavs ile en iyi sorun atlamak vardı. Bu, her durumda işe yarayan tek cevaptı (masaüstü / mobil + modal / sidenav'da kaydırmaya izin ver + atlamadan vücut kaydırma konumunu sabit bırak).
cYrixmorten

Bu sadece benim için gerçekten işe yarayan bir çözüm. tx
Deedz

9

Bunu dene:

.modal-open {
    overflow: hidden;
    position:fixed;
    width: 100%;
    height: 100%;
}

benim için çalıştı. (IE8'i destekler)


4
Bu işe yarar ama aynı zamanda kullanırken bir modal açtığınızda üste atlamanıza neden olur position: fixed.
AlexioVay

8

İçin Bootstrap , bu (çalışan deneyebilirsiniz Firefox, Chromeve Microsoft Edge):

body.modal-open {
    overflow: hidden;
    position:fixed;
    width: 100%;
}

Bu yardımcı olur umarım...


7

'İs-modal-open' sınıfını eklemek veya javascript ile gövde etiketi stilini değiştirmek iyidir ve olması gerektiği gibi çalışacaktır. Ancak karşılaşacağımız sorun, vücudun taşması olduğunda: gizli, tepeye atlayacak, (scrollTop 0 olacak). Bu daha sonra bir kullanılabilirlik sorunu haline gelecektir.

Bu soruna bir çözüm olarak, gövde etiketi taşmasını değiştirmek yerine: gizli HTML etiketinde değiştirin

$('#myModal').on('shown.bs.modal', function () {
  $('html').css('overflow','hidden');
}).on('hidden.bs.modal', function() {
  $('html').css('overflow','auto');
});

1
Bu kesinlikle doğru cevaptır çünkü genel fikir birliği yanıtı, sayfayı korkunç bir kullanıcı deneyimi olan en üste kaydırır. Bu konuda bir blog yazmalısınız. Sonunda bunu küresel bir çözüme dönüştürdüm.
Smith

6

Bu koddan emin değilim, ama denemeye değer.

JQuery'de:

$(document).ready(function() {
    $(/* Put in your "onModalDisplay" here */)./* whatever */(function() {
        $("#Modal").css("overflow", "hidden");
    });
});

Daha önce söylediğim gibi,% 100 emin değilim ama yine de deneyin.


1
Bu, modal açıldığında vücudun kaymasını engellemez
xorinzor 2:12

@xorinzor, charlietfl'in bunun işe yaradığı cevabının yorum bölümünde belirtmişsinizdir. Ama dedin ki: Bu, modal açıldığında vücudun kaymasını engellemez.
Anish Gupta

doğru ama şimdilik bu kısmen çalışan tek çözüm ve ben iyiyim. cevabını cevap olarak işaretlememin sebebi, cevabın daha erken olmasıydı.
xorinzor

@xorinzor gerçekten, ondan önce cevap verdiğimi düşündüm, garip bir aksaklık olabilir. onun güzel olsa da
Anish Gupta


4

En iyi çözüm, body{overflow:hidden}bu cevapların çoğunda kullanılan css-only çözümdür. Bazı cevaplar, kaybolan kaydırma çubuğunun neden olduğu "sıçramayı" önleyen bir düzeltme sağlar; Ancak, hiçbiri çok zarif değildi. Bu iki işlevi yazdım ve oldukça iyi çalışıyorlar.

var $body = $(window.document.body);

function bodyFreezeScroll() {
    var bodyWidth = $body.innerWidth();
    $body.css('overflow', 'hidden');
    $body.css('marginRight', ($body.css('marginRight') ? '+=' : '') + ($body.innerWidth() - bodyWidth))
}

function bodyUnfreezeScroll() {
    var bodyWidth = $body.innerWidth();
    $body.css('marginRight', '-=' + (bodyWidth - $body.innerWidth()))
    $body.css('overflow', 'auto');
}

Check out bu jsFiddle kullanımda görmek için.


Bu o kadar eski değil ama bunların hiçbiri benim için çalışmıyor.
indi

Modu birkaç kez açın ve kapatın, ana yeşil DIV küçülür ve küçülür!
Webinan

@Webinan Bunu Win7'de Chrome'da görmüyorum. Tarayıcınızın ve görünüm alanınızın boyutu nedir?
Stephen M. Harris

1
@smhmic yaklaşık 20 kez açılıp kapandıktan sonra yeşil div'in genişliği open modaldüğmelerin genişliğine eşit olur . Chrome on 8
Webinan

@ Jpap cevabına benzer ( stackoverflow.com/a/16451821/5516499 ), ancak hatalar eklendi. :-(
Kivi Shapiro

4

Birçoğu, web sitesinde en üste kaydırılmasını sağlayacağından, çalışmaz (en azından benim durumumda değil), vücutta "taşma: gizli" önerir.

Bu, jQuery kullanarak benim için (hem cep telefonlarında hem de bilgisayarlarda) çalışan çözümdür:

    $('.yourModalDiv').bind('mouseenter touchstart', function(e) {
        var current = $(window).scrollTop();
        $(window).scroll(function(event) {
            $(window).scrollTop(current);
        });
    });
    $('.yourModalDiv').bind('mouseleave touchend', function(e) {
        $(window).off('scroll');
    });

Bu, modun kaydırılmasını sağlar ve web sitesinin aynı anda kaydırılmasını önler.


Bu çözümün bu iOS hatasını da düzelttiği
anlaşılıyor

3

Aşağıdaki mantığı kullanabilirsiniz, test ettim ve çalışıyor (IE'de bile)

   <html>

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script>
<script type="text/javascript">

var currentScroll=0;
function lockscroll(){
    $(window).scrollTop(currentScroll);
}


$(function(){

        $('#locker').click(function(){
            currentScroll=$(window).scrollTop();
            $(window).bind('scroll',lockscroll);

        })  


        $('#unlocker').click(function(){
            currentScroll=$(window).scrollTop();
            $(window).unbind('scroll');

        })
})

</script>

<div>

<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
<button id="locker">lock</button>
<button id="unlocker">unlock</button>
<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>

</div>

2

Bunun Bootstrap ile çalışacağından% 100 emin değilim ama denemeye değer - github'da bulunan Remodal.js ile çalıştı: http://vodkabears.github.io/remodal/ ve yöntemler için mantıklı oldukça benzer olmak.

Sayfanın en üste atlamasını durdurmak ve içeriğin doğru kaydırılmasını önlemek için body, modun ne zaman tetiklendiğine bir sınıf ekleyin ve şu CSS kurallarını ayarlayın:

body.with-modal {
    position: static;
    height: auto;
    overflow-y: hidden;
}

Bu var position:staticve height:autobirleştirmek olduğunu sağa içeriğin atlama durdurmak için. overflow-y:hidden;Modal arkasında kaydırılabilir olmaktan sayfayı durdurur.


Bu çözüm Safari 11.1.1, Chrome 67.0.3396.99 ve Firefox 60.0.2'de mükemmel çalışıyor. Teşekkürler!
Dom

2

Bu kemandan yola çıkarak: http://jsfiddle.net/dh834zgw/1/

aşağıdaki snippet (jquery kullanarak) pencere kaydırmasını devre dışı bırakır:

 var curScrollTop = $(window).scrollTop();
 $('html').toggleClass('noscroll').css('top', '-' + curScrollTop + 'px');

Ve css'inizde:

html.noscroll{
    position: fixed;
    width: 100%;
    top:0;
    left: 0;
    height: 100%;
    overflow-y: scroll !important;
    z-index: 10;
 }

Şimdi kipi kaldırdığınızda, html etiketindeki noscroll sınıfını kaldırmayı unutmayın:

$('html').toggleClass('noscroll');

Olarak overflowayarlanmamalı mı hidden? +1 olsa da bu benim için çalıştı (kullanarak hidden).
mhulse

2

Onay kutusu kesmek tarafından oluşturulan bir kenar çubuğu vardı. Ancak ana fikir, scrollTop belgesini kaydetmek ve pencereyi kaydırırken değiştirmektir.

Gövde 'taşma: gizli' olduğunda sayfanın atlamasını sevmedim.

window.addEventListener('load', function() {
    let prevScrollTop = 0;
    let isSidebarVisible = false;

    document.getElementById('f-overlay-chkbx').addEventListener('change', (event) => {
        
        prevScrollTop = window.pageYOffset || document.documentElement.scrollTop;
        isSidebarVisible = event.target.checked;

        window.addEventListener('scroll', (event) => {
            if (isSidebarVisible) {
                window.scrollTo(0, prevScrollTop);
            }
        });
    })

});


2

Ne yazık ki yukarıdaki cevapların hiçbiri sorunlarımı çözmedi.

Benim durumumda, web sayfasında başlangıçta bir kaydırma çubuğu var. Kipi ne zaman tıklasam, kaydırma çubuğu kaybolmaz ve başlık biraz sağa hareket eder.

Sonra eklemeye çalıştım .modal-open{overflow:auto;}(çoğu insan tavsiye etti). Gerçekten sorunları düzeltti: modal açıldıktan sonra kaydırma çubuğu görünüyor. Bununla birlikte, "başlığın altındaki arka plan, modun arkasındaki başka bir uzun çubukla birlikte biraz sola doğru hareket edecek" başka bir yan etki ortaya çıkıyor.

Kipin arkasında uzun çubuk

Neyse ki, ekledikten sonra {padding-right: 0 !important;}her şey mükemmel bir şekilde düzeltildi. Hem başlık hem de gövde arka planı hareket etmedi ve mod hala kaydırma çubuğunu koruyor.

Sabit görüntü

Umarım bu sorunla hala sıkışmış olanlara yardımcı olabilir. İyi şanslar!


1

Parçaların çoğu burada, ama hepsini bir araya getiren bir cevap görmüyorum.

Sorun üç yönlü.

(1) alttaki sayfanın kaydırılmasını önleme

$('body').css('overflow', 'hidden')

(2) ve kaydırma çubuğunu kaldırın

var handler = function (e) { e.preventDefault() }
$('.modal').bind('mousewheel touchmove', handler)

(3) mod atıldığında temizleyin

$('.modal').unbind('mousewheel touchmove', handler)
$('body').css('overflow', '')

Kip tam ekran değilse .modal bağlamaları tam ekran kaplamasına uygulayın.


4
Bu aynı zamanda mod içinde kaydırmayı da önler.
Daniel

Aynı sorun. bir çözüm buldun mu? Daniel
AlexioVay


1

Bootstrap 3 için çözümüm:

.modal {
  overflow-y: hidden;
}
body.modal-open {
  margin-right: 0;
}

Benim için tek nedeni overflow: hiddenüzerinde body.modal-opensınıfına bağlı orijinaline sola kaymasını sayfayı engel olmadı margin-right: 15px.


1

Sadece bu şekilde yaptım ...

$('body').css('overflow', 'hidden');

Ama kaydırma çubuğu kaybolduğunda her şeyi 20 piksel sağa taşıdı, bu yüzden ekledim

$('body').css('margin-right', '20px');

hemen sonra.

Benim için çalışıyor.


Bu, yalnızca mod ekran boyutundan küçükse çalışır.
Sergey

1

Modsal% 100 yükseklik / genişlik ise "mouseenter / leave" kaydırmayı kolayca etkinleştirmek / devre dışı bırakmak için çalışır. Bu benim için gerçekten işe yaradı:

var currentScroll=0;
function lockscroll(){
    $(window).scrollTop(currentScroll);
} 
$("#myModal").mouseenter(function(){
    currentScroll=$(window).scrollTop();
    $(window).bind('scroll',lockscroll); 
}).mouseleave(function(){
    currentScroll=$(window).scrollTop();
    $(window).unbind('scroll',lockscroll); 
});

1

benim için çalıştı

$('#myModal').on({'mousewheel': function(e) 
    {
    if (e.target.id == 'el') return;
    e.preventDefault();
    e.stopPropagation();
   }
});

1

Bunu neden Bulma gibi yapmıyorsun? Modal aktif olduğunda, html'ye sınıflarını ekleyin .is-clipped (taşma): hidden! İmportant; Ve bu kadar.

Düzenleme: Okey, Bulma'da bu hata var, bu yüzden başka şeyler de eklemelisiniz

html.is-modal-active {
  overflow: hidden !important;
  position: fixed;
  width: 100%; 
}

1

Benim için bu sorun esas olarak iOS'ta sunulduğundan, bunu yalnızca iOS'ta düzeltmek için kod sağlıyorum:

  if(!!navigator.platform && /iPad|iPhone|iPod/.test(navigator.platform)) {
    var $modalRep    = $('#modal-id'),
        startScrollY = null, 
        moveDiv;  

    $modalRep.on('touchmove', function(ev) {
      ev.preventDefault();
      moveDiv = startScrollY - ev.touches[0].clientY;
      startScrollY = ev.touches[0].clientY;
      var el = $(ev.target).parents('#div-that-scrolls');
      // #div-that-scrolls is a child of #modal-id
      el.scrollTop(el.scrollTop() + moveDiv);
    });

    $modalRep.on('touchstart', function(ev) {
      startScrollY = ev.touches[0].clientY;
    });
  }

1

Yukarıdaki cevapların hiçbiri benim için mükemmel sonuç vermedi. Bu yüzden iyi çalışan başka bir yol buldum.

Sadece bir ekleme scroll.(namespace)dinleyici ve set scrollToparasındadocument 's değerinin son için ...

ve ayrıca yakın komut dosyanızdaki dinleyiciyi kaldırın.

// in case of bootstrap modal example:
$('#myModal').on('shown.bs.modal', function () {

  var documentScrollTop = $(document).scrollTop();
  $(document).on('scroll.noScroll', function() {
     $(document).scrollTop(documentScrollTop);
     return false;
  });

}).on('hidden.bs.modal', function() {

  $(document).off('scroll.noScroll');

});

Güncelleme

Görünüşe göre, bu krom üzerinde iyi çalışmıyor. düzeltmek için herhangi bir öneri?


0

Bu benim için çalıştı:

$("#mymodal").mouseenter(function(){
   $("body").css("overflow", "hidden"); 
}).mouseleave(function(){
   $("body").css("overflow", "visible");
});

0

Bootstrap 3 modal için scroll etkinliğinin nasıl alınacağını merak edenler için:

$(".modal").scroll(function() {
    console.log("scrolling!);
});
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.