Ngăn CƠ THỂ cuộn khi một chế độ được mở


346

Tôi muốn cơ thể của tôi ngừng cuộn khi sử dụng con lăn chuột trong khi Modal (từ http://twitter.github.com/bootstrap ) trên trang web của tôi được mở.

Tôi đã cố gắng gọi đoạn javascript bên dưới khi phương thức được mở nhưng không thành công

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

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

Xin lưu ý rằng trang web của chúng tôi đã bỏ hỗ trợ cho IE6, IE7 + cần phải tương thích.

Câu trả lời:


468

Bootstrap modaltự động thêm lớp modal-openvào phần thân khi hộp thoại phương thức được hiển thị và xóa nó khi hộp thoại bị ẩn. Do đó, bạn có thể thêm phần sau vào CSS của mình:

body.modal-open {
    overflow: hidden;
}

Bạn có thể lập luận rằng mã ở trên thuộc về cơ sở mã Bootstrap CSS, nhưng đây là một sửa chữa dễ dàng để thêm nó vào trang web của bạn.

Cập nhật feb thứ 8, 2013
Điều này hiện đã ngừng hoạt động trong Twitter Bootstrap v. 2.3.0 - họ không còn thêm modal-openlớp vào cơ thể.

Một cách giải quyết khác là thêm lớp vào phần thân khi phương thức sắp được hiển thị và loại bỏ nó khi phương thức được đóng:

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

Cập nhật ngày 11 tháng 3 năm 2013 Có vẻ như modal-openlớp sẽ trở lại trong Bootstrap 3.0, rõ ràng với mục đích ngăn cuộn:

Giới thiệu lại .modal-open trên cơ thể (vì vậy chúng ta có thể nuke cuộn ở đó)

Xem điều này: https://github.com/twitter/bootstrap/pull/6342 - xem phần Modal .


2
điều này không hoạt động nữa trong bootstrap 2.2.2. Hy vọng .modal-open sẽ quay trở lại trong tương lai ... github.com/twitter/bootstrap/issues/5719
ppetrid

2
@ppetrid Tôi không mong đợi nó trở lại. Dựa trên văn bản này: github.com/twitter/bootstrap/wiki/Upcome-3.0-changes (nhìn ở phía dưới). Trích dẫn: "Không có cuộn phương thức bên trong nữa. Thay vào đó, các phương thức sẽ phát triển để chứa nội dung của chúng và cuộn trang để chứa phương thức."
MartinHN

2
@Bagata Cool - modal-opensẽ trở lại trong Bootstrap 3, vì vậy khi khởi chạy, nó sẽ an toàn để xóa mã trên.
MartinHN

2
Đây là lý do tại sao người ta nên tiếp tục cuộn xuống, nếu câu trả lời được chọn không làm bạn hài lòng, có nhiều khả năng bạn sẽ tìm thấy những viên đá quý như thế này. không mong đợi một câu trả lời 97+ được bình chọn chôn sâu dưới các bình luận ít thích khác.
Mohd Abdul Mujib

2
vấn đề với điều này là để ngăn tài liệu cuộn lên trên cùng khi một phương thức được mở, bạn cần thêm body.modal-open {overflow: thấy}. Giải pháp của bạn hoạt động vào lúc này, với nhược điểm là tài liệu cuộn lên trên cùng một khi phương thức được mở
patrick

120

Câu trả lời được chấp nhận không hoạt động trên thiết bị di động (ít nhất là iOS 7 w / Safari 7) và tôi không muốn MOAR JavaScript chạy trên trang web của mình khi CSS sẽ làm.

CSS này sẽ ngăn trang nền cuộn xuống theo phương thức:

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

Tuy nhiên, nó cũng có một tác dụng phụ nhẹ về cơ bản là cuộn lên trên cùng. position:absolutegiải quyết vấn đề này, nhưng giới thiệu lại khả năng cuộn trên thiết bị di động.

Nếu bạn biết chế độ xem của mình ( plugin của tôi để thêm chế độ xem vào<body> ), bạn có thể chỉ cần thêm một chuyển đổi css cho 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; 
}

Tôi cũng thêm điều này để ngăn trang bên dưới nhảy sang trái / phải khi hiển thị / ẩn phương thức.

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

Câu trả lời này là một bài x.


7
Cảm ơn! Điện thoại di động (ít nhất là trình duyệt gốc iOS và Android) khiến tôi đau đầu và sẽ không hoạt động nếu không có position: fixedphần thân.
Raul Rene

Cảm ơn vì đã bao gồm mã để ngăn trang nhảy sang trái / phải khi hiển thị / ẩn phương thức. Điều này cực kỳ hữu ích và tôi đã xác minh nó khắc phục sự cố tôi gặp phải trên Safari trên iPhone 5c chạy iOS 9.2.1.
Elijah Lofgren

6
Để sửa lỗi cuộn lên trên cùng, bạn có thể ghi vị trí trước khi thêm lớp, sau đó sau khi lớp bị xóa, hãy làm window.scroll đến vị trí đã ghi. Đây là cách tôi tự sửa nó: pastebin.com/Vpsz07zd .
Công cụ

Mặc dù tôi cảm thấy điều này chỉ phù hợp với những nhu cầu rất cơ bản, nhưng nó là một sửa chữa hữu ích. Cảm ơn.
Steve Benner

32

Đơn giản chỉ cần che giấu cơ thể tràn và nó làm cho cơ thể không cuộn. Khi bạn ẩn phương thức, hoàn nguyên nó thành tự động.

Đây là mã:

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

Thông minh! Điều này đã giúp tôi ra ngoài. Cảm ơn.
pfcodes

21

Bạn có thể thử đặt kích thước cơ thể thành kích thước cửa sổ với tràn: ẩn khi chế độ được mở


12
làm như vậy sẽ di chuyển màn hình mỗi khi chế độ được mở, điều đó không thuận tiện, tôi chỉ cần vô hiệu hóa cuộn nền
xorinzor

không chắc chắn rằng bạn có thể cuộn thanh có liên quan đến trình duyệt và bạn không thể làm gì nhiều với chúng
charlietfl

bạn có thể đặt chế độ thành "đã sửa" để không di chuyển khi cuộn
charlietfl

8
Nó không phải là về việc dừng phương thức cuộn, mà là về việc dừng cơ thể trong nền từ cuộn
xorinzor

1
đó là cửa sổ cuộn nếu cơ thể tràn ra. Ví dụ, thanh cuộn không phải là một phần của tài liệu.
charlietfl

18

Bạn cần phải vượt ra ngoài câu trả lời và tài khoản của @ charlietfl cho các thanh cuộn, nếu không bạn có thể thấy một dòng chảy lại tài liệu.

Mở phương thức:

  1. Ghi lại bodychiều rộng
  2. Đặt bodytrànhidden
  3. Hoàn toàn thiết lập chiều rộng cơ thể với những gì nó đã ở bước 1.

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

Đóng phương thức:

  1. Đặt bodytrànauto
  2. Đặt bodychiều rộng thànhauto

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

Lấy cảm hứng từ: http://jdsharp.us/jQuery/minute/calculate-scrollbar- thong.php


Tôi đã nhận được một màn hình "tăng vọt" vì thiếu một thuật ngữ tốt hơn và chìa khóa ở đây đối với tôi là theo các cài đặt chiều rộng. Cảm ơn rất nhiều.
Hcabnettek

1
@Hcabnettek Yep: "jumpy" == "chỉnh lại tài liệu". Rất vui vì nó đã giúp bạn! :-)
jpap

Có một giải pháp css cho việc này? Nó có hoạt động trong tất cả các trình duyệt và điện thoại di động không?
Ruben

chỉ là một lỗi đánh máy: Nó phải $body.css("overflow", "auto");ở bước cuối cùng :)
schneikai

Ôi trời, thật là một ý tưởng tuyệt vời. @jpap bạn đã giúp tôi giải quyết vấn đề chỉnh lại tài liệu đã làm tôi khó chịu trong một thời gian dài.
Goran Radulovic

17

Cảnh báo: Tùy chọn bên dưới không liên quan đến Bootstrap v3.0.x, vì việc cuộn trong các phiên bản đó đã được giới hạn rõ ràng với chính phương thức. Nếu bạn tắt các sự kiện bánh xe, bạn có thể vô tình ngăn một số người dùng xem nội dung ở các chế độ có chiều cao lớn hơn chiều cao của chế độ xem.


Một lựa chọn khác: Sự kiện bánh xe

Sự kiện cuộn không thể hủy bỏ. Tuy nhiên, có thể hủy bỏ các sự kiện chuộtbánh xe . Nhắc nhở lớn là không phải tất cả các trình duyệt cũ đều hỗ trợ chúng, Mozilla chỉ mới bổ sung hỗ trợ cho phần sau trong Gecko 17.0. Tôi không biết toàn bộ sự lan truyền, nhưng IE6 + và Chrome hỗ trợ họ.

Đây là cách tận dụng chúng:

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

Câu đố


JSFiddle của bạn không hoạt động trên Firefox 24, Chrome 24 cũng như trên IE9.
AxeEffect

@AxeEffect nên làm việc ngay bây giờ. Vấn đề duy nhất là các tham chiếu bên ngoài đến thư viện Bootstrap đã thay đổi. Cảm ơn cho những người đứng đầu lên.
merv

2
Điều này không ngăn các thiết bị cảm ứng cuộn, overflow:hiddentốt hơn bây giờ.
Webinan

5
tất cả chúng đều hoạt động nhưng không dành cho thiết bị di động. -__- Đã thử nghiệm Android 4.1 và Chrome
Tháp Jimmy

@TowerJimmy có lẽ bạn cần phải hủy bỏ các sự kiện chạm hoặc kéo cho điều đó (nếu điều đó thậm chí có thể)
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

Không thể làm cho nó hoạt động trên Chrome chỉ bằng cách thay đổi CSS, vì tôi không muốn trang cuộn trở lại đầu trang. Điều này làm việc tố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
đây là giải pháp duy nhất phù hợp với tôi trên bootstrap 3.2.
volx57

1
Đã nhảy vào vấn đề hàng đầu với sidenavs vật liệu góc. Đây là câu trả lời duy nhất có vẻ hoạt động trong mọi trường hợp (máy tính để bàn / thiết bị di động + cho phép cuộn trong chế độ / sidenav + để cố định vị trí cuộn cơ thể mà không nhảy).
cYrixmorten

Đây cũng là giải pháp duy nhất thực sự hiệu quả với tôi. tx
Deedz

làm việc cho tôi, bootstrap v4
Deano

9

Hãy thử cái này:

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

nó làm việc cho tôi (hỗ trợ IE8)


4
Điều này hoạt động nhưng cũng khiến bạn nhảy lên đầu khi bạn mở một chế độ khi sử dụng position: fixed.
AlexioVay

8

Đối với Bootstrap , bạn có thể thử này (làm việc trên Firefox, ChromeMicrosoft Edge):

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

Hi vọng điêu nay co ich...


7

Thêm lớp 'is-modal-open' hoặc sửa đổi kiểu thẻ body bằng javascript là được và nó sẽ hoạt động như mong muốn. Nhưng vấn đề chúng ta sẽ gặp phải là khi cơ thể trở nên tràn ra: bị ẩn, nó sẽ nhảy lên trên cùng, (scrollTop sẽ trở thành 0). Điều này sẽ trở thành một vấn đề khả năng sử dụng sau này.

Là một giải pháp cho vấn đề này, thay vì thay đổi tràn thẻ cơ thể: ẩn thay đổi nó trên thẻ html

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

1
Đây hoàn toàn là câu trả lời chính xác bởi vì câu trả lời đồng thuận chung sẽ cuộn trang lên đầu trang, đó là một trải nghiệm người dùng khủng khiếp. Bạn nên viết một blog về điều này. Tôi cuối cùng đã biến điều này thành một giải pháp toàn cầu.
Smith

Điều này sẽ không hoạt động trên iphone.
BadriNarayanan Sridharan

6

Tôi không chắc chắn về mã này, nhưng nó đáng để thử.

Trong jQuery:

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

Như tôi đã nói trước đây, tôi không chắc chắn 100% nhưng dù sao cũng phải thử.


1
Điều này không ngăn cơ thể cuộn trong khi chế độ được mở
xorinzor

@xorinzor bạn đã nêu trong phần bình luận câu trả lời của charlietfl rằng điều này hoạt động. Nhưng bạn đã nói: Điều này không ngăn cơ thể cuộn trong khi chế độ được mở.
Anish Gupta

đúng nhưng hiện tại đây là giải pháp duy nhất có hiệu quả và tôi vẫn ổn. lý do tại sao tôi đánh dấu câu trả lời của anh ấy là câu trả lời là vì anh ấy sớm hơn với câu trả lời.
xorinzor

@xorinzor thực sự, tôi nghĩ rằng tôi đã trả lời trước anh ấy / cô ấy, có thể là một trục trặc kỳ lạ. mặc dù nó ổn
Anish Gupta


4

Giải pháp tốt nhất là giải pháp chỉ css body{overflow:hidden}được sử dụng bởi hầu hết các câu trả lời này. Một số câu trả lời cung cấp một bản sửa lỗi cũng ngăn chặn "bước nhảy" gây ra bởi thanh cuộn biến mất; Tuy nhiên, không ai là quá thanh lịch. Vì vậy, tôi đã viết hai chức năng này và chúng dường như hoạt động khá tốt.

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');
}

Kiểm tra jsFiddle này để xem nó được sử dụng.


Điều này không quá cũ nhưng không có cái nào trong số này hoạt động cả đối với tôi thậm chí không phải là chiếc hộp tôi vẫn có thể cuộn cửa sổ, tôi còn thiếu gì?
hạ cánh

Mở và Đóng chế độ một vài lần, và DIV màu xanh lá cây chính co lại và co lại!
Webinan

@Webinan Tôi không thấy điều này trong Chrome trên Win7. Trình duyệt và kích thước khung nhìn của bạn là gì?
Stephen M. Harris

1
@smhmic sau khoảng 20 lần mở và đóng chiều rộng của div màu xanh lá cây sẽ trở thành bằng với chiều rộng của các open modalnút. Chrome vào ngày 8
Webinan

Tương tự như câu trả lời của @ jpap ( stackoverflow.com/a/16451821/5516499 ) nhưng có thêm lỗi. :-(
Kivi Shapiro

4

Nhiều người đề xuất "tràn: ẩn" trên cơ thể, sẽ không hoạt động (ít nhất là trong trường hợp của tôi), vì nó sẽ làm cho trang web cuộn lên trên cùng.

Đây là giải pháp phù hợp với tôi (cả trên điện thoại di động và máy tính), sử dụng jQuery:

    $('.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');
    });

Điều này sẽ làm cho việc cuộn chế độ hoạt động và ngăn trang web cuộn cùng một lúc.


Có vẻ như giải pháp này cũng sửa lỗi iOS này: hackernoon.com/,
Gotenks

3

Bạn có thể sử dụng logic sau, tôi đã thử nghiệm và nó hoạt động (ngay cả trong IE)

   <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

Tôi không chắc chắn 100% điều này sẽ hoạt động với Bootstrap nhưng đáng để thử - nó hoạt động với Remodal.js có thể tìm thấy trên github: http://vodkabears.github.io/remodal/ và nó có ý nghĩa đối với các phương thức khá giống nhau

Để ngăn trang nhảy lên trên cùng và cũng ngăn sự dịch chuyển đúng của nội dung, hãy thêm một lớp vào bodykhi chế độ được kích hoạt và đặt các quy tắc CSS này:

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

Đó là position:staticheight:autokết hợp để ngăn chặn việc nhảy nội dung sang phải. Việc overflow-y:hidden;dừng trang không thể cuộn phía sau phương thức.


Giải pháp này hoạt động hoàn hảo với tôi trong Safari 11.1.1, Chrome 67.0.3394.99 và Firefox 60.0.2. Cảm ơn!
Dom

2

Dựa trên câu đố này: http://jsfiddle.net/dh834zgw/1/

đoạn mã sau (sử dụng jquery) sẽ vô hiệu hóa cuộn cửa sổ:

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

Và trong css của bạn:

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

Bây giờ khi bạn xóa phương thức, đừng quên xóa lớp noscroll trên thẻ html:

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

Không nên overflowđược đặt thành hidden? +1 mặc dù điều này làm việc cho tôi (sử dụng hidden).
mhulse

2

Tôi đã có một thanh bên được tạo ra bởi hack hộp kiểm. Nhưng ý tưởng chính là lưu tài liệu scrollTop và không thay đổi nó trong khi cuộn cửa sổ.

Tôi chỉ không thích trang nhảy khi cơ thể trở nên 'tràn: ẩn'.

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

Đáng buồn thay, không có câu trả lời nào ở trên khắc phục vấn đề của tôi.

Trong tình huống của tôi, trang web ban đầu có một thanh cuộn. Bất cứ khi nào tôi nhấp vào phương thức, thanh cuộn sẽ không biến mất và tiêu đề sẽ di chuyển sang phải một chút.

Sau đó, tôi đã cố gắng để thêm .modal-open{overflow:auto;}(mà hầu hết mọi người đề nghị). Nó thực sự đã sửa các vấn đề: thanh cuộn xuất hiện sau khi tôi mở phương thức. Tuy nhiên, một hiệu ứng phụ khác xuất hiện đó là "nền bên dưới tiêu đề sẽ di chuyển sang bên trái một chút, cùng với một thanh dài khác phía sau phương thức"

Thanh dài phía sau phương thức

May mắn thay, sau khi tôi thêm {padding-right: 0 !important;}, mọi thứ đã được sửa chữa hoàn hảo. Cả tiêu đề và nền cơ thể đều không di chuyển và phương thức vẫn giữ thanh cuộn.

Đã sửa ảnh

Hy vọng điều này có thể giúp những người vẫn còn mắc kẹt với vấn đề này. Chúc may mắn!


1

Hầu hết các tác phẩm đều ở đây, nhưng tôi không thấy bất kỳ câu trả lời nào đặt tất cả cùng nhau.

Vấn đề là gấp ba lần.

(1) ngăn cuộn trang bên dưới

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

(2) và xóa thanh cuộn

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

(3) dọn dẹp khi phương thức bị loại bỏ

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

Nếu phương thức không phải là toàn màn hình thì hãy áp dụng các ràng buộc .modal cho lớp phủ toàn màn hình.


4
Điều này cũng ngăn cuộn trong phương thức.
Daniel

Vấn đề tương tự. Bạn đã tìm thấy một giải pháp? @Daniel
AlexioVay

@Vay Sắp xếp của. Hãy xem cái này: blog.christoffer.me/ từ
Daniel

1

Giải pháp của tôi cho Bootstrap 3:

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

bởi vì đối với tôi, chỉ có duy nhất overflow: hiddentrên body.modal-openlớp không ngăn trang chuyển sang trái do bản gốc margin-right: 15px.


1

Tôi chỉ làm theo cách này ...

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

Nhưng khi thanh cuộn biến mất, nó di chuyển mọi thứ đúng 20px, vì vậy tôi đã thêm

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

ngay sau nó

Làm việc cho tôi.


Điều này chỉ hoạt động nếu phương thức nhỏ hơn kích thước màn hình.
Serge

1

Nếu phương thức là 100% chiều cao / chiều rộng, "mouseenter / left" sẽ hoạt động để dễ dàng bật / tắt cuộn. Điều này thực sự hiệu quả với tôi:

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

đã làm cho tôi

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

1

Tại sao không làm điều đó như Bulma không? Khi phương thức được kích hoạt, sau đó thêm vào html lớp của họ .is-clipped đó là tràn: hidden! Quan trọng; Và đó là nó.

Chỉnh sửa: Okey, Bulma có lỗi này, vì vậy bạn cũng phải thêm những thứ khác như

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

1

Vì đối với tôi, sự cố này được trình bày chủ yếu trên iOS, tôi cung cấp mã để khắc phục chỉ có trên iOS:

  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

Không có câu trả lời nào ở trên làm việc hoàn hảo cho tôi. Vì vậy, tôi tìm thấy một cách khác mà hoạt động tốt.

Chỉ cần thêm một scroll.(namespace)người biết lắng nghe và bộ scrollTopcủa documentđến mới nhất của giá trị của nó ...

và cũng loại bỏ người nghe trong kịch bản gần gũi của bạ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');

});

cập nhật

có vẻ như, điều này không hoạt động tốt trên chrome. Bất kỳ đề nghị để sửa chữa nó?


0

Điều này làm việc cho tôi:

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

0

Đối với những người thắc mắc làm thế nào để có được sự kiện cuộn cho phương thức bootstrap 3:

$(".modal").scroll(function() {
    console.log("scrolling!);
});
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.