부트 스트랩 3 모달이 실행되고 페이지가 일시적으로 왼쪽으로 이동 함 / 브라우저 스크롤 막대 문제


78

저는 Bootstrap 3.1.0을 사용하는 사이트에서 작업하고 있습니다.

모달 창이 열리면 브라우저 스크롤 막대가 잠시 사라졌다가 다시 돌아옵니다. 닫을 때도 마찬가지입니다.

브라우저 스크롤 막대 상호 작용없이 열리고 닫히도록 어떻게 만들 수 있습니까? 사람들이 문제를 겪고있는 스택의 게시물을 보았지만 내 문제에 대한 구체적인 답변을 찾을 수 없습니다. 따라서 다른 사람이이 요청을했고 누군가가이 요청에 대해 알고 있고 나를 연결하고 싶어한다면 감사하겠습니다. 그것. 게시하기 전에 약 2 시간 동안 검색했습니다.


분명히이 문제는 부트 스트랩 3.2.0 버전에서 수정되었습니다.
devius

3
분명히 아닙니다 (2016). 수락 된 답변이 최선의 답변이 아니므로 향후 독자는 투표별로 답변을 정렬해야합니다. 참조 이 대답 그리고 아마도 또한 이 한
cssyphus

아직 3.3.6이 수정되지 않았으므로 @gibberish를 알려 주셔서 감사합니다!
arjs

2017 년에는 작동 합니다 .
lowtechsun

답변:


22

이것은 내가이 문제에 대해 검색 할 때 github에서 찾은 것이고 나를 위해 잘 작동합니다.

js :

    $(document).ready(function () {
    $('.modal').on('show.bs.modal', function () {
        if ($(document).height() > $(window).height()) {
            // no-scroll
            $('body').addClass("modal-open-noscroll");
        }
        else {
            $('body').removeClass("modal-open-noscroll");
        }
    });
    $('.modal').on('hide.bs.modal', function () {
        $('body').removeClass("modal-open-noscroll");
    });
})

cssnav-fixed-topnavbar-fixed-bottom 이있는 경우이 CSS를 사용합니다 .

body.modal-open-noscroll
{
    margin-right: 0!important;
    overflow: hidden;
}
.modal-open-noscroll .navbar-fixed-top, .modal-open .navbar-fixed-bottom
{
    margin-right: 0!important;
}

또는 navbar-default가있는 경우이 CSS를 사용하십시오.

body.modal-open-noscroll 
{
  margin-right: 0!important;
  overflow: hidden;
}
.modal-open-noscroll .navbar-default, .modal-open .navbar-default 
{
  margin-right: 0!important;
}

4
나를 위해 일하지만 난 패딩 - 오른쪽 여백 오른쪽을 변경했다
GhostRider

@GhostRider : 감사합니다. 나는 여백에 여백을 두어야했다.
Brian Kates

또한 고정 상단 / 고정 하단 수정에 대해 하나를 추가했지만이 시나리오에서는 다른 답변이 작동하지 않았습니다.
Tino Mclaren 2015 년

1
@FutureReaders ben.kaminski의 답변 , 아래에는 허용되는 답변이어야하는 단일 행 CSS 솔루션이 있습니다.
cssyphus

92
.modal {
 overflow-y: auto;
}

.modal-open {
 overflow: auto;
}

그것을 제거 할 것입니다. 모달이 더 반응 적으로 작동하도록 추가되었으므로 화면이 너무 짧으면 아래로 스크롤하여 모달을 볼 수 있습니다. 또한 모달이 작동하는 동안 배경이 스크롤되지 않도록합니다. 해당 기능이 필요하지 않으면 내가 게시 한 CSS를 사용할 수 있습니다.

추가 정보 : 본문에 .modal-open을 설정하여 본문의 모든 스크롤을 방지하고 본문 스크롤바를 숨 깁니다. 그런 다음 모달이 나타나면 전체 화면을 차지하는 어두운 배경이 있고 overflow-y가 있습니다. 어두운 배경과 나머지 부분을 참조하십시오.


11
데스크톱 용 미디어 쿼리에만 해당 CSS를 포함 할 수 있으므로 모바일에서 더 나은 부 스트랩 3 스타일을 사용할 수 있습니다.
cjd82187 2013

1
이제 페이지가 왼쪽으로 이동하지 않지만 이제 더 많은 수직 스크롤 막대가 있습니다 !!!.
Laxman 2014-06-19

1
작동하지만 두 번째 스크롤 막대를 추가합니다.
emzero

완전한. 빠르고 쉽습니다. 감사합니다
coggicc 2015

2
또한 패딩을 추가 , .modal-open { overflow: auto; padding-right: 0px !important; }@의 ben.kaminski가 완전히 왼쪽으로 문제를 이동 없애는있는 말했듯이. 희망이 도움이됩니다.
Shaiju T

74

왼쪽 이동 문제를 해결하려면 CSS 만 사용하면됩니다.

.modal-open[style] {
padding-right: 0px !important;
}

코드에있는 인라인 스타일을 덮어 쓰는 것입니다. 나는 WordPress 빌드에서 내 것을 사용하고 있으며 인라인 스타일이 본문에 적용되었습니다. 다음과 같이 보였습니다.

<body class="home blog logged-in modal-open" style="padding-right: 15px;">

이것이 누군가를 돕기를 바랍니다!


IE에서도 같은 문제가 발생했습니다. 패딩 오른쪽 스타일을 추가합니다. 수직 스크롤바를 강제하기 때문일 수 있습니다. 어쨌든이 문제가 해결되었습니다. 감사합니다!
slopapa 2014 년

감사합니다 Ben-이것도 저를 도왔습니다!
DaniB

6
이것은 위의 overflow : auto fix와 결합되어 나를 위해 트릭을 수행합니다.
DPac

2
2016 년에도 작동합니다 (오버플로도 고려할 때). 정말 감사합니다!
arjs

1
이것은 2020 년에 받아 들여진 대답이 될 것입니다. 감사합니다!
Nick Van Brunt

39
.modal {
    overflow-y: auto;
}

.modal-open {
    overflow: auto;
}

.modal-open[style] {
    padding-right: 0px !important;
}

ben과 cjd에게 감사드립니다.

위의 코드는 나를 위해 작동하는 것 같습니다.


나는 이것이 실제 답변이 아니라고 생각하며 아직 댓글을 달 수 없기 때문에 게시했습니다. 그러나 기다려주십시오.
Cem Özer 2015

2016 년에 저를 위해 일했습니다! 감사합니다
GhostRider

2017 및 Bootstrap 4는 여전히 모달과 함께 약간의 변화가 있습니다. 그래도 문제가 해결됩니다. 감사합니다!
DaveK

부트 스트랩 4.2.1을 사용하면이 문제가 여전히 남아 있으며이 답변으로 해결되었습니다. 감사합니다!
ellaRT '1910.09

8

이것은 부트 스트랩에보고 된 문제입니다 : https://github.com/twbs/bootstrap/issues/9855

그리고 이것은 내 임시 빠른 수정이며 자바 스크립트 만 사용하여 고정 상단 탐색 모음을 사용하여 작동합니다. 페이지와 함께이 스크립트를로드하십시오.

$(document.body)
.on('show.bs.modal', function () {
    if (this.clientHeight <= window.innerHeight) {
        return;
    }
    // Get scrollbar width
    var scrollbarWidth = getScrollBarWidth()
    if (scrollbarWidth) {
        $(document.body).css('padding-right', scrollbarWidth);
        $('.navbar-fixed-top').css('padding-right', scrollbarWidth);    
    }
})
.on('hidden.bs.modal', function () {
    $(document.body).css('padding-right', 0);
    $('.navbar-fixed-top').css('padding-right', 0);
});

function getScrollBarWidth () {
    var inner = document.createElement('p');
    inner.style.width = "100%";
    inner.style.height = "200px";

    var outer = document.createElement('div');
    outer.style.position = "absolute";
    outer.style.top = "0px";
    outer.style.left = "0px";
    outer.style.visibility = "hidden";
    outer.style.width = "200px";
    outer.style.height = "150px";
    outer.style.overflow = "hidden";
    outer.appendChild (inner);

    document.body.appendChild (outer);
    var w1 = inner.offsetWidth;
    outer.style.overflow = 'scroll';
    var w2 = inner.offsetWidth;
    if (w1 == w2) w2 = outer.clientWidth;

    document.body.removeChild (outer);

    return (w1 - w2);
};

다음은 작업 예제입니다. http://jsbin.com/oHiPIJi/64


최신 버전의 Chrome, Firefox 및 Opera에서 테스트 된 최신 버전의 Bootstrap에서 잘 작동합니다. Safari 또는 IE로 보지 않았습니다.
lowtechsun

정확히 내가 필요한 것. 저것과 이것 : .modal { overflow: auto; } .modal-open { overflow: auto; } .modal-open[style] { padding-right: 0px !important; } 나는 다른 모달에서 모달을 발사하려고했는데 시프트가 두 배가되었습니다. 팁 주셔서 감사합니다.
Aelys

7

navbar를 고정하고 모달이 열릴 때 본문을 맨 위로 스크롤하지 않으려면이 스타일을 사용하십시오.

.modal-open {
    overflow: visible;
}
.modal-open, .modal-open .navbar-fixed-top, .modal-open .navbar-fixed-bottom {
    padding-right:0px!important;
}

7

이 페이지의 어떤 항목도 버전 3.3.4 및 3.3.5에서 저에게 효과가 없었습니다.이 CSS를 추가하면 문제가 해결되었습니다.

body {
padding-right:0px !important;
margin-right:0px !important;
}

5

페이지가 오른쪽으로 이동하는 문제를 해결하려면

html, body{
  padding: 0 !important;
}


글쎄, 스 니펫은 실제로 아무것도 표시하지 않습니다. 당신이 준 것의 효과를 보여주기 위해 몇 가지 색깔의 블록을 추가하십시오.
Al.G.

이것은 다른 overflow-y:auto응답이 아닌 나를 위해 일한 것입니다 .
유전자 b.

나를 위해 일했습니다. 다른 솔루션은 그렇지 않았습니다.
빌리 레이 발렌타인

4
$('body').on('show.bs.modal', function () {
    if ($("body").innerHeight() > $(window).height()) {
        $("body").css("margin-right", "17px");
    }
}); 

$('body').on('hidden.bs.modal', function (e) {
    $("body").css("margin-right", "0px");
});

이 작은 수정은 모달이 표시 될 때 스크롤바를 시뮬레이션하여 본문에 오른쪽 여백을 추가합니다.


1
스크롤바 너비가 브라우저마다 다르기 때문에 Margin-right는 고정 된 픽셀 값을 가져서는 안됩니다.
lowtechsun

스크롤바 너비도 브라우저 확대 / 축소에 따라 변경됩니다. 같은 스크롤 크기 검색 스크립트와 함께이 스크립트를 사용해야
쿠날

4

이 솔루션은 나를 위해 작동합니다 !!!!

.modal {
 overflow-y: auto;
}

.modal-open {
 overflow: auto;
}


.modal-open[style] {
padding-right: 0px !important;
}

4

위의 어느 것도 효과가 없었고 다른 시간의 연구도있었습니다. 그러나 다음 코드는 약간의 CSS만으로 완벽하게 작동했습니다. 위는 인라인 스타일 padding : 17px를 제거하지 않습니다. JS 또는 jquery를 사용하면 0 패딩을 추가 할 수 있지만 효과가 없습니다.

.modal-open {
  padding-right: 0px !important;
  overflow-y: scroll;
  width: 100%;
  display: block;
}

.modal {
  position: fixed;
  top: 0;
  left: 0;
  z-index: 1050;
  display: none;
  width: 100%;
  height: 100%;
  outline: 0;
  padding-right: 0 !important;
}

이렇게하면 모달이 열릴 때 스크롤 막대가있는 페이지에 두 번째 스크롤 막대가 있습니다. 열린 모달에 두 번째 모달이있는 경우 두 번째 모달을 닫은 후 첫 번째 모달의 스크롤 막대가 사라집니다.
Lacek

3

html, body{
    padding-right: 0px !important; 
    position: relative!important;
}

이 코드를 시도해보십시오.


이 그것을 해결하기 위해 대부분의 beautifull의 방법은 아니지만,이 작업을 수행
샌더 밴 Keer

단지 한 많은 다른 일을 방해 할 수 내 몸의 스타일을 조정 모달 필요가있는 문제를 해결하지만, 지옥이 나를 위해 일합니다
SAYYED 압바스 Rizvi에게


3

Bootstrap 4에서이 문제가 발생했습니다. 문제가 html { overflow-y: scroll; }있다고 생각하지만 .modal-open[style] { padding-right: 0px !important; }로컬 CSS 파일에 추가 하면 모든 것이 완벽하게 작동합니다!

.modal-open[style] { 
    padding-right: 0px !important; 
}


나를 위해 완벽 근무, 감사합니다 :) 그런데 : 당신은 또한 사용할 수있는 padding-right: 0;대신 padding-right: 0px최대 효율
야니 쉬

2

제 경우에는 body 태그가 이미 overflow:hidden.

모달 대화 상자가 열리면 padding-right:17px;본문 에도 추가 됩니다.

여기 내 코드

.modal-open {
  overflow: hidden!important;
  padding-right:0!important
}

1

내 페이지는 모달이 표시 될 때 변경되지 않도록 Agni Pradharma 코드의 수정 된 버전이 필요했습니다. 고정 탐색 헤더와 스크롤이있는 일부 페이지가 있고 일부는 없습니다. 여기 데모 : http://jsbin.com/gekenakoki/1/

두 CSS를 모두 사용했습니다.

.modal {
    overflow-y: auto;
}

.modal-open {
    overflow: auto;
} 

및 스크립트 :

$(document.body)
.on('show.bs.modal', function () {
    if (this.clientHeight <= window.innerHeight) {
        return;
    }
    // Get scrollbar width
    var scrollbarWidth = getScrollBarWidth();
    if (scrollbarWidth) {
        $(document.body).css('padding-left', scrollbarWidth); 
    }
})
.on('hidden.bs.modal', function () {
    $(document.body).css('padding-left', 0);
});

function getScrollBarWidth () {
    var inner = document.createElement('p');
    inner.style.width = "100%";
    inner.style.height = "200px";

    var outer = document.createElement('div');
    outer.style.position = "absolute";
    outer.style.top = "0px";
    outer.style.left = "0px";
    outer.style.visibility = "hidden";
    outer.style.width = "200px";
    outer.style.height = "150px";
    outer.style.overflow = "hidden";
    outer.appendChild (inner);

    document.body.appendChild (outer);
    var w1 = inner.offsetWidth;
    outer.style.overflow = 'scroll';
    var w2 = inner.offsetWidth;
    if (w1 == w2) w2 = outer.clientWidth;

    document.body.removeChild (outer);

    return (w1 - w2);
};

이것은 작동하지 않습니다. 바이올린을 변경하여 수직 스크롤을 트리거해도 시프트가 계속 나타납니다.
Archimedes Trajano

1

Bootstrap 3.3.2부터는 대화 상자가 표시 될 때 스크롤 막대가 제거되고 Bootstrap이 이전에 스크롤 막대가 차지한 공간을 보완하기 위해 body 요소에 오른쪽 패딩을 추가하는 동작이 나타납니다. 불행히도 이것은 적어도 최신 버전의 Chrome, IE, Firefox 또는 Safari에서 화면 이동을 방지하지 않습니다. 여기에있는 수정 중 어느 것도이 문제를 완전히 수정하지 않지만 ben.kaminski의 답변과 cjd82187의 답변 일부를 결합하면 CSS만으로 문제가 해결됩니다.

/* removes inline padding added by Boostrap that makes the screen shift left */
.modal-open[style] {
    padding-right: 0px !important;
}

/* keeps Bootstrap from removing the scrollbar if it's there */
.modal-open {
    overflow: auto;
}

ben.kaminski가 언급했듯이이 코드는 Twitter Bootstrap에 추가되었으므로 화면 하단에있을 경우 스크롤하여 모달을 볼 수 있습니다. 이 기능을 유지하려면 다음과 같이 큰 뷰포트에만 적용되도록 미디어 쿼리에 CSS 솔루션을 래핑 할 수 있습니다.

@media (min-width: 992px) {         
    .modal-open[style] {
        padding-right: 0px !important;
    }

    .modal-open {
        overflow: auto;
    }   
}

1

이 간단한 솔루션 구현

.modal-open {

  padding-right: 0 !important;

}

html {

  overflow-y: scroll !important;

}

1

들어 부트 스트랩-4.3.x에서 다음과 같은 CSS를 사용 :

.modal-open {
    padding-right: 0 !important;
}

/* if you have .navbar in your page then add padding-right for your .navbar (default is 16px) */
.modal-open .navbar {
    padding-right: 16px !important;
}

그게 다야. 몇 가지를 추가하는 자바 스크립트 코드 : 다른 건처럼 필요하지 않습니다 .class당신의 body스타일에 다음 추가 CSS 코드를.



0

누군가가 react-bootstrap솔루션을 사용 하는 react-bootstrap경우 인라인 스타일을 body요소에 적용 하여 overflowpadding스타일 을 조작 하기 때문에 조금 더 복잡 합니다. 즉, 해당 인라인 스타일을!important

body.modal-open {
  // enable below if you want to additionally allow scrolling with the modal displayed
  // overflow: auto !important;

  // prevent the additional padding from being applied
  padding: 0 !important;
}

참고 :overflow스타일의주석 처리를 제거하여 스크롤링을 활성화하지 않으면 (예 : 스크롤바 표시)페이지 콘텐츠가 스크롤바 너비만큼 이동하는 것처럼 보입니다 (스크롤바가 이전에 표시되었던 경우).


0

내 Jquery 솔루션 :

var nb = $('nav.navbar-fixed-top');
$('.modal')
    .on('show.bs.modal', function () {
        nb.width(nb.width());
    })
    .on('hidden.bs.modal', function () {
        nb.width(nb.width('auto'));
    });

0

Bootstrap 버전 3.2.0의 경우 css 파일 채우기의이 줄은 오류를 수정합니다.

.modal-open .navbar-fixed-top,
.modal-open .navbar-fixed-bottom {
padding-right: 17px;
}

여기 에서 찾은 솔루션


0

저에게 가장 좋은 해결책은이 설정을 사용하는 것입니다. 웹 및 모바일에서 작동합니다.

.modal-open {
   overflow: hidden;
   position: absolute;
   width: 100%;
   height: 100%;
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.