Bootstrap Modals terus menambahkan padding-right ke body setelah ditutup


100

Saya menggunakan kerangka bootstrap dan Parse untuk membangun aplikasi web kecil. Tetapi modal Bootstrap tersebut terus menambahkan padding-right ke body setelah ditutup. Bagaimana mengatasi ini?

Saya mencoba memasukkan kode ini di javascript saya:

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


Tapi itu tidak berhasil. Apakah ada yang tahu cara memperbaikinya?

Kode saya:

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

Saya menggunakan kerangka bootstrap dan Parse untuk membangun aplikasi web kecil. Tetapi modal Bootstrap tersebut terus menambahkan padding-right ke body setelah ditutup. Bagaimana mengatasi ini?


2
Ini tidak hanya menambah padding-righttetapi juga menambah kelas modal-openkarena overflow: hiddenhanya untuk menyembunyikan bilah gulir .
vivekkupadhyay

@vivekkupadhyay Hai, Saya mencoba menimpa modal-opendengan padding-right:0 !important;tetapi tidak berhasil, tahukah Anda mengapa?
phuwin

silakan cek jawaban saya di bawah ini, pasti membantu Anda.
vivekkupadhyay

Anda hampir mendapatkannya. Anda mengaktifkan padding-rightpembaruan properti css pada peristiwa yang benar, tetapi Anda mengaktifkannya pada elemen yang salah. Itu perlu ditembakkan pada bodyelemen. Silakan lihat jawaban saya di bawah ini.
Sam Malayek

Jawaban:


61

Ini mungkin kesalahan dari modal Bootstrap. Dari pengujian saya, sepertinya masalahnya adalah yang #adminPanelsedang diinisialisasi sementara #loginModalbelum sepenuhnya ditutup. Solusinya dapat menghapus animasi dengan menghapus fadekelas #adminPaneldan #loginModalatau menyetel waktu tunggu (~ 500 md) sebelum memanggil $('#adminPanel').modal();. Semoga ini membantu.


10
Saya menghapus kelas .fadedari #loginModaldan berhasil.
phuwin

8
Bagaimana jika saya ingin memperbaikinya, dan mempertahankan animasi modal pada saat yang bersamaan?
Leonardo Montenegro

@LeonardoMontenegro Saya juga menginginkan ini dan baru-baru ini saya juga memposting pertanyaan yang sama masalahnya adalah animasi telah dihapus tetapi saya memperbaikinya dengan terlebih dahulu menghapus kelas fade sebelum menyembunyikan dan menambahkannya lagi tepat setelah itu menyembunyikannya berfungsi meskipun itu adalah solusi yang tidak tepat solusi kecuali bootstrap memperbaikinya di sana file itu sendiri
Kramer

121

Saya baru saja menggunakan perbaikan css di bawah ini dan berfungsi untuk saya

body { padding-right: 0 !important }

1
Anda memiliki properti css yang benar, tetapi properti ini harus diaktifkan pada hide.bs.modalacara bootstrap. Silakan lihat jawaban saya di bawah ini.
Sam Malayek

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

Baru saja berubah menjadi

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

6
Ini adalah jawaban yang benar - "jangan gunakan fitur fade" adalah kompromi, bukan solusi.
Tasgall

1
Saya melakukan hal yang sama, tetapi mungkin ada kebutuhan untuk menambahkan "overflow: auto! Important" juga karena ketika modal ditampilkan, scrollbar juga tersembunyi.
Jaigus

Saya menggunakan pemilih ".modal.fade.show" untuk menargetkan semua modals saya dengan kelas fade.
Andrew Schultz

Menambahkan gaya yang sama ke .modal.fade.show juga berfungsi
Rami Zebian

Terima kasih! Saya membutuhkan keduanya, karena modalpanel dan body.modal-openbantalannya. Tapi ini memperbaikinya dengan baik
Oliver Schimmer

20

Solusi css murni yang menjaga fungsionalitas bootstrap sebagaimana mestinya.

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

Masalahnya disebabkan oleh fungsi di jQuery bootstrap yang menambahkan sedikit padding-right saat jendela modal terbuka, jika ada bilah gulir di halaman. Itu menghentikan konten tubuh Anda bergeser saat modal terbuka, dan ini adalah fitur yang bagus. Tapi itu menyebabkan bug ini.

Banyak solusi lain yang diberikan di sini merusak fitur itu, dan membuat konten Anda sedikit bergeser ketika modal terbuka. Solusi ini akan mempertahankan fitur modal bootstrap tidak mengalihkan konten, tetapi memperbaiki bug.


1
Saya tidak tahu mengapa seseorang tidak menginginkan solusi CSS. Saya tidak ingin solusi JS. Yang ini terlihat bagus.
Csaba Toth

1
Saya membutuhkan ini karena jika saya Menutup Modal ( setelah Asyc-Postback di dalam Modal) maka itu masih akan mempertahankan padding aneh itu. Namun, saya masih membutuhkan jawaban @Benjamin Oats juga agar semuanya berfungsi ketika saya memiliki Scrollbar di Halaman.
MikeTeeVee

16

Jika Anda lebih mementingkan padding-righthal terkait maka Anda bisa melakukan ini

jQuery :

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

ini akan addClassuntuk Anda bodydan kemudian menggunakan ini

CSS :

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

dan ini akan membantu Anda untuk menyingkirkan padding-right.

Tetapi jika Anda juga khawatir tentang persembunyiannya scroll Anda harus menambahkan ini juga:

CSS :

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

Inilah JSFiddle

Silakan lihat, itu akan melakukan trik untuk Anda.


Sepertinya itu tidak berhasil. Atau saya melakukan sesuatu yang salah. Masih menambahkan padding-rightuntuk bodydan meningkatkan jumlah padding-rightoleh 15px setiap kali aku menutup Panel Admin.
phuwin

Saya baru saja memeriksa tautan Anda , sepertinya kode Anda tidak dijalankan karena sudah tidak $(document).ready(function(){dapat lagi memasukkan kode Anda ke dalamnya.
vivekkupadhyay

coba letakkan peringatan di dalam kode Anda, lalu Anda dapat memeriksa bahwa kode Anda tidak berjalan. ini berfungsi dengan baik pada biola dan akan berfungsi pada halaman Anda juga hanya jika Anda menggunakannya dengan sesuai
vivekkupadhyay

Karena suatu alasan, kode tidak berjalan saat modal ditampilkan.
phuwin

1
@vivekkupadhyay Terima kasih banyak atas usaha Anda. Semoga harimu menyenangkan.
phuwin

13

Buka saja bootstrap.min.css

Temukan baris ini (default)

.modal-open{overflow:hidden;}

dan mengubahnya sebagai

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

Ini akan berfungsi untuk setiap modal situs. Anda dapat melakukan overflow: auto; jika Anda ingin tetap scrollbar seperti saat membuka dialog modal.


@Ashok Bisakah Anda menjelaskan penyebab masalah ini?
Bung

6
Solusi ini mengarahkan saya ke arah yang benar. Namun, alih-alih memodifikasi bootstrap.min.css, saya meletakkan .modal-open {overflow: auto; padding-right: 0! Important;} di stylesheet tema utama saya dan berhasil!
Pratyush Deb

3
Jangan pernah mengedit css bootstrap secara langsung. Selalu tambahkan timpaan ke css di stylesheet Anda sendiri. Seperti yang disarankan @PratyushDeb.
dotnetengineer

Ini bukan solusi yang bagus karena memungkinkan konten di belakang modal untuk digulir. Modal tersebut mengaburkan konten karena pengguna seharusnya berinteraksi dengannya dan hanya itu.
ubiquibacon

11

Saya mengalami masalah yang sama untuk waktu yang SANGAT lama. Tak satu pun jawaban di sini berhasil! Tetapi hal berikut memperbaikinya!

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

Ada dua peristiwa yang terjadi saat menutup modal, pertama hide.bs.modal, dan kemudian hidden.bs.modal. Anda harus bisa menggunakan hanya satu.


3
Itu tidak berhasil bagi saya ketika saya menambahkan pendengar untuk keduanya hide.bs.modaldan hidden.bs.modal. Tetapi bekerja dengan sempurna ketika saya dihapus hide.bs.modaldari pendengar. :)
HariV

Kepada down-voter: Mohon tinggalkan kritik yang membangun dalam komentar agar saya dapat memperbaiki jawaban ini.
Sam Malayek

3

perbaikan mudah

tambahkan kelas ini

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

Ini menimpa tetapi berfungsi


1
Kelas ini, dikombinasikan dengan jawaban yang diposting oleh @Chasmani, memberikan solusi total dan lengkap untuk saya. Juga memberi +1 untuk mengatakan " tambahkan kelas ini ". Gila membaca Tanggapan semua orang di sini yang menyarankan untuk mengganti file Bootstrap.css. Biarkan file itu sendiri, dan miliki File CSS Anda sendiri di mana Anda menerapkan " Bootstrap Overrides ". Ini penting agar Anda kemudian dapat mendokumentasikan semuanya di satu tempat, tidak kehilangannya saat memperbarui / memutakhirkan Bootstrap, dan memeriksanya (untuk melihat apakah Anda masih memerlukan penyelesaiannya) setelah memutakhirkan ke Versi Bootstrap yang baru.
MikeTeeVee

1
Saya setuju @MikeTeeVee bahwa Anda tidak boleh mengedit css bootstrap. Saya tidak memasukkannya dalam jawaban saya karena saya pikir ini sedikit di luar cakupan untuk menjawab pertanyaan ini
chasmani

2

Saya baru saja menghapus fadekelas dan mengubah efek fade kelas animation.css. Saya harap ini akan membantu.


2

removeAttr tidak akan berfungsi, Anda harus menghapus properti CSS seperti ini:

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

Tanpa nilai properti, properti tersebut dihapus.


2

Saya memuat CSS bootstrap 3.3.0 default dan mengalami masalah serupa. Dipecahkan dengan menambahkan CSS ini:

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

Yang! Penting adalah karena javascript modal bootstrap menambahkan 15px padding ke kanan secara programatik. Dugaan saya adalah untuk mengimbangi scrollbar, tetapi saya tidak menginginkannya.


2

Dengan Bootstrap 4 ini berhasil untuk saya:

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

1

Saya memiliki masalah yang sama dengan Bootstrap 3.3.7 dan solusi saya untuk navbar tetap: Menambahkan gaya ini ke css kustom Anda.

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

itu akan membuat modal Anda ditampilkan saat jendela gulir masih berfungsi. terima kasih, semoga ini akan membantu Anda juga


1

Saya tahu ini adalah pertanyaan lama, tetapi tidak ada jawaban dari sini yang menghilangkan masalah dalam situasi saya yang serupa dan saya pikir akan berguna bagi beberapa pengembang untuk membaca solusi saya juga.

Saya menggunakan untuk menambahkan beberapa CSS ke tubuh ketika sebuah modal dibuka, di situs web di mana itu masih digunakan bootstrap 3.

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

1

Solusi saya tidak memerlukan CSS tambahan.

Seperti yang ditunjukkan oleh @Orland, satu acara masih berlangsung saat acara lainnya dimulai. Solusi saya adalah tentang memulai acara kedua (menunjukkan adminPanelmodal) hanya ketika yang pertama selesai (menyembunyikan loginModalmodal).

Anda dapat melakukannya dengan melampirkan listener ke hidden.bs.modalacara loginModalmodal Anda seperti di bawah ini:

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

Dan, bila perlu, cukup sembunyikan loginModalmodal.

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

Tentu saja Anda dapat mengimplementasikan logika Anda sendiri di dalam pendengar untuk memutuskan untuk menampilkan atau tidak adminPanelmodal.

Anda bisa mendapatkan info lebih lanjut tentang Bootstrap Modal Events di sini .

Semoga berhasil.


1

Model bootstrap menambahkan bantalan yang tepat ke bodi jika bodi meluap.

Pada bootstrap 3.3.6 (versi yang saya gunakan) ini adalah fungsi yang bertanggung jawab untuk menambahkan padding-right ke elemen body: https://github.com/twbs/bootstrap/blob/v3.3.6/dist/js /bootstrap.js#L1180

Solusi cepatnya adalah dengan menimpa fungsi itu setelah memanggil file bootstrap.js:

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

Ini memperbaiki masalah saya.


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

1

Inilah yang berhasil untuk saya:

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
Bekerja di Chrome! Terima kasih.
Gene Kelly

0

Hapus saja data-targetdari tombol dan muat modal menggunakan jQuery.

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

jQuery:

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

0

Saya menggali javascript bootstrap dan menemukan bahwa kode Modal menetapkan padding yang tepat dalam fungsi yang disebut adjustDialog()yang didefinisikan pada prototipe Modal dan diekspos di jQuery. Menempatkan kode berikut di suatu tempat untuk menimpa fungsi ini agar tidak melakukan apa-apa melakukan trik bagi saya (meskipun saya tidak tahu apa konsekuensi dari tidak menyetel ini !!)

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


0

Ini bisa menyelesaikan masalah

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


0

Saya memiliki masalah yang sama menggunakan modals dan ajax. Itu karena file JS direferensikan dua kali, baik di halaman pertama dan di halaman yang dipanggil oleh ajax, jadi ketika modal ditutup, itu memanggil event JS dua kali, secara default, menambahkan padding-right 17px.


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

Bekerja untuk saya. Perhatikan bahwa Scrollbar dipaksa masuk - tetapi jika Anda memiliki halaman "scrolling", tidak masalah (?)


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

Coba ini

Ini akan menambahkan padding tepat 0px ke body setelah modal close.


0

Itu terjadi ketika Anda membuka modal bahwa modal sebelumnya belum sepenuhnya ditutup. Untuk memperbaikinya cukup buka modal baru pada saat semua modal ditutup sepenuhnya, periksa kode di bawah ini:

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

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

0

Saya sekarang ini sudah tua, dan semua solusi yang ditawarkan di sini mungkin berfungsi. Saya hanya menambahkan sesuatu yang baru jika hal itu dapat membantu seseorang: Saya memiliki masalah yang sama dan memperhatikan bahwa membuka modal menambahkan margin-right ke sidenav saya (mungkin semacam warisan dari padding yang ditambahkan ke tubuh). Menambahkan {margin-right: 0! Important;} ke sidenav saya berhasil.


-1

(Bootstrap v3.3.7) Dari inspektur browser saya, saya melihat bahwa ini secara langsung diatur dalam properti gaya elemen , penyihir menimpa properti kelas.

Saya mencoba untuk 'mengatur ulang' nilai paddig-right ketika modal ditampilkan dengan:

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

Tapi itu kembali segera setelah jendela diubah ukurannya :( (mungkin dari skrip pluggin).

Solusi ini berhasil untuk saya:

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

Seperti yang dikatakan @Orland jika Anda menggunakan beberapa efek seperti fade maka di sana kita harus menunggu sebelum menampilkan modal, ini agak hacky tetapi akan berhasil.

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

Saya berharap masih ada yang membutuhkan jawaban ini. Ada fungsi yang disebut resetScrollbar () di bootstrap.js, karena alasan bodoh pengembang memutuskan untuk menambahkan dimensi scrollbar ke padding badan kanan. jadi secara teknis jika Anda hanya mengatur padding kanan ke string kosong itu akan memperbaiki masalah

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.