복붙노트

[JQUERY] 모달 열 스크롤에서 방지 BODY

JQUERY

모달 열 스크롤에서 방지 BODY

해결법


  1. 1.부트 스트랩의 모달 자동으로 모달 오픈 모달 대화 상자가 표시 될 때 몸과 삭제합니다을 클래스 대화 상자가 숨겨져 때 추가합니다. 그러므로 당신은 당신의 CSS에 다음을 추가 할 수 있습니다 :

    부트 스트랩의 모달 자동으로 모달 오픈 모달 대화 상자가 표시 될 때 몸과 삭제합니다을 클래스 대화 상자가 숨겨져 때 추가합니다. 그러므로 당신은 당신의 CSS에 다음을 추가 할 수 있습니다 :

    body.modal-open {
        overflow: hidden;
    }
    

    당신은 위의 코드를 부트 스트랩 CSS 코드 기반에 속한다는 것을 주장 할 수 있지만,이 사이트에 추가 할 수있는 쉬운 수정 프로그램입니다.

    2013 년 2월 8일 업데이트 이것은 이제 트위터 부트 스트랩 V에서 작동이 중지 없다 2.3.0 -. 더 이상 몸에 모달 오픈 클래스를 추가 할 수 있습니다.

    해결 방법은 모달이 닫힐 때 모달에 대해 표시 할 때 몸에 클래스를 추가하고 제거하는 것입니다 :

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

    업데이트 11 일 2013 년 3 월 모달 오픈 클래스처럼 보인다는 명시 적으로 스크롤을 방지하기위한 목적으로, 부트 스트랩 3.0에 반환합니다 :

    모덜 섹션을 확인 - https://github.com/twitter/bootstrap/pull/6342이를 참조하십시오.


  2. 2.허용 대답은 (적어도 / 사파리 7 승 아이폰 OS 7) 모바일에서 작동하지 않습니다와 나는 MOAR 자바 스크립트 CSS 할 것 내 사이트에서 실행하지 않습니다.

    허용 대답은 (적어도 / 사파리 7 승 아이폰 OS 7) 모바일에서 작동하지 않습니다와 나는 MOAR 자바 스크립트 CSS 할 것 내 사이트에서 실행하지 않습니다.

    이 CSS는 모달 아래 스크롤에서 배경 페이지를 방지 할 수 있습니다 :

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

    그러나, 그것은 또한 약간의 사이드를-영향이 본질적으로 정상에 스크롤의. 위치 : 절대 리졸이 있지만, 재 소개 모바일 스크롤 할 수있는 능력.

    당신이 당신의 뷰포트 알고있는 경우에 (의 <몸>에 뷰포트를 추가 내 플러그인을) 당신은 위치에 대한 CSS를 토글을 추가 할 수 있습니다.

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

    또한 조동사 표시 / 숨기기 때 바로 점프 / 왼쪽에서 기본 페이지를 방지하려면이 옵션을 추가 할 수 있습니다.

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

    이 대답은 X-게시물입니다.


  3. 3.단순히 몸 오버 플로우를 숨기고 그것은 몸이 스크롤하지 있습니다. 당신이 모달을 숨길 때, 자동으로 되돌립니다.

    단순히 몸 오버 플로우를 숨기고 그것은 몸이 스크롤하지 있습니다. 당신이 모달을 숨길 때, 자동으로 되돌립니다.

    여기에 코드입니다 :

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

  4. 4.당신은 오버 플로우와 창 크기에 신체 사이즈 설정을 시도 할 수 : 숨겨진 모달이 열려있을 때

    당신은 오버 플로우와 창 크기에 신체 사이즈 설정을 시도 할 수 : 숨겨진 모달이 열려있을 때


  5. 5.당신은 그렇지 않으면 당신은 문서 리플 로우를 볼 수 있습니다, 스크롤 바 @ charlietfl의 대답 및 계정을 넘어 이동해야합니다.

    당신은 그렇지 않으면 당신은 문서 리플 로우를 볼 수 있습니다, 스크롤 바 @ charlietfl의 대답 및 계정을 넘어 이동해야합니다.

    http://jdsharp.us/jQuery/minute/calculate-scrollbar-width.php 고무시키는 :


  6. 6.경고 : 해당 버전에 스크롤하는 것은 명시 적으로 모달 자체에 국한 되었기 때문에 아래 옵션은 부트 스트랩 v3.0.x 관련이 없습니다. 당신이 비활성화 휠 이벤트 경우에 당신은 실수로 뷰포트의 높이보다 더 큰 높이를 가지고 조동사의 내용을 볼 수 일부 사용자를 방지 할 수 있습니다.

    경고 : 해당 버전에 스크롤하는 것은 명시 적으로 모달 자체에 국한 되었기 때문에 아래 옵션은 부트 스트랩 v3.0.x 관련이 없습니다. 당신이 비활성화 휠 이벤트 경우에 당신은 실수로 뷰포트의 높이보다 더 큰 높이를 가지고 조동사의 내용을 볼 수 일부 사용자를 방지 할 수 있습니다.

    스크롤 이벤트는 취소 할 수 없습니다. 그러나 마우스 휠과 휠 이벤트를 취소 할 수 있습니다. 큰주의해야 할 점은 모든 기존 브라우저 게코 17.0에서 후자, 모질라 최근에 추가 지원을 지원한다는 것입니다. 나는 전체 확산을 모르겠지만, IE6 + 및 크롬을 지원하지.

    여기를 활용하는 방법은 다음과 같습니다

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

  7. 7.내가 위로 스크롤 뒷면에 페이지를하지 않았기 때문에, 단지 CSS를 변경하여 크롬에서 작동 할 수 없습니다. 이 가공 한 고급 :

    내가 위로 스크롤 뒷면에 페이지를하지 않았기 때문에, 단지 CSS를 변경하여 크롬에서 작동 할 수 없습니다. 이 가공 한 고급 :

    $("#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);
    });
    

  8. 8.이걸로 해봐:

    이걸로 해봐:

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

    나를 위해 일했다. (지지체 IE8)


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

  10. 10.

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

    도움이 되었기를 바랍니다...


  11. 11.클래스를 추가 또는 자바 스크립트로 body 태그의 스타일을 변경하는 '모달-열린'괜찮 및 가정으로 작동합니다. 그러나 몸이 오버 플로우 될 때 우리가 거의 얼굴 인 문제 : 숨겨진, 그것은 (scrollTop이 0이 될 것이다), 상단으로 이동합니다. 이것은 사용성 문제가 나중에 될 것입니다.

    클래스를 추가 또는 자바 스크립트로 body 태그의 스타일을 변경하는 '모달-열린'괜찮 및 가정으로 작동합니다. 그러나 몸이 오버 플로우 될 때 우리가 거의 얼굴 인 문제 : 숨겨진, 그것은 (scrollTop이 0이 될 것이다), 상단으로 이동합니다. 이것은 사용성 문제가 나중에 될 것입니다.

    대신 변경 body 태그 오버 플로우의이 문제에 대한 해결책으로 : HTML 태그에 숨겨진 변화를

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

  12. 12.이 코드에 대해 잘 모르겠지만, 그것은 가치가 탄입니다.

    이 코드에 대해 잘 모르겠지만, 그것은 가치가 탄입니다.

    jQuery를에 :

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

    내가 전에 말했듯이, 나는 100 % 확실하지 않다 어쨌든보십시오.


  13. 13.이러한 답변의 대부분의 지역에서 사용되는 솔루션 : 가장 좋은 방법은 CSS 전용 몸 {숨겨진 오버 플로우}입니다. 어떤 대답도 사라지는 스크롤에 의한 "점프"를 방지하는 수정 프로그램을 제공한다; 그러나, 아무도는 너무 우아한 없었다. 그래서, 나는이 두 가지 기능을 쓰고, 그들은 꽤 잘 작동하는 것.

    이러한 답변의 대부분의 지역에서 사용되는 솔루션 : 가장 좋은 방법은 CSS 전용 몸 {숨겨진 오버 플로우}입니다. 어떤 대답도 사라지는 스크롤에 의한 "점프"를 방지하는 수정 프로그램을 제공한다; 그러나, 아무도는 너무 우아한 없었다. 그래서, 나는이 두 가지 기능을 쓰고, 그들은 꽤 잘 작동하는 것.

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

    사용에서 볼이 jsFiddle를 확인하십시오.


  14. 14.년 11 월 2017으로 크롬은 새로운 CSS 속성을 도입

    년 11 월 2017으로 크롬은 새로운 CSS 속성을 도입

    동작을 스크롤에 대해 : 포함;

    이는 기입으로 크로스 브라우저 지원이 제한되지만이 문제를 해결한다.

    자세한 내용 및 브라우저 지원에 대한 링크 아래 참조


  15. 15.몸에,하지 작업 (하지 적어도 내 경우에는)가 정상에 웹 사이트 스크롤을 만들 것 때문에 : 많은 사람들이 "숨겨진 오버 플로우"를 제안한다.

    몸에,하지 작업 (하지 적어도 내 경우에는)가 정상에 웹 사이트 스크롤을 만들 것 때문에 : 많은 사람들이 "숨겨진 오버 플로우"를 제안한다.

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

    이 작업에 모달의 스크롤을하고, 동시에 스크롤에서 웹 사이트를 방지 할 수 있습니다.


  16. 16.다음과 같은 논리를 사용할 수, 나는 그것을 테스트는 (심지어 IE에서) 작동

    다음과 같은 논리를 사용할 수, 나는 그것을 테스트는 (심지어 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>
    

  17. 17.나는 확실히이 부트 스트랩하지만 가치 시도와 함께 작동합니다 100 % 아니에요 - 그것은 GitHub의에서 찾을 수있는 Remodal.js와 함께 일 : http://vodkabears.github.io/remodal/하고 방법에 대한 감각을 만들 것 꽤 유사합니다.

    나는 확실히이 부트 스트랩하지만 가치 시도와 함께 작동합니다 100 % 아니에요 - 그것은 GitHub의에서 찾을 수있는 Remodal.js와 함께 일 : http://vodkabears.github.io/remodal/하고 방법에 대한 감각을 만들 것 꽤 유사합니다.

    가기 페이지 점프를 중지하고 또한 내용의 오른쪽 시프트를 방지 모달 해고 할 때 몸에 클래스를 추가하고 이러한 CSS 규칙을 설정하려면 :

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

    정적 및 높이 : 자동 오른쪽에있는 내용의 점프를 중지 결합은 위치입니다. 오버 플로우-Y : 숨겨진; 모달 뒤에 스크롤되는 것을 페이지를 중지합니다.


  18. 18.이 바이올린을 바탕으로 : http://jsfiddle.net/dh834zgw/1/

    이 바이올린을 바탕으로 : http://jsfiddle.net/dh834zgw/1/

    (jQuery를 사용하여) 다음 코드는 윈도우 스크롤을 사용하지 않도록 설정합니다 :

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

    그리고 당신의 CSS에서 :

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

    당신이 모달를 제거 이제 때, html 태그에 noscroll 클래스를 제거하는 것을 잊지 마세요 :

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

  19. 19.답변의 슬프게도 아무도 위의 내 문제를 해결하지 않습니다.

    답변의 슬프게도 아무도 위의 내 문제를 해결하지 않습니다.

    내 상황에서, 웹 페이지는 원래 스크롤 바있다. 내가 모달을 클릭 할 때마다, 스크롤 바는 사라지지 않습니다 헤더는 조금 오른쪽으로 이동합니다.

    그럼 난 .modal 오픈 추가하려고 {오버 플로우 : 자동;} (대부분의 사람들이 권장된다). 그것은 참으로 문제를 해결 : 내가 모달를 열고 스크롤 막대가 나타납니다 후. 그러나 또 다른 부작용 "는 조금 왼쪽으로 헤더 아래 배경 모달 뒤에 다른 긴 줄과 함께 이동합니다"라는 어느 나온다

    다행히, 내가 추가 한 후 {패딩 오른쪽 :! 0 중요;}, 모든 것이 완벽하게 고정됩니다. 모두 헤더와 본문 배경은 움직이지 않았고 모달은 여전히 ​​스크롤을 유지합니다.

    이이 문제가 계속 붙어있는 사람들을 도울 수 있기를 바랍니다. 행운을 빕니다!


  20. 20.조각의 대부분은 여기에 있습니다,하지만 난 그 박았을 모두 함께 어떤 답을 볼 수 없습니다.

    조각의 대부분은 여기에 있습니다,하지만 난 그 박았을 모두 함께 어떤 답을 볼 수 없습니다.

    이 문제는 삼중입니다.

    (1) 하부 페이지의 스크롤을 방지

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

    (2) 스크롤 바를 제거

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

    (3) 모달 해제 할 때 정리

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

    모달 전체 화면이 아닌 경우 전체 화면 오버레이에 .modal 바인딩을 적용합니다.


  21. 21.부트 스트랩 3에 대한 내 솔루션 :

    부트 스트랩 3에 대한 내 솔루션 :

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

    나를 위해 유일한 오버 플로우 때문에 : 15 픽셀 다음 body.modal 오픈 클래스에 숨겨져 때문에 원래 마진 오른쪽으로 왼쪽으로 이동에서 페이지를 방지하지 않았다.


  22. 22.난 그냥 이런 식으로 일을 ...

    난 그냥 이런 식으로 일을 ...

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

    그러나 스크롤 내가 추가 그래서, 모든 것을 바로 20 픽셀 이동 사라진 경우

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

    똑바로 후.

    나를 위해 작동합니다.


  23. 23.모달 / 폭 "mouseenter / 휴가"100 % 높이 인 경우 쉽게 활성화 / 비활성화 스크롤로 작동합니다. 이건 정말 날 위해 일했다 :

    모달 / 폭 "mouseenter / 휴가"100 % 높이 인 경우 쉽게 활성화 / 비활성화 스크롤로 작동합니다. 이건 정말 날 위해 일했다 :

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

  24. 24.나는 체크 박스 해킹에 의해 생성 된 사이드 바 있었다. 그러나 주요 아이디어는 문서 scrollTop을 저장하고 창을 스크롤하는 동안 변경하지 않는 것입니다.

    나는 체크 박스 해킹에 의해 생성 된 사이드 바 있었다. 그러나 주요 아이디어는 문서 scrollTop을 저장하고 창을 스크롤하는 동안 변경하지 않는 것입니다.

    난 그냥 몸이 '숨겨진 오버 플로우'가되는 페이지 점프처럼하지 않았다.

    window.addEventListener ( '부하', 함수 () { prevScrollTop = 0을하자; isSidebarVisible이 거짓 =하자; document.getElementById를 ( 'F-오버레이 chkbx').하여 addEventListener ( '변화'(이벤트) => { prevScrollTop = window.pageYOffset || document.documentElement.scrollTop; isSidebarVisible는 = event.target.checked; window.addEventListener ( '스크롤'(이벤트) => { 경우 (isSidebarVisible) { window.scrollTo (0, prevScrollTop); } }); }) });


  25. 25.나를 위해 일한

    나를 위해 일한

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

  26. 26.왜 부르마가하는대로 그렇게하지? ! 모달가 활성되면 다음 자신의 클래스가 오버 플로우되는-클립 됐나 HTML로 추가 숨겨진 중요합니다; 그리고 그게 다야.

    왜 부르마가하는대로 그렇게하지? ! 모달가 활성되면 다음 자신의 클래스가 오버 플로우되는-클립 됐나 HTML로 추가 숨겨진 중요합니다; 그리고 그게 다야.

    편집 : 당신이 같은 다른 일을 추가해야합니다, 그래서 좋아요는, 부르마,이 버그가

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

  27. 27.나를 위해이 문제가 iOS에서 주로 발표 이후, 나는 단지 iOS에서 그 문제를 해결하는 코드를 제공합니다 :

    나를 위해이 문제가 iOS에서 주로 발표 이후, 나는 단지 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;
        });
      }
    

  28. 28.위의 답변 중 아무도 나를 위해 완벽하게 작동하지 않습니다. 그래서 잘 작동 다른 방법을 발견했다.

    위의 답변 중 아무도 나를 위해 완벽하게 작동하지 않습니다. 그래서 잘 작동 다른 방법을 발견했다.

    그냥 값의 최신에 문서의 스크롤. (네임 스페이스) 리스너 및 설정 scrollTop을 추가 ...

    또한 친한 스크립트에서 리스너를 제거합니다.

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

    이 크롬에서 잘 작동하지 않는 것 같다. 어떤 제안은 그것을 해결하기 위해?


  29. 29.이것은 나를 위해 일한 :

    이것은 나를 위해 일한 :

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

  30. 30.어떻게 부트 스트랩 3 모달의 스크롤 이벤트를 얻는 방법 궁금 사람들을 위해 :

    어떻게 부트 스트랩 3 모달의 스크롤 이벤트를 얻는 방법 궁금 사람들을 위해 :

    $(".modal").scroll(function() {
        console.log("scrolling!);
    });
    
  31. from https://stackoverflow.com/questions/9538868/prevent-body-from-scrolling-when-a-modal-is-opened by cc-by-sa and MIT license