부트 스트랩 모달은 닫은 후에도 몸에 패딩을 계속 추가합니다.


100

저는 부트 스트랩과 Parse 프레임 워크를 사용하여 작은 웹앱을 구축하고 있습니다. 그러나 이러한 부트 스트랩 모달은 닫은 후에도 몸체에 패딩을 계속 추가합니다. 이것을 해결하는 방법?

이 코드를 내 자바 스크립트에 넣으려고했습니다.

$('.modal').on('hide.bs.modal', function (e) {
    $("element.style").css("padding-right","0");
});


하지만 작동하지 않습니다. 아무도 이것을 고치는 방법을 알고 있습니까?

내 코드 :

        <button type="button" class="btn btn-lg btn-default" data-toggle="modal" data-target="#loginModal">Admin panel</button>

         <div id="loginModal" class="modal fade" role="dialog">
                  <div class="modal-dialog modal-sm">

                    <!-- Modal content -->
                    <div class="modal-content">

                      <!-- header -->
                      <div class="modal-header"> 
                        <button type="button" class="close" data-dismiss="modal">&times;</button>
                        <h4 class="modal-title">Login</h4>
                      </div>

                      <!-- body -->
                      <div class="modal-body text-center" >
                          <input class='form-control' type="text" id="userName" placeholder="Username" ng-model='username'>
                          <input class='form-control' type="password" id="password" placeholder="Password" ng-model='password'>

                      <div class="modal-footer">
                        <button type="button" class="btn btn-default" id="loginButton" ng-click="goToAdminPanel()">Login</button>
                        <button type="button" class="btn btn-default" data-dismiss="modal" id="closeButton">Close</button>
                      </div>

                    </div>

                 </div>
                </div>
           </div>

        <div id="adminPanel" class="modal fade" role="dialog">
                  <div class="modal-dialog modal-lg">

                    <!-- Modal content -->
                    <div class="modal-content">

                      <!-- header -->
                      <div class="modal-header"> 
                        <button type="button" class="close" data-dismiss="modal">&times;</button>
                        <h4 class="modal-title">Admin Panel</h4>
                      </div>

                      <!-- body -->
                      <div class="modal-body" >

                        </div>

                      <div class="modal-footer">
                        <button type="button" class="btn btn-default" id="saveButton">Save</button>

                        <button type="button" class="btn btn-default" data-dismiss="modal" id="closeButton">Close</button>



                    </div>

                 </div>
                </div>
           </div>


    $scope.goToAdminPanel = function(){
    Parse.User.logIn($scope.username,$scope.password,{
        success: function(user){
            $('#loginModal').modal('hide');
            $('#adminPanel').modal();
        },
        error: function(user, error) {
            alert('Wrong username and/or password');
        }
    });
}

저는 부트 스트랩과 Parse 프레임 워크를 사용하여 작은 웹앱을 구축하고 있습니다. 그러나 이러한 부트 스트랩 모달은 닫은 후에도 몸체에 패딩을 계속 추가합니다. 이것을 해결하는 방법?


2
단지 추가하지 그 padding-right뿐만 아니라 같은 클래스를 추가 modal-open하기위한 overflow: hidden자사의 단지 숨기는 스크롤 바를 .
vivekkupadhyay 2015 년

안녕하세요 @vivekkupadhyay, 나는 무시하려고 노력 modal-open으로 padding-right:0 !important;하지만, 당신은 왜 일 알고 있습니까?
phuwin

아래 내 대답을 확인하십시오. 확실히 도움이됩니다.
vivekkupadhyay 2015 년

거의 알았습니다. padding-right올바른 이벤트 에서 CSS 속성 업데이트를 실행하고 있지만 잘못된 요소에서 실행하고 있습니다. body요소에서 발사되어야합니다 . 아래 내 대답을 확인하십시오.
Sam Malayek

답변:


61

이것은 Bootstrap 모달의 결함 일 수 있습니다. 내 테스트에서 문제는 아직 완전히 닫히지 않은 #adminPanel상태에서 초기화되는 것 같습니다 #loginModal. 해결 방법은 제거하여 애니메이션을 제거 할 수 있습니다 fade에 클래스를 #adminPanel하고 #loginModal호출하기 전에 설정하거나 제한 시간 (~ 500ms로) $('#adminPanel').modal();. 도움이 되었기를 바랍니다.


10
나는 수업 .fade을 제거했고 #loginModal작동합니다.
phuwin

8
이 문제를 해결하고 동시에 모달 애니메이션을 유지하려면 어떻게해야합니까?
Leonardo Montenegro

@LeonardoMontenegro 나는 또한 이것을 원했고 최근에 나는 문제가 애니메이션이 제거되었다는 동일한 질문을 게시했지만 숨기기 직전에 페이드 클래스를 먼저 제거하고 숨기기 직후에 다시 추가하여 문제를 해결했지만 적절한 해결 방법은 아니지만 작동했습니다. 부트 스트랩이 파일 자체에서 수정하지 않는 한 해결책
Kramer

121

나는 방금 아래 CSS 수정을 사용했으며 나를 위해 일하고 있습니다.

body { padding-right: 0 !important }

1
올바른 css 속성이 있지만 hide.bs.modal부트 스트랩 이벤트에서 실행되어야합니다. 아래 내 대답을 확인하십시오.
Sam Malayek

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

방금 변경

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

6
이것이 정답입니다. "페이드 기능을 사용하지 마십시오"는 해결책이 아니라 타협입니다.
Tasgall

1
나도 똑같은 일을했지만 "overflow : auto! important"를 추가해야 할 수도 있습니다. 모달이 표시 될 때 스크롤바도 숨겨져 있기 때문입니다.
Jaigus

저는 페이드 클래스로 모든 모달을 대상으로하기 위해 선택기 ".modal.fade.show"를 사용했습니다.
앤드류 슐츠

같은 스타일을 추가하는 것은 너무 일을 .modal.fade.show합니다
라미 Zebian

감사! modal패널과 body.modal-open패딩이 모두 있었기 때문에 둘 다 필요했습니다 . 그러나 이것은 단지 멋지게 고정
올리버 Schimmer

20

부트 스트랩 기능을 그대로 유지하는 순수한 CSS 솔루션입니다.

body:not(.modal-open){
  padding-right: 0px !important;
}

이 문제는 페이지에 스크롤 막대가있는 경우 모달 창이 열릴 때 약간의 패딩을 추가하는 부트 스트랩 jQuery의 함수로 인해 발생합니다. 그것은 모달이 열릴 때 신체 내용이 이동하는 것을 막고 멋진 기능입니다. 하지만이 버그가 발생합니다.

여기에 제공된 다른 많은 솔루션은 해당 기능을 중단하고 모달이 열릴 때 콘텐츠를 약간 이동시킵니다. 이 솔루션은 콘텐츠를 이동하지 않고 부트 스트랩 모달의 기능을 유지하지만 버그를 수정합니다.


1
누군가 CSS 솔루션을 원하지 않는 이유를 모르겠습니다. JS 솔루션이 필요하지 않습니다. 이것은 좋아 보인다.
Csaba Toth

1
모달을 해제하면 (모달 내부의 Asyc-Postback ) 여전히 이상한 패딩을 유지하기 때문에 이것이 필요했습니다. 그러나 페이지에 스크롤바가있을 때 모든 작업에 대해 @Benjamin Oats 답변도 필요했습니다.
MikeTeeVee

16

padding-right관련된 일 이 더 걱정된다면 이렇게 할 수 있습니다.

jQuery :

$('#loginModal').on('show.bs.modal', function (e) {
     $('body').addClass('test');
});

이것은 addClass당신에게 의지 하고 body이것을 사용하여

CSS :

.test[style] {
     padding-right:0 !important;
 }

그리고 이것은 제거하는 데 도움이 될 것입니다 padding-right.

그러나 숨어있는 것에 대해서도 걱정이된다면 scroll이것도 추가해야합니다.

CSS :

.test.modal-open {
    overflow: auto;
 }

여기에 JSFiddle이 있습니다.

봐주세요, 당신을 위해 트릭을 할 것입니다.


작동하지 않는 것 같습니다. 아니면 내가 뭔가 잘못 했어. 아직 추가 padding-rightbody및의 양을 증가 padding-right15 픽셀로 내가 관리자 패널을 닫을 때마다.
phuwin

방금 귀하의 링크를 확인한 결과 귀하 $(document).ready(function(){코드를 내부에 넣으려는 시도 로 코드가 실행되지 않는 것 같습니다 .
vivekkupadhyay 2015 년

코드 내부에 경고를 넣으면 코드 가 실행되고 있지 않은지 확인할 수 있습니다 . 와 바이올린에 그 작업을 잘 당신이 적절하게 사용도 경우에만 페이지에서 작동합니다
vivekkupadhyay

어떤 이유로 모달이 표시 될 때 코드가 실행되지 않습니다.
phuwin

1
@vivekkupadhyay 노력해 주셔서 감사합니다. 좋은 하루 되세요.
phuwin

13

bootstrap.min.css를여십시오.

이 줄 찾기 (기본값)

.modal-open{overflow:hidden;}

다음과 같이 변경하십시오.

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

사이트의 모든 모달에서 작동합니다. overflow : auto; 할 수 있습니다. 모달 대화 상자를 여는 동안 스크롤바를 그대로 유지하려는 경우.


@Ashok 문제의 원인을 자세히 설명해 주시겠습니까?
dude

6
이 솔루션은 저를 올바른 방향으로 안내했습니다. 그러나 bootstrap.min.css를 수정하는 대신 .modal-open {overflow : auto; padding-right : 0! important;}를 기본 테마 스타일 시트에 넣어서 작동했습니다!
Pratyush Deb

3
부트 스트랩의 CSS를 직접 편집하지 마십시오. 항상 자신의 스타일 시트의 CSS에 재정의를 추가하십시오. @PratyushDeb가 제안한 것처럼.
dotnetengineer

이것은 모달 뒤의 콘텐츠를 스크롤 할 수 있기 때문에 훌륭한 솔루션이 아닙니다. 모달은 사용자가 콘텐츠와 상호 작용해야하기 때문에 콘텐츠를 회색으로 표시합니다.
ubiquibacon 19

11

나는 아주 오랫동안 이와 같은 문제를 겪었습니다. 여기에 대한 답변 중 어느 것도 작동하지 않았습니다! 그러나 다음은 그것을 고쳤습니다!

$(document.body).on('hide.bs.modal,hidden.bs.modal', function () {
    $('body').css('padding-right','0');
});

모달을 닫을 때 발생하는 두 가지 이벤트가 있습니다. 첫 번째 hide.bs.modal는이고 다음은 hidden.bs.modal. 하나만 사용할 수 있어야합니다.


3
hide.bs.modal및 모두에 대한 리스너를 추가했을 때 작동하지 않았습니다 hidden.bs.modal. 그러나 내가 hide.bs.modal청취자로부터 제거되었을 때 완벽하게 작동했습니다 . :)
HariV

반대 투표자에게 :이 답변을 개선 할 수 있도록 의견에 건설적인 비판을 남겨주세요.
Sam Malayek

3

쉬운 수정

이 수업 추가

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

재정의이지만 작동합니다.


1
이 클래스는 @Chasmani가 게시 한 답변과 결합되어 저에게 총체적이고 완전한 솔루션을 만들었습니다. " 이 수업 추가 "라고 말하면 +1합니다 . Bootstrap.css 파일을 재정의하라는 모든 사람의 응답을 읽는 것은 미친 짓입니다. 해당 파일은 그대로두고 " Bootstrap Overrides " 를 적용하는 자체 CSS 파일을 만드십시오 . 이는 중요하므로 부트 스트랩을 업데이트 / 업그레이드 할 때 잃어 버리지 않고 모두 한곳에 문서화하고 새 부트 스트랩 버전으로 업그레이드 한 후 검토 (해결 방법이 필요한지 확인) 할 수 있습니다.
MikeTeeVee

1
@MikeTeeVee가 부트 스트랩 CSS를 편집해서는 안된다는 데 동의합니다. 나는이 질문에 대답하기위한 약간의 범위에서 그를 생각 때문에 나는 내 대답에 그것을 포함하지 않았다
chasmani


2

removeAttr이 작동하지 않습니다. 다음과 같이 CSS 속성을 제거합니다.

        $('.modal').on('hide.bs.modal', function (e) {
            e.stopPropagation();
            $('body').css('padding-right','');
        }); 

속성 값이 없으면 속성이 제거됩니다.


2

기본 부트 스트랩 3.3.0 CSS를로드 중이며 비슷한 문제가 발생했습니다. 이 CSS를 추가하여 해결되었습니다.

body.modal-open { overflow:inherit; padding-right:inherit !important; }

중요한 것은 부트 스트랩 모달 자바 스크립트가 오른쪽에 15px의 패딩을 프로그래밍 방식으로 추가하기 때문입니다. 내 생각 엔 스크롤바를 보상하기위한 것이지만 나는 그것을 원하지 않는다.


2

Bootstrap 4에서 이것은 나를 위해 일했습니다.

$(selector).on('hide.bs.modal', function (e) {
    $('body').css('padding-right','0');
});

1

나는 Bootstrap 3.3.7과 고정 navbar에 대한 솔루션에 동일한 문제가 있습니다.이 스타일을 사용자 정의 CSS에 추가합니다.

.modal-open {
    padding-right: 0px !important;
    overflow-y: scroll;
}

스크롤 창이 계속 작동하는 동안 모달이 표시됩니다. 고마워요, 이것이 당신에게도 도움이되기를 바랍니다.


1

나는 이것이 오래된 질문이라는 것을 알고 있지만 여기의 답변 중 어느 것도 내 비슷한 상황에서 문제를 제거하지 않았으며 일부 개발자가 내 솔루션을 읽는 것이 유용 할 것이라고 생각했습니다.

모달이 열릴 때 여전히 부트 스트랩 3으로 사용되는 웹 사이트에서 본문에 CSS를 추가하는 데 사용합니다.

body.modal-open{
            padding-right: 0!important;
            overflow-y:scroll;
            position: fixed;
        }

1

내 솔루션에는 추가 CSS가 필요하지 않습니다.

@Orland가 지적했듯이 하나의 이벤트는 다른 이벤트가 시작될 때 여전히 발생합니다. 내 솔루션은 첫 번째 이벤트 adminPanel가 완료되었을 때만 두 번째 이벤트 ( 모달 표시)를 시작하는 것입니다 ( loginModal모달 숨기기 ).

아래와 같이 모달 의 hidden.bs.modal이벤트에 리스너를 연결하여이를 수행 할 수 있습니다 loginModal.

$('#loginModal').on('hidden.bs.modal', function (event) {
    $('#adminPanel').modal('show');
}

그리고 필요한 경우 loginModal모달을 숨 깁니다 .

$('#loginModal').modal('hide');

couse의 경우 adminPanel모달 을 표시할지 여부를 결정하기 위해 리스너 내부에 자체 논리를 구현할 수 있습니다 .

여기에서 부트 스트랩 모달 이벤트에 대한 자세한 정보를 얻을 수 있습니다 .

행운을 빕니다.


1

부트 스트랩 모델은 신체가 넘치면 그 패딩을 신체에 오른쪽으로 추가합니다.

부트 스트랩 3.3.6 (내가 사용중인 버전)에서 이것은 body 요소에 패딩 오른쪽을 추가하는 기능입니다 : https://github.com/twbs/bootstrap/blob/v3.3.6/dist/js /bootstrap.js#L1180

빠른 해결 방법은 bootstrap.js 파일을 호출 한 후 해당 함수를 덮어 쓰는 것입니다.

$.fn.modal.Constructor.prototype.setScrollbar = function () { };

이것은 나를 위해 문제를 해결했습니다.



1

이것은 나를 위해 일한 것입니다.

body.modal-open {
    overflow: auto !important;
}

// Bootstrap uses JS to set the element style so you can
// override those styles like this
body.modal-open[style] {
    padding-right: 0px !important;
}

1
Chrome에서 작동합니다! 감사.
Gene Kelly

0

data-target버튼 에서을 제거하고 jQuery를 사용하여 모달을로드하십시오.

<button id='myBtn' data-toggle='modal'>open modal</button>

jQuery :

$("#myBtn").modal('show');

0

부트 스트랩 자바 스크립트를 살펴본 결과 모달 코드 adjustDialog()가 모달 프로토 타입에 정의되고 jQuery에 노출 된 함수에서 올바른 패딩을 설정한다는 것을 발견했습니다 . 이 함수를 재정의하기 위해 어딘가에 다음 코드를 배치하면 아무것도하지 않습니다 (아직 설정하지 않은 결과가 무엇인지 모르겠지만!)

$.fn.modal.Constructor.prototype.adjustDialog = function () { };


0

이것은 문제를 해결할 수 있습니다

.shop-modal.modal.fade.in {
    padding-right: 0px !important;
}


0

모달과 아약스를 사용하여 동일한 문제가 발생했습니다. JS 파일이 첫 페이지와 ajax가 호출 한 페이지 모두에서 두 번 참조 되었기 때문에 모달이 닫힐 때 JS 이벤트를 두 번 호출하여 기본적으로 17px의 패딩 오른쪽을 추가했습니다.


0
body {
    padding-right: 0 !important;
    overflow-y: scroll!important;
}

나를 위해 일했습니다. 스크롤바는 본문에 강제 적용되지만 "스크롤"페이지가있는 경우에는 문제가되지 않습니다 (?)


0
$('.modal').on('hide.bs.modal,hidden.bs.modal', function () {
 setTimeout(function(){
  $('body').css('padding-right',0);
 },1000);
});

이 시도

모달 닫기 후 본문에 0px 오른쪽 패딩을 추가합니다.


0

이전 모달이 아직 완전히 닫히지 않은 모달을 열 때 발생합니다. 수정하려면 모든 모달이 완전히 닫힐 때 새 모달을 열기 만하면 아래 코드를 확인하십시오.

  showModal() {
    let closeModal = $('#your-modal');

    closeModal.modal('hide');
    closeModal.on('hidden.bs.modal', function() {
      $('#new-open-modal').modal('show');
    });
  }

0

나는 이제 이것은 오래되었고 여기에 제공된 모든 솔루션이 작동 할 수 있습니다. 누군가를 도울 수있는 경우를 대비하여 새로운 것을 추가하는 중입니다. 같은 문제가 있었고 모달을 여는 것이 내 sidenav에 여백 권리를 추가한다는 것을 알았습니다 (아마도 본문에 추가 된 패딩에서 일종의 상속). 내 sidenav에 {margin-right : 0! important;}를 추가하면 트릭이 생겼습니다.


-1

(Bootstrap v3.3.7) 내 브라우저 검사기에서 이것이 요소 스타일 속성 에 직접 설정되어 있음을 보았고 마녀가 클래스 속성을 재정의합니다.

모달이 다음과 같이 표시 될 때 paddig-right 값 을 '재설정' 하려고했습니다 .

$("#myModal").on('shown.bs.modal', function(){
    $(this).css({paddingRight:""});
});

그러나 창 크기가 조정되는 즉시 다시 나타납니다 :( (아마도 플러그인 스크립트에서).

이 솔루션은 저에게 효과적이었습니다.

var modal_needfix=true;
$("#myModal").on('shown.bs.modal', function(){
    var modalscope=$(this);
    modalscope.css({paddingRight:""});
    if(modal_needfix){
        window.addEventListener("resize",function(){
            requestAnimationFrame(function(){// be sure to act after the pluggin script
                modalscope.css({paddingRight:""});
            });
        });
        modal_needfix=false;
    }
});

-1

@Orland가 말했듯이 fade와 같은 효과를 사용하는 경우 모달을 표시하기 전에 기다려야합니다. 이것은 약간 해키하지만 트릭을 수행 할 것입니다.

function defer(fn, time) {
    return function () {
        var args = arguments,
            context = this;

        setTimeout(function () {
            fn.apply(context, args);
        }, time);
    };
}

$.fn.modal.Constructor.prototype.show = defer($.fn.modal.Constructor.prototype.show, 350);

-2

이 대답이 필요한 사람이 아직 있기를 바랍니다. bootstrap.js에는 resetScrollbar ()라는 함수가 있습니다. 어리석은 이유로 개발자가 본문의 패딩 오른쪽에 스크롤바 크기를 추가하기로 결정했습니다. 기술적으로 오른쪽 패딩을 빈 문자열로 설정하면 문제가 해결됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.