bootstrap modal видаляє смугу прокрутки


94

Коли я запускаю модальний перегляд на моїй сторінці, це змушує смугу прокрутки зникати. Це дратівливий ефект, оскільки фонова сторінка починає рухатися, коли модальний пристрій входить / зникає. Чи існує ліки від цього ефекту?


1
Відповідь, сумісна з браузером: stackoverflow.com/a/47807685/7186739
Super Model

Відповіді:


115

Це функція, клас modal-openдодається до HTMLbody коли ви показуєте модаль, і видаляється, коли ви його приховуєте.

Це змушує смугу прокрутки зникати, оскільки в bootstrap css сказано

.modal-open {
    overflow: hidden;
}

Ви можете замінити це, вказавши

.modal-open {
    overflow: scroll;
}

у власному css.


Ви можете бути більш конкретними?
El Dude

1
Додано ще деякі деталі. Краще зараз?
flup

14
Більш доречним є використання overflow-y: scroll, який, на мою думку, краще відповідає наміру питання OP. Використання переповнення: прокрутка додасть горизонтальну смугу прокрутки внизу екрана.
Скотт

1
ідеально, також працює з модалями з кутовим ремінцем, може просто включити вищезазначений CSS <style></style>всередину, templateUrlщоб він не завдав іншим модалям у додатку.
davidkonrad

2
Використовувати переповнення: спадкувати; замість цього. Таким чином, модальний не видаляє прокрутку, коли у вас є прокрутка, і не додає прокрутку, коли у вас її немає
Alisson Alvarenga

32

Я думаю, що успадкування краще, ніж прокрутка, тому що коли ви відкриваєте модальний, він завжди відкриватиметься за допомогою прокрутки, але коли у вас немає жодних прокруток, ви отримаєте ту ж проблему. Тому я просто роблю це:

.modal-open {
  overflow: inherit;
}

Це справжня відповідь. переповнення прокрутки все одно впливає на якийсь елемент у моєму випадку.
Coisox

25

я використав

.modal-open {
  overflow-y: scroll;
}

У цьому випадку ви уникаєте відображення горизонтальної смуги прокрутки


ми могли б поєднати це з відповіддю @Alisson Alvarenga і використати overflow-y: inherit;
duodvk

23

Краще використовувати overflow-y: прокручуйте та видаляйте відступ із тіла, модальний спосіб завантаження додає відступ до тіла сторінки.

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

Сумісний з браузером IE: браузер IE робить те саме за замовчуванням.


1
Дякую. Крім того, якщо модальне спливаюче вікно потрібно прокручувати, а батько повинен залишатися нерухомим .modal-body {max-height: calc (100vh - 210px); переповнення-y: авто; } .modal-open {переповнення: приховане; overflow-y: прокрутка; відступ вправо: 0! важливо; }
Oracular Man

9

Слава Богу, я натрапив на цей пост! Я висмикував волосся, намагаючись зрозуміти, як повернути смуги прокрутки назад, закриваючи вікно, використовуючи моє тісне посилання. Я спробував пропозиції щодо CSS, але він просто не працював належним чином. Після читання

class modal-open додається до тіла HTML, коли ви показуєте модаль, і видаляється, коли ви його приховуєте. - @flup

Я придумав рішення за допомогою jquery, тому, якщо хтось інший має таку ж проблему, і наведені вище пропозиції не працюють -

<script>
            jQuery(document).ready(function () {
jQuery('.closeit').click(function () {
 jQuery('body').removeClass('modal-open');
                });
            });
        </script>

У мене була проблема, коли я перекривав подію hide.bs.modal, щоб я міг виконати певний власний код, коли модаль був прихований, але те, чого я не розумів, це зупинило видалення класу модально-відкритих з тіла - отже, моя смуга прокрутки не повернулася при закритті цього конкретного способу. Я не видаляю клас модально-відкритого вручну у своєму коді hide.bs.modal, і це виправляє цю проблему.
Джим

1
Вам просто потрібно додати data-dismiss="modal"атрибут до свого посилання, замість того, щоб робити щось подібне. Bootstrap зробить усі відповідні закриваючі дії при натисканні на це посилання.
nollidge

1
data-dismiss = "modal" у моєму випадку не працює, оскільки я викликаю функцію в кутовому контролері. Запропоноване рішення jQuery дуже добре працює для мене.
джанні

5

Я просто грав з цією "особливістю" модалів Bootstrap. Здається, .modalклас має, overflow-y:auto;отже, модальний обгортник отримує власну смугу прокрутки, коли сам модальний стає високим.

Якщо ви завжди хочете смужку прокрутки (це часто роблять дизайнери), спочатку встановіть корпус

body {
    overflow-y:scroll;
}

Потім обробіть .modal-open

.modal-open .modal {
    overflow-y:scroll; /* Force a navbar on .modal */
}

.modal-open .topnavbar-wrapper {
    padding-right:17px; /* Noticed that right aligned navbar content got overlapped by the .modal scrollbar */
}

Залиште смугу прокрутки відключеною на тілі в цілому недоторканим

Всі інші відповіді на цій сторінці постійно змушували мій вміст стрибати.

Вгору!

Незважаючи на те, що це рішення працювало у мене весь час, вчора у мене виникла проблема з використанням цього виправлення, коли модаль можна перетягнути і збільшити, щоб розмістити на екрані (вертикально). Це може мати щось спільне з position:stickyелементами, які я додав?


Коли я додав body {overflow-y: scroll;}, моя проблема була вирішена. Дякую вам сер.
FrenkyB

1

Краще, якщо ви створите власний файл css для налаштування певної частини вашого завантажувального пакету.

Не змінюйте css-файл bootstrap, оскільки він змінить все у вашому bootstrap, як тільки ви використаєте його в інших частинах сторінки.

Якщо ваша сторінка дещо довга, вона автоматично надасть смугу прокрутки. І коли модаль відкриється, він приховає смугу прокрутки, оскільки це те, що завантажувальне програмне забезпечення робить за замовчуванням.

Щоб уникнути його приховування при відкритті модальної версії, просто перевизначте його, помістивши код css (нижче) у свій власний файл css.

.modal-open {
    overflow: scroll;
}

просто навпаки ...

.modal-open {
    overflow: hidden;
}

3
Здається, це містить ту саму інформацію, що й інша відповідь на це питання. Якщо ваша відповідь інша, відредагуйте її, щоб уточнити, що саме відрізняється. Будь ласка, додайте нову відповідь, лише якщо у вас є щось нове.
Джеффрі Босбум,

1
Він містить ту саму відповідь, але має інший спосіб пояснити її. Іноді розуміння залежить від того, як це пояснюється.
NormanCabilatazan

1
Не всі читачі могли отримати одну і ту ж ідею. Краще дати інший спосіб пояснити це, щоб вони зрозуміли чітко.
NormanCabilatazan

1

Крім того, якщо модальне спливаюче вікно має прокручувати вміст всередині, а батьківський повинен залишатися нерухомим, додайте наступне до вашого Custom.css (перевизначення css)

.modal-body {
    max-height: calc(100vh - 210px);
    overflow-y: auto;
}
.modal-open {
    overflow: hidden;
    overflow-y: scroll;
    padding-right: 0 !important;
}

0

модаль bootstrap додає відступ після того, як він відкриється, щоб ви могли спробувати цей код у власному css

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

0

Можливо, це спричинено тим, що 1-й модальний (у закритому стані) видаляє модально-відкритий клас із елемента body, а другий не додає його назад при активації modal-open.

У цьому випадку я б використовував подію, щоб перевірити, чи модал повністю закритий / прихований, і відкрити інший

let modal1 = $('.modal1);
let modal2 = $('.modal2);
$modal1.on('hidden.bs.modal', function (e) {
   $modal2.modal('show');
});

Це зачекає, поки 1-й модаль не буде закритий, щоб переконатися, що модально-відкрите видалено з корпусу та повторно додано, коли відкрито.


0

Я просто мав цю проблему сам, і знаходження цього питання швидко допомогло мені зрозуміти, що стало причиною такої поведінки. Тож спасибі.

Однак я вважаю, що ці способи обробки CSS трохи неелегантні. Хіба що, тобто, ви спеціально не хочете зберегти смуги прокрутки (хоча я не можу придумати причини для цього).

По суті, Bootstrap застосовує відступ до певних елементів для компенсації видалення смуги прокрутки.

Отже, все, що вам потрібно зробити, - це розмістити додаткову обгортку з нульовим відступом навколо вашого проблемного елемента (і перемістити до нього клас, на який націлено).

тобто змінити від цього ...

<div class="fixed-top p-1 bg-dark">
    ...this content will move as padding will be modified...
</div>

... до цього...

<div class="fixed-top p-0 bg-dark">
    <div class="p-1">
        ...this content won't move...
    </div>
</div>

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.