Як увімкнути прокрутку вмісту всередині модальної версії?


75

Я намагаюся вмістити багато тексту в модальне поле, створене за допомогою Twitter Bootstrap, але у мене проблема: вміст відмовляється прокручувати.

Я спробував додати overflow:scrollі overflow-y:scroll, але безрезультатно; це просто змушує його відображати смугу прокрутки, фактично не дозволяючи прокрутку.

У чому причина цього і що я можу зробити?


2
Колега люб’язно запропонував шукати body {overflow-y:scroll}та замінити на html {overflow: scroll;}. Це вирішило проблему для нас.
Lorenz Lo Sauer

Відповіді:


63

У Bootstrap.css змініть атрибут фону ( position) Modal з fixedнаabsolute


@jktress Я розумію коментар Расмуса, але не вашу відповідь. "фоновий атрибут"? Звичайно, ви не маєте на увазі, <div background="absolute" я припускаю, що ви маєте на увазі стиль, але навіть тоді немає "фіксованого" значення для фонового стилю, { background-position:fixed }не є дійсним.
AaronLS

3
Це насправді призводить до того, що модальний вміст для мене відрізаний. $.support.transition = falseНатомість установка робить прокрутку
належним чином

4
Це не глобальне корисне рішення. спробувати.modal {overflow-y: scroll}
Farzad YZ

Це рішення є проблемою, якщо на вашій сторінці є прокрутка. Модал може бути поза
Тімоті Гонсалес,

46

У Bootstrap 3 вам потрібно змінити cssклас.modal

до (за замовчуванням bootstrap):

.modal {

    overflow-y: auto;
}

після (після редагування):

.modal {

    overflow-y: scroll;
}

1
Вони зовсім різні. Перший використовує автоматичне значення, другий використовує значення прокрутки. Це вирішило для мене проблему.
Філіпп Вірт,

1
"До" означає, що css клас .modal мав до редагування ... Розділ "після" показує правильний спосіб замінити клас .modal.
Філіпп Вірт,

18

Ця відповідь насправді складається з двох частин, попередження про UX та фактичного рішення .

Попередження про UX

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

Фактичне рішення

Тут: http://jsfiddle.net/ajkochanowicz/YDjsE/2/

Це рішення також дозволить вам змінити висоту .modalта .modal-bodyзайняти залишковий простір вертикальною смугою прокрутки, якщо це необхідно.

ОНОВЛЕННЯ

Зверніть увагу, що в Bootstrap 3 модаль був реконструйований для кращої обробки переповненого вмісту. Ви зможете прокручувати сам модал вгору-вниз, коли він протікає під вікном перегляду.


У мене така сама проблема, і це не працює на мобільних пристроях, оскільки залежить від висоти пікселів.
Wayne Smallman

хм .. важко протестувати цю відповідь, оскільки пов’язана скрипка взагалі не використовує bootstrap ... це може пояснити деякі принципи на роботі, але джерело завантажувального файлу настільки заплутане, що я не думаю, що це так корисно без застосування принципи розмітки BS за замовчуванням.
ptim

Це може бути застарілим для останньої версії bootstrap, але у випадку скрипки, яку я надав, bootstrap - це лише код, який обходить це, вам не потрібно буде щось змінювати в самому bootstrap, лише елемент, який містить вміст, який ви хочете прокрутити.
Адам Грант,

Я міг би стверджувати, що модальний режим прокрутки - це попередження про дизайн UX. Розглянемо простий спосіб, який відображає, що list-groupдозволяє користувачеві вибрати один із 10 варіантів, що відображаються на мобільному телефоні в альбомному режимі, більш приємним рішенням було б modal-contentпрокручування, хоча я не бачив універсального рішення, яке добре працює на всіх пристроях.
Бретт Райан

6

Встановіть висоту для, modal-bodyа не для всього модального, щоб отримати ідеальну прокрутку на модальному накладенні. Я працюю так:

.MyModal {
    height: 450px;
    overflow-y: auto;
}

Тут ви можете встановити висоту відповідно до ваших вимог.


2
Нарешті, рішення! Примітка для динамічних модалів - height: auto;також працює, але модальна висота в будь-якому випадку встановлена ​​на авто, тому насправді все, що вам потрібно, це overflow-y: auto;. Я також застосував його .modalзамість того, щоб вибрати конкретний. Широке тестування показує, що до цього часу він працював над усіма способами.
Rockster160

4

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

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

function bindBootstrapModalEvents() {
    var $body = $('body'),
        curPos = 0,
        isOpened = false,
        isOpenedTwice = false;
    $body.off('shown.bs.modal hidden.bs.modal', '.modal');
    $body.on('shown.bs.modal', '.modal', function () {
        if (isOpened) {
            isOpenedTwice = true;
        } else {
            isOpened = true;
            curPos = $(window).scrollTop();
            $body.css('overflow', 'hidden');
        }
    });
    $body.on('hidden.bs.modal', '.modal', function () {
        if (!isOpenedTwice) {
            $(window).scrollTop(curPos);
            $body.css('overflow', 'visible');
            isOpened = false;
        }
        isOpenedTwice = false;
    });
}

Якщо вам це не подобається, іншим варіантом буде призначення max-height та overflow: auto для .modal-body приблизно так:

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

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


2

Ось як я це зробив суто з перевизначенням деяких класів CSS:

.modal {
  height: 60%;

  .modal-body {
    height: 80%;
    overflow-y: scroll;
  }
}

Сподіваюся, це допоможе вам.


7
Зверніть увагу: Вище сказане насправді Less CSSне є чистим CSS.
Fizzix

2

При використанні модального Bootstrap із skrollr, модальний не стане прокручуваним.

Виправлено проблему із зупинкою розповсюдження події дотику.

$('#modalFooter').on('touchstart touchmove touchend', function(e) {
    e.stopPropagation();
});

детальніше про те, як додати подію прокрутки до елемента всередині # skrollr-body


1

Насправді для Bootstrap 3 вам також потрібно замінити клас .modal-open на тілі.

    body.modal-open, 
    .modal-open 
    .navbar-fixed-top, 
    .modal-open 
    .navbar-fixed-bottom {
     margin-right: 15px; /*<-- to margin-right: 0px;*/
    }

1

У мене виникла ця проблема в Mobile Safari на моєму iPhone6

Bootstrap додає клас .modal-open до тіла, коли відкривається модаль.

Я спробував зробити мінімальні перевизначення Bootstrap 3.2.0 і придумав наступне:

.modal-open {
    position: fixed;
}

.modal {
    overflow-y: auto;
}

Для порівняння я включив пов'язані стилі Bootstrap нижче.

Вибраний витяг із bootstrap / less / modals.less (не включайте це у своє виправлення):

// Kill the scroll on the body
.modal-open {
  overflow: hidden;
}

// Container that the modal scrolls within
.modal {
  display: none;
  overflow: hidden;
  position: fixed;
  -webkit-overflow-scrolling: touch;
}

.modal-open .modal {
  overflow-x: hidden;
  overflow-y: auto;
}

Використана мобільна версія Safari: User-Agent Mozilla/5.0 (iPhone; CPU iPhone OS 8_1 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12B411 Safari/600.1.4


1
gah :( це насправді призводить до того, що BG важко залишає сайт, поки модаль відкритий. Я
оновлю

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

1

У мене була та сама проблема, і я знайшов виправлення, як показано нижче:

$('.yourModalClassOr#ID').on('shown.bs.modal', function (e) {
    $(' yourModalClassOr#ID ').css("max-height", $(window).height());
    $(' yourModalClassOr#ID ').css("overflow-y", "scroll");          /*Important*/
    $(' yourModalClassOr#ID ').modal('handleUpdate');

});

100% працює.



0

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

Тому я додав нижче виправлення css, щоб це працювало

.modal-open {
    overflow: hidden;
}

.modal-open .modal {
    overflow-x: hidden;
    overflow-y: auto;
    **pointer-events: auto;**
}

Додані вказівник-події: авто; щоб зробити її прокручуваною мишею.


0

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

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

0

Bootstrap додасть або видалить css "modal-open"до<body> тегу, коли ми відкриваємо або закриваємо модаль. Отже, якщо ви відкриєте кілька модальних, а потім закриєте довільний, модально-відкритий css буде видалено з тегу body.

Але ефект прокрутки залежить від атрибута, "overflow-y: auto;"визначеного вmodal-open


-2

Рішення 1 : Ви можете заявити, .modal{ overflow-y:auto}або .modal-open .modal{ overflow-y:auto}якщо ви використовуєте bootstrap нижче 3v (для верхніх версій це вже заявлено).

Bootstrap додає modal-openклас для bodyтого, щоб видалити смуги прокрутки у випадку, якщо відображається модальний, але не додає жодного класу, до htmlякого також можуть бути смуги прокрутки, в результаті смужка прокрутки htmlіноді також може бути видно, для її видалення потрібно встановити модальне шоу / приховати події і додати / видалити overflow:hidden на html. Ось як це зробити.

$('.modal').on('hidden.bs.modal', function () {
   $('html').css('overflow','auto');
}).on('shown.bs.modal', function () {
   $('html').css('overflow','hidden');
});

Рішення 2 : Оскільки модаль має функціональні клавіші, найкращий спосіб вирішити це - зафіксувати висоту монтажу або навіть краще зв'язати висоту модаля з висотою вікна перегляду, як це -

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

За допомогою цього методу вам також не доведеться обробляти bodyіhtml смуги прокрутки.

Примітка 1 : Підтримка браузера дляvh одиниць.

Примітка 2 : Як пропонується вище . Якщо ви перейдете .modal{position:fixed}на .modal{position:absolute}, але якщо сторінка має більшу висоту, ніж модальний, користувач може прокрутити занадто багато вгору, і модальний зникне з області перегляду, це погано для користувацького досвіду.

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