Bootstrap Modals, kapatıldıktan sonra vücuda dolgu hakkı eklemeye devam eder


101

Küçük bir web uygulaması oluşturmak için bootstrap ve Parse framework kullanıyorum. Ancak bu Bootstrap modları kapatıldıktan sonra vücuda dolgu hakkı eklemeye devam ediyor. Bunu nasıl çözebilirim?

Bu kodu javascript'ime koymaya çalıştım:

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


Ama işe yaramıyor. Bunun nasıl tamir edileceğini bilen biri var mı?

Kodum:

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

Küçük bir web uygulaması oluşturmak için bootstrap ve Parse framework kullanıyorum. Ancak bu Bootstrap modları kapatıldıktan sonra vücuda dolgu hakkı eklemeye devam ediyor. Bunu nasıl çözebilirim?


3
Sadece eklemekle padding-rightkalmaz, aynı zamanda kaydırma çubuğunu gizlemek modal-openiçin overflow: hiddenolduğu gibi sınıf da ekler .
vivekkupadhyay

Merhaba @vivekkupadhyay, ben geçersiz kılmak için çalıştı modal-openile padding-right:0 !important;ancak, sen neden olmasın iş biliyor musunuz ki?
phuwin

Lütfen aşağıdaki cevabımı kontrol edin, kesinlikle size yardımcı olacaktır.
vivekkupadhyay

Neredeyse anladın. Sen kovuyor padding-rightdoğru olayla ilgili css özelliği güncellemesini ama yanlış elemanı üzerine ateş ediyorlar. Elemana ateşlenmesi gerekiyor body. Lütfen aşağıdaki cevabıma bakın.
Sam Malayek

Yanıtlar:


63

Bu, Bootstrap modelinden kaynaklanan bir aksaklık olabilir. Testlerime göre, sorun henüz tamamen kapatılmamışken #adminPanelbaşlatılıyor gibi görünüyor #loginModal. Çözümler kaldırarak animasyon çıkarma olabilir fade, sınıfı #adminPanelve #loginModalçağırmadan önce veya ayarlanmış bir zaman aşımı (~ 500 ms) $('#adminPanel').modal();. Bu yardımcı olur umarım.


11
Ben sınıf kaldırıldı .fadegelen #loginModalve işe yarıyor.
phuwin

9
Ya bunu düzeltmek ve aynı zamanda modal animasyonu sürdürmek istersem?
Leonardo Karadağ

@LeonardoMontenegro Ben de bunu istedim ve son zamanlarda aynı soruyu yayınladım, animasyon kaldırıldı ama önce gizlemeden hemen önce fade sınıfını kaldırarak ve bu gizlemeden hemen sonra tekrar ekleyerek düzelttim, ancak bir geçici çözüm değil önyükleme bunu orada dosyada düzeltmediği sürece çözüm
Kramer

121

Aşağıdaki css düzeltmesini kullandım ve benim için çalışıyor

body { padding-right: 0 !important }

2
Doğru css özelliğine sahipsiniz, ancak bunun hide.bs.modalönyükleme olayında çalıştırılması gerekiyor. Lütfen aşağıdaki cevabıma bakın.
Sam Malayek

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

Şimdi değiştirildi

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

7
Bu gerçek doğru cevap - "solma özelliğini kullanma" bir çözüm değil, bir uzlaşmadır.
Tasgall

1
Ben de aynısını yaptım, ancak "overflow: auto! Önemli" eklemeye de ihtiyaç olabilir çünkü modal gösterildiğinde kaydırma çubuğu da gizlenir.
Jaigus

Tüm modlarımı fade sınıfıyla hedeflemek için ".modal.fade.show" seçicisini kullandım.
Andrew Schultz

Aynı stilleri .modal.fade.show'a eklemek de işe yarıyor
Rami Zebian

Teşekkürler! İkisine de ihtiyacım vardı çünkü hem modalpanele hem body.modal-opende dolguya sahiptim. Ama bu
sorunu

20

Önyükleme işlevselliğini olması gerektiği gibi tutan saf bir css çözümü.

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

Sorunun nedeni, sayfada bir kaydırma çubuğu varsa, önyükleme jQuery'deki bir kalıcı pencere açıldığında biraz sağ dolgu ekleyen bir işlevdir. Bu, modal açıldığında vücut içeriğinizin değişmesini durdurur ve bu güzel bir özelliktir. Ama bu hataya neden oluyor.

Burada verilen diğer çözümlerin çoğu bu özelliği bozar ve modal açıldığında içeriğinizi biraz değiştirir. Bu çözüm, önyükleme modelinin içeriğini değiştirmeyen özelliğini koruyacak, ancak hatayı düzeltecektir.


1
Birinin neden CSS çözümü istemediğini bilmiyorum. JS çözümü istemiyorum. Bu iyi görünüyor.
Csaba Toth

1
Ben (Modal Dağılabilirsiniz eğer çünkü bu gerekli sonra Modal içinde bir Asyc-PostBack) daha sonra yine o garip dolgu koruyacak. Bununla birlikte, Sayfada herhangi bir Kaydırma Çubuğum olduğunda tüm işe yaraması için @ Benjamin Yulaf'ın da cevabına ihtiyacım vardı.
MikeTeeVee

17

padding-rightİlgili şey hakkında daha fazla endişeliyseniz , bunu yapabilirsiniz.

jQuery :

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

bu addClasssenin için olacak bodyve sonra bunu kullanarak

CSS :

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

ve bu kurtulmanıza yardımcı olacaktır padding-right.

Ama saklanma konusunda da endişeliyseniz scroll varsa, bunu da eklemelisiniz:

CSS :

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

İşte JSFiddle

Lütfen bir göz atın, işinize yarayacaktır.


Çalışmıyor gibi görünüyor. Ya da yanlış bir şey yaptım. Hala ekler padding-rightiçin bodyve miktarını artırır padding-right15px tarafından ben Yönetici Paneli kapatmak her zaman.
phuwin

Bağlantınızı az önce kontrol ettim, görünüşe göre kodunuzun içine kodunuzu$(document).ready(function(){ koymaya çalışmadığı için çalışmıyor .
vivekkupadhyay

kodunuzun içine bir uyarı koymayı deneyin, ardından kodunuzun çalışıp çalışmadığını kontrol edebilirsiniz . keman üzerinde iyi çalışıyor ve sadece uygun şekilde kullanırsanız sayfanızda da işe yarayacak
vivekkupadhyay

Bir nedenden dolayı, modal gösterildiğinde kod çalışmaz.
phuwin

1
@vivekkupadhyay Çabalarınız için çok teşekkür ederim. İyi günler.
phuwin

13

Sadece bootstrap.min.css dosyasını açın

Bu satırı bul (varsayılan)

.modal-open{overflow:hidden;}

ve olarak değiştir

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

Sitenin her modeli için çalışacaktır. Taşma yapabilirsiniz: otomatik; kalıcı iletişim kutusunu açarken kaydırma çubuğunu olduğu gibi tutmak istiyorsanız.


@Ashok Lütfen sorunun nedenini açıklar mısınız?
dostum

7
Bu çözüm beni doğru yönde gösterdi. Ancak bootstrap.min.css'yi değiştirmek yerine, ana tema stil sayfama .modal-open {overflow: auto; padding-right: 0! İmportant;} koydum ve işe yaradı!
Pratyush Deb

3
Bootstrap'ın CSS'sini asla doğrudan düzenlemeyin. Geçersiz kılmaları her zaman kendi stil sayfanızdaki css'e ekleyin. Tıpkı @PratyushDeb'in önerdiği gibi.
dotnetengineer

Bu harika bir çözüm değil çünkü modalin arkasındaki içeriğin kaydırılmasına izin veriyor. Modal, bu içeriği grileştirir, çünkü kullanıcının onunla ve sadece onunla etkileşime girmesi gerekir.
ubiquibacon

Bu en güvenilir cevap olmalı. Teşekkürler
Hasnat Babur

11

ÇOK uzun zamandır aynı sorunu yaşadım. Buradaki cevapların hiçbiri işe yaramadı! Ancak aşağıdaki sorun çözüldü!

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

Bir modelin kapatılmasıyla tetiklenen iki olay vardır, önce bu hide.bs.modal, sonra bu hidden.bs.modal. Sadece birini kullanabilmelisin.


3
Hem hide.bs.modalve için dinleyici eklediğimde benim için çalışmıyordu hidden.bs.modal. Ama hide.bs.modaldinleyiciden çıkardığımda mükemmel çalıştı . :)
HariV

Olumsuz oy verene: Lütfen bir yorumda yapıcı eleştiri bırakın, böylece bu yanıtı geliştirebilirim.
Sam Malayek

3

kolay düzeltme

bu sınıfı ekle

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

Bu bir geçersiz kılma ama işe yarıyor


1
@Chasmani tarafından gönderilen cevapla birleştirilen bu Ders, benim için eksiksiz ve eksiksiz bir çözüm oluşturdu. Ayrıca " bu sınıfı ekle " demek için +1 . Buradaki herkesin Yanıtlarını okumak, Bootstrap.css dosyasını geçersiz kılmayı önermek çılgınlık. Bu dosyayı olduğu gibi bırakın ve " Bootstrap Geçersiz Kılmaları " uyguladığınız kendi CSS Dosyanıza sahip olun . Bu önemlidir, böylece daha sonra hepsini tek bir yerde belgelendirebilir, Bootstrap'i güncellerken / yükseltirken kaybetmezsiniz ve yeni bir Bootstrap Sürümüne yükselttikten sonra bunları gözden geçirebilirsiniz (hala geçici çözümlere ihtiyacınız olup olmadığını görmek için).
MikeTeeVee

1
@MikeTeeVee'ye, bootstrap css'i kesinlikle düzenlememeniz gerektiğini kabul ediyorum. Bunu cevabıma dahil etmedim çünkü bu soruyu cevaplamanın biraz kapsam dışı olduğunu düşündüm
chasmani

2

Sadece fadesınıfı kaldırdım ve sınıfın solma etkisini ile değiştirdim animation.css. Umarım bu yardımcı olacak.


2

removeAttr çalışmaz, CSS özelliğini şu şekilde kaldırırsınız:

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

Özellik değeri olmadan özellik kaldırılır.


2

Varsayılan önyükleme 3.3.0 CSS'sini yüklüyorum ve benzer bir sorunla karşılaştım. Bu CSS'yi ekleyerek çözüldü:

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

Önemli olan, bootstrap modal javascript'in programatik olarak 15px dolguyu sağa eklemesidir. Tahminim kaydırma çubuğunu telafi etmek için olduğu, ama bunu istemiyorum.


2

Bootstrap 4 ile bu benim için çalıştı:

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

1

Bootstrap 3.3.7 ve sabit navbar için çözümüm ile aynı problemim var: Bu stili özel css'nize eklemek.

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

kaydırma penceresi çalışırken modal'inizin gösterilmesini sağlayacaktır. teşekkürler, umarım bu da sana yardımcı olur


1

Bunun eski bir soru olduğunu biliyorum, ancak buradaki cevapların hiçbiri benim benzer durumlarımdaki sorunu ortadan kaldırmadı ve bazı geliştiricilerin çözümümü okumasının da faydalı olacağını düşündüm.

Bir modal açıldığında, hala kullanıldığı web sitelerinde bootstrap 3'e bir miktar CSS eklemek için kullanıyorum.

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

1

Çözümüm herhangi bir ek CSS gerektirmiyor.

@Orland'ın işaret ettiği gibi, diğeri başladığında bir olay hala devam ediyor. Benim çözümüm, ikinci olayı başlatmakla ilgili ( adminPanelmodal göstererek ) yalnızca ilk olay bittiğinde (loginModal modal ).

Bunu, modalinizin hidden.bs.modalolayına loginModalaşağıdaki gibi bir dinleyici ekleyerek başarabilirsiniz :

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

Ve gerektiğinde, sadece modeli gizleyin loginModal.

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

Çünkü, modal'ı gösterip göstermemeye karar vermek için dinleyicinin içinde kendi mantığınızı uygulayabilirsiniz adminPanel.

Bootstrap Modal Events hakkında daha fazla bilgiyi buradan edinebilirsiniz .

İyi şanslar.


1

Bootstrap modelleri, gövde taşıyorsa bu dolguyu vücuda ekler.

Bootstrap 3.3.6'da (kullandığım sürüm) bu, bu doldurma hakkını vücut öğesine eklemekten sorumlu işlevdir: https://github.com/twbs/bootstrap/blob/v3.3.6/dist/js /bootstrap.js#L1180

Hızlı bir çözüm, bootstrap.js dosyasını çağırdıktan sonra bu işlevin üzerine yazmaktır:

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

Bu benim için sorunu çözdü.


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

1

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

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'da çalışıyor! Teşekkürler.
Gene Kelly

0

Sadece data-targetdüğmeyi kaldırın ve modeli jQuery kullanarak yükleyin.

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

jQuery:

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

0

Bootstrap javascript'i inceledim ve Modal kodunun adjustDialog(), Modal prototipinde tanımlanan ve jQuery'de gösterilen bir işlevde doğru dolguyu ayarladığını buldum . Aşağıdaki kodu, hiçbir şey yapmamak için bu işlevi geçersiz kılacak bir yere yerleştirmek benim için hile yaptı (bunu henüz ayarlamamanın sonucunun ne olduğunu bilmiyorum !!)

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


0

Bu sorunu çözebilir

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


0

Modals ve ajax kullanırken aynı sorunu yaşadım. Bunun nedeni, JS dosyasına hem ilk sayfada hem de ajax tarafından çağrılan sayfada iki kez başvurulmuş olmasıdır, bu nedenle modal kapatıldığında, JS olayını iki kez çağırır ve varsayılan olarak 17px'lik bir dolgu hakkı ekler.


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

Benim için çalıştı. Kaydırma Çubuğunun gövdede zorlandığını unutmayın - ancak yine de "kayan" bir sayfanız varsa, önemli değildir (?)


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

Bunu dene

Modal kapanıştan sonra sağ 0px dolgusunu gövdeye ekleyecektir.


0

Bir modeli açtığınızda, önceki modelin henüz tam olarak kapatılmamış olduğu görülür. Düzeltmek için, tüm modal tamamen kapatıldığında yeni modal açın, aşağıdaki kodları kontrol edin:

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

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

0

Ben şimdi bu eski ve burada sunulan tüm çözümler işe yarayabilir. Birine yardımcı olabilecek yeni bir şey ekliyorum: Aynı sorunu yaşadım ve modal açmanın sidenavıma bir marj hakkı eklediğini fark ettim (muhtemelen vücuda eklenen dolgudan bir tür miras). Sidenav'ıma {margin-right: 0! İmportant;} eklemek hile yaptı.


-1

(Bootstrap v3.3.7) Tarayıcı denetçimden bunun doğrudan öğe stili özelliğinde ayarlandığını gördüm , cadı sınıf özelliklerini geçersiz kılıyor.

Modal şununla gösterilirken paddig-right değerini 'sıfırlamayı' denedim :

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

Ancak pencere yeniden boyutlandırıldığı anda geri gelir :( (muhtemelen eklenti komut dosyasından).

Bu çözüm benim için çalıştı:

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'ın dediği gibi, fade gibi bir efekt kullanıyorsanız, modal'ı görüntülemeden önce orada beklememiz gerekiyor, bu biraz hilekar ama hile yapacak.

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

Umarım hala bu cevaba ihtiyacı olan biri vardır. Bootstrap.js'de resetScrollbar () adında bir işlev vardır, bazı aptalca nedenlerle geliştiriciler kaydırma çubuğu boyutlarını gövdenin sağ dolgusuna eklemeye karar verdiler. teknik olarak sağ dolguyu boş bir dizeye ayarlarsanız sorunu çözecektir

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.