Прокручуваний модальний спосіб завантаження Twitter


84

Я використовую завантажувальний твіттер для проекту, над яким я працюю.

У мене є модальне вікно, яке має дещо довшу форму, і мені це не сподобалось, коли вікно стало занадто маленьким, модаль не прокручувався (якщо просто зник з моєї сторінки, яку не можна прокручувати).

Щоб виправити це, я використав наступний css

.modal {
    overflow-y:auto;
    max-height:90%;
    margin-top:-45%;
}

Це працює саме так, як я хочу, щоб це було в Chrome (тобто форма в повному розмірі, коли вікно досить велике, але в міру зменшення вікна модальний стискається і стає прокручуваним). Проблема полягає в тому, що в IE модальний режим не з екрану. Хтось має краще рішення цієї проблеми?

Мій приклад можна знайти на сайті tinyhousemap.com (натисніть "Додати запис на карту" у вікні навігації, щоб з’явився модаль)

Дякую


Я знайшов і використовував це рішення. Це дуже гладко, як це дозволяє прокручувати лише модальний завантажувальний модуль, а не фоновий вміст. github.com/aroc/Bootstrap-Scroll-Modal
Річард Адлета

Відповіді:


137

Як щодо рішення нижче? У мене це спрацювало. Спробуйте це:

.modal .modal-body {
    max-height: 420px;
    overflow-y: auto;
}

Подробиці:

  1. видалити overflow-y: auto;або overflow: auto;з .modal класу (важливо)
  2. видалити max-height: 400px;з .modalкласу (важливо)
  3. Додати max-height: 400px;до .modal .modal-body (або що завгодно, може бути 420pxабо менше, але не піде більше ніж 450px)
  4. Додати overflow-y: auto;до.modal .modal-body

Готово, прокручуватиметься лише тіло.


5
Я дійшов до цього самостійно, але дуже хотів, щоб воно було настільки високим, наскільки дозволяє вікно, а не найнижчим загальним знаменником. Але вказівка max-height: 80%;не працює, вона розширюється замість прокрутки. Чи потрібно використовувати події зміни розміру для коригування $(".modal")[0].style.maxHeight?
Пітер Вон

18

Я зробив крихітне рішення, використовуючи лише jQuery.

По-перше, вам потрібно додати додатковий клас до вашого, який <div class="modal-body">я назвав "ativa-scroll", і він стане приблизно таким:

<div class="modal-body ativa-scroll">

Тож просто розмістіть цей фрагмент коду на своїй сторінці біля вашого завантаження JS:

<script type="text/javascript">
  $(document).ready(ajustamodal);
  $(window).resize(ajustamodal);
  function ajustamodal() {
    var altura = $(window).height() - 155; //value corresponding to the modal heading + footer
    $(".ativa-scroll").css({"height":altura,"overflow-y":"auto"});
  }
</script>

Я чудово працюю для мене, також у чуйному режимі! :)


1
Чудове рішення, але я б змінив висоту на max-height
Олег

1
Крім того, ви можете використовувати $ ('. Modal'). On ('show.bs.modal', function (e) {}); щоб увімкнути функцію розміру. Це дозволить обчислити висоту лише за необхідності, а не для кожного розміру та навантаження. Вам просто потрібно перевірити у функції події, чи використовує поточний модаль спеціальну висоту прокрутки перед обчисленням / застосуванням css. тобто var scrollModal = $ ('. modal-body.modal-scroll', це); if (scrollModal.length) ...
Роберт Вадделл

це для bootstrap 2 або 3?
шпигун

17
/* Important part */
.modal-dialog{
    overflow-y: initial !important
}
.modal-body{
    max-height: calc(100vh - 200px);
    overflow-y: auto;
}

Це працює для Bootstrap 3 без коду JS і швидко реагує.

Джерело


це завантажувальний ремінь 2 чи 3? питання, швидше за все, було опубліковано для bootstrap 2
шпигун

@spy це для bootstrap 3
Гійом Реноут

8

Спробуйте замінити завантажувальний ремінь:

 .modal {
position: fixed;

З:

.modal {
position: absolute;

У мене це спрацювало.


1
Це викликає проблему вирівнювання на IPad
Олег

4

Я також додав

.modal { position: absolute; }

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

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

$('.modal').css('top', $(document).scrollTop() + 50);

Здається, щасливі в FireFox, Chrome, IE10 8 і 7 (браузери, які мені довелося вручити)


1

Ваш модаль прихований у Firefox, і це через декларацію негативного поля, яку ви маєте у вашій загальній таблиці стилів:

.modal {
    margin-top: -45%; /* remove this */
    max-height: 90%;
    overflow-y: auto;
}

Видаліть від’ємне поле, і все працює просто чудово.


Видалення верхнього поля покращило модальний режим, так що він не так далеко від екрана в IE, але тепер він знаходиться лише по центру (вертикально) на екрані за певного розміру вікна. Всі інші розміри модальних переповнюються у верхній або нижній частині екрана.
Dan dot net

1
@Dandotnet модальний позиціонує себе на 50% від верхньої частини вікна автоматично, ви можете перезаписати це чимось нижчим, як 10%, але якщо ви додали негативне значення, воно просто вийде з екрана, як це робиться в IE. До речі, те саме відбувається у firefox.
Андрес Іліч

1

У разі використання .modal {overflow-y: auto;}створить додаткову смугу прокрутки праворуч на сторінці, коли тіло вже переповнене.

Для цього потрібно тимчасово видалити переповнення з тегу тіла та встановити для модального переповнення-y значення auto .

Приклад:

$('.myModalSelector').on('show.bs.modal', function () {

        // Store initial body overflow value
        _initial_body_overflow = $('body').css('overflow');

        // Let modal be scrollable
        $(this).css('overflow-y', 'auto');
        $('body').css('overflow', 'hidden');


    }).on('hide.bs.modal', function () {

        // Reverse previous initialization
        $(this).css('overflow-y', 'hidden');
        $('body').css('overflow', _initial_body_overflow);
});

1

Проблема рішення CSS @ grenoult (яке в основному працює) полягає в тому, що він повністю реагує та працює на мобільному пристрої, коли клавіатура вискакує (тобто, коли вони клацають введенням у модальному діалозі), розмір екрану змінюється, а модальний діалог змінюється розмір змінюється, і він може приховати введення, на яке вони щойно клацнули, щоб вони не бачили, що вони вводять.

Кращим рішенням для мене було використовувати jquery наступним чином:

$(".modal-body").css({ "max-height" : $(window).height() - 212, "overflow-y" : "auto" });

Він не реагує на зміну розміру вікна, але все одно це трапляється не так часто.


1

Мені вдалося подолати це, використовуючи метрику "vh" з max-height на елементі .modal-body. 70vh дивився приблизно для мого використання. Потім встановіть для overflow-y значення auto, щоб він прокручувався лише за потреби.

.modal-body {
   overflow-y: auto;
   max-height: 70vh;
}

0

Нічого з цього не буде працювати належним чином. Правильним способом є зміна позиції: фіксована на позицію: абсолютна для класу .modal


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