Bootstrap Modals продолжают добавлять отступы справа от тела после закрытия

101

Я использую фреймворк bootstrap и Parse для создания небольшого веб-приложения. Но эти модальные окна Bootstrap продолжают добавлять padding-right к телу после закрытия. Как это решить?

Я попытался поместить этот код в свой javascript:

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

Я использую фреймворк bootstrap и Parse для создания небольшого веб-приложения. Но эти модальные окна Bootstrap продолжают добавлять padding-right к телу после закрытия. Как это решить?

Phuwin
источник
3
Его не просто добавить , padding-rightа также добавить класс как modal-openдля overflow: hiddenего только для сокрытия полосы прокрутки .
vivekkupadhyay
@vivekkupadhyay Привет, я попытался переопределить с modal-openпомощью, padding-right:0 !important;но это не работает, знаете почему?
phuwin
пожалуйста, проверьте мой ответ ниже, он вам обязательно поможет.
vivekkupadhyay
Вы почти получили это. Вы padding-rightзапускаете обновление свойства css для правильного события, но запускаете его для неправильного элемента. Его нужно выстрелить в bodyэлемент. Пожалуйста, ознакомьтесь с моим ответом ниже.
Sam Malayek

Ответы:

63

Это может быть сбой из модального окна Bootstrap. Судя по моим тестам, проблема в том #adminPanel, что инициализируется, хотя #loginModalеще не полностью закрыто. В обходном может быть удаление анимации, удалив fadeкласс на #adminPanelи #loginModalили установить тайм - аут (~ 500 мс) перед вызовом $('#adminPanel').modal();. Надеюсь это поможет.

Orlland
источник
11
Я удалил класс .fadeот #loginModalи она работает.
phuwin
9
Что, если я захочу исправить это и в то же время сохранить модальную анимацию?
Леонардо Монтенегро
@LeonardoMontenegro Я тоже хотел этого, и недавно я также опубликовал тот же вопрос, проблема заключалась в том, что была удалена анимация, но я исправил ее, сначала удалив класс затухания непосредственно перед скрытием и добавив его снова сразу после этого скрытия, это сработало, хотя это обходной путь не правильный решение, если бутстрап не исправит его в самом файле
Крамер
121

Я только что использовал исправление css ниже, и оно у меня работает

body { padding-right: 0 !important }
Нгатия Франклайн
источник
2
У вас есть правильное свойство css, но оно должно hide.bs.modalзапускаться в событии начальной загрузки. Пожалуйста, ознакомьтесь с моим ответом ниже.
Sam Malayek
59
.modal-open {
    padding-right: 0px !important;
}

Просто изменил на

.modal {
    padding-right: 0px !important;
}
Suge
источник
6
Это действительно правильный ответ - «не используйте функцию затухания» - это компромисс, а не решение.
Tasgall 08
1
Я сделал то же самое, но, возможно, также потребуется добавить «overflow: auto! Important», потому что при отображении модального окна полоса прокрутки также скрывается.
Jaigus 07
Я использовал селектор ".modal.fade.show", чтобы нацелить все мои модальные окна на класс fade.
Эндрю Шульц
Добавление тех же стилей в .modal.fade.show тоже работает
Рами Зебиан
Спасибо! Мне было нужно и то, и другое, потому что и modalпанель, и body.modal-openпрокладка. Но это исправило это просто красиво
Оливер Шиммер
20

Чистое решение css, сохраняющее функциональность начальной загрузки такой, какой она должна быть.

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

Проблема вызвана функцией в jQuery начальной загрузки, которая добавляет небольшой отступ справа при открытии модального окна, если на странице есть полоса прокрутки. Это останавливает перемещение содержимого вашего тела при открытии модального окна, и это приятная функция. Но это вызывает эту ошибку.

Многие другие решения, представленные здесь, нарушают эту функцию и заставляют ваш контент немного сдвигаться при открытии модального окна. Это решение сохранит возможность модального окна начальной загрузки не перемещать содержимое, но исправит ошибку.

Chasmani
источник
1
Я не знаю, почему кому-то не нужно решение CSS. Я не хочу никакого JS-решения. Этот хорошо выглядит.
Csaba Toth
1
Мне это было нужно, потому что если бы я отклонил модальное окно ( после Asyc-Postback внутри модального окна), он все равно сохранил бы этот странный отступ. Однако мне все еще нужен был ответ @Benjamin Oats, чтобы он работал, когда у меня были полосы прокрутки на странице.
MikeTeeVee
17

Если вас больше беспокоит 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

Пожалуйста, посмотрите, он поможет вам.

Vivekkupadhyay
источник
Похоже, не работает. Или я что-то не так сделал. Он по- прежнему добавляет padding-rightк bodyи увеличивает количество padding-rightпо 15px каждый раз , когда я закрыть панели администратора.
phuwin
Я только что проверил вашу ссылку, похоже, ваш код не выполняется, так как он не $(document).ready(function(){пытается поместить ваш код в нее.
vivekkupadhyay
попробуйте поместить предупреждение в свой код, тогда вы сможете убедиться, что ваш код не работает. он отлично работает на скрипке и будет работать и на вашей странице, только если вы используете его соответствующим образом
vivekkupadhyay
По какой-то причине код не запускается при отображении модального окна.
Phuwin
1
@vivekkupadhyay Большое спасибо за ваши усилия. Хорошего дня.
phuwin
13

Просто откройте bootstrap.min.css

Найдите эту строку (по умолчанию)

.modal-open{overflow:hidden;}

и измените его как

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

Он будет работать для всех модальных окон сайта. Вы можете сделать переполнение: авто; если вы хотите сохранить полосу прокрутки, как она есть при открытии модального диалога.

Ашок Сен
источник
@Ashok Не могли бы вы объяснить причину проблемы?
чувак
7
Это решение указывало мне правильное направление. Но вместо изменения bootstrap.min.css я поместил .modal-open {overflow: auto; padding-right: 0! Important;} в таблицу стилей основной темы, и это сработало!
Пратюш Деб
3
Никогда не редактируйте css начальной загрузки напрямую. Всегда добавляйте переопределения к CSS в вашей собственной таблице стилей. Как и предложил @PratyushDeb.
dotnetengineer 03
Это не лучшее решение, поскольку оно позволяет прокручивать содержимое модального окна. Модальное окно затеняет этот контент, потому что предполагается, что пользователь взаимодействует с ним и только с ним.
ubiquibacon
Это должен быть самый надежный ответ. Спасибо
Хаснат Бабур
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. Оставьте этот файл в покое и создайте свой собственный файл CSS, в котором вы применяете любые « переопределения начальной загрузки ». Это важно, поэтому вы можете задокументировать их все в одном месте, не потерять их при обновлении / обновлении Bootstrap и просмотреть их (чтобы узнать, нужны ли вам обходные пути) после обновления до новой версии Bootstrap.
MikeTeeVee
1
Я согласен с @MikeTeeVee, что вам определенно не следует редактировать загрузочный css. Я не включил это в свой ответ, потому что понял, что это немного выходит за рамки ответа на этот вопрос
chasmani
2

Я просто удалил fadeкласс и изменил эффект затухания класса на animation.css. Я надеюсь, это поможет.

febriana andringa
источник
2

removeAttr не сработает, вам нужно удалить свойство CSS следующим образом:

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

При отсутствии значения свойства свойство удаляется.

jcdsr
источник
2

Я загружаю CSS-код начальной загрузки 3.3.0 по умолчанию, и у меня возникла аналогичная проблема. Решено добавлением этого CSS:

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

! Важно, потому что модальный javascript начальной загрузки программно добавляет 15px отступа вправо. Я предполагаю, что это компенсирует полосу прокрутки, но я не хочу этого.

гауравбхай даксини
источник
2

С Bootstrap 4 это сработало для меня:

$(selector).on('hide.bs.modal', function (e) {
    $('body').css('padding-right','0');
});
michal.jakubeczy
источник
1

У меня такая же проблема с Bootstrap 3.3.7 и моим решением для фиксированной панели навигации: добавление этого стиля в ваш собственный CSS.

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

это заставит ваше модальное окно отображаться, пока окно прокрутки все еще работает. спасибо, надеюсь, это тебе тоже поможет

Дебриан Рухут Сараги
источник
1

Я знаю, что это старый вопрос, но ни один из ответов здесь не устранил проблему в моих аналогичных ситуациях, и я подумал, что некоторым разработчикам было бы полезно прочитать мое решение.

Я использую, чтобы добавить немного CSS в тело при открытии модального окна на веб-сайтах, где он все еще используется bootstrap 3.

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

Конечно, вы можете реализовать свою собственную логику внутри слушателя, чтобы решить, показывать или нет adminPanelмодальное окно.

Вы можете получить больше информации о модальных событиях Bootstrap здесь .

Удачи.

Клебер де Соуза Алькантара
источник
1

Модели Bootstrap добавляют этот padding-right к телу, если тело переполнено.

В bootstrap 3.3.6 (версия, которую я использую) это функция, отвечающая за добавление этого padding-right к элементу 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! Спасибо.
Джин Келли
0

Просто удалите data-targetс кнопки и загрузите модальное окно с помощью jQuery.

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

jQuery:

$("#myBtn").modal('show');
Эдисон Д'суза
источник
0

Я покопался в javascript начальной загрузки и обнаружил, что модальный код устанавливает правильное заполнение в вызываемой функции, adjustDialog()которая определена в модальном прототипе и отображается в jQuery. Размещение следующего кода где-нибудь, чтобы переопределить эту функцию, чтобы она ничего не делала, помогло мне (хотя я не знаю, каковы последствия того, что эта функция пока не установлена ​​!!)

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

Фил
источник
0

Это может решить проблему

.shop-modal.modal.fade.in {
    padding-right: 0px !important;
}
Диноарт
источник
0

Это ошибка начальной загрузки, исправленная в v4-dev: https://github.com/twbs/bootstrap/pull/18441, до тех пор добавление класса CSS ниже должно помочь.

.fixed-padding {
  padding-right: 0px !important;
}
Ручита Касливал
источник
0

У меня была такая же проблема с модальными окнами и ajax. Это произошло из-за того, что файл JS упоминался дважды, как на первой странице, так и на странице, вызванной ajax, поэтому, когда модальное окно было закрыто, оно дважды вызывало событие JS, которое, по умолчанию, добавляет право отступа 17 пикселей.

Лукас Алмейда
источник
0
body {
    padding-right: 0 !important;
    overflow-y: scroll!important;
}

Работал у меня. Обратите внимание, что полоса прокрутки принудительно установлена ​​в теле, но если у вас есть "прокручиваемая" страница, это не имеет значения (?)

user3666136
источник
0
$('.modal').on('hide.bs.modal,hidden.bs.modal', function () {
 setTimeout(function(){
  $('body').css('padding-right',0);
 },1000);
});

Попробуй это

Он добавит отступ справа на 0 пикселей к телу после закрытия модального окна.

sibaspage
источник
0

Когда вы открываете модальное окно, предыдущее модальное окно еще не закрыто полностью. Чтобы исправить это, просто откройте новое модальное окно в то время, когда все модальные окна полностью закрыты, проверьте коды ниже:

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

    closeModal.modal('hide');
    closeModal.on('hidden.bs.modal', function() {
      $('#new-open-modal').modal('show');
    });
  }
Саката Гинтоки
источник
0

Теперь это устарело, и все предлагаемые здесь решения могут работать. Я просто добавляю что-то новое на случай, если это может кому-то помочь: у меня была такая же проблема, и я заметил, что открытие модального окна добавляло маржу справа в мою боковую навигацию (вероятно, своего рода наследование от дополнения, добавленного к телу). Добавление {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, если вы используете какой-то эффект, такой как затухание, тогда нам нужно подождать, прежде чем отображать модальное окно, это немного взломано, но поможет.

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);
Netomo
источник
-2

Надеюсь, этот ответ еще найдется. В bootstrap.js есть функция под названием resetScrollbar (), по какой-то глупой причине разработчики решили добавить размеры полосы прокрутки к правому отступу тела. поэтому технически, если вы просто установите правое заполнение в пустую строку, это решит проблему

Wkirk
источник