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


165

У мене є такий елемент:

<div class="modal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true"> 
    <div class="modal-dialog" style="overflow-y: scroll; max-height:85%;  margin-top: 50px; margin-bottom:50px;" > 
        <div class="modal-content"> 
            <div class="modal-header"> 
                <h3 class="modal-title"></h3> 
            </div> 
            <div class="modal-body"></div> 
            <div class="modal-footer"></div> 
        </div> 
    </div> 
</div> 

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

Зображення виглядає приблизно так:

введіть тут опис зображення

Як отримати лише смугу прокрутки навколо modal-body?

Я спробував призначити style="overflow-y: scroll; max-height:85%; margin-top: 50px; margin-bottom:50px;"на modal-bodyале це не спрацювало.


1
Будь ласка, дайте робочу пробу, щоб вам краще допомогти, ви можете використовувати bootply.com/new для цього.
Карлос Калла

Далі, дозволяють додаткові колонтитулів блоки рідини всередині модального , так що просто прокручується тіла: stackoverflow.com/questions/49173969 / ...
leontalbot

Відповіді:


298

Ви повинні встановити heightвхід .modal-bodyі дати його overflow-y: auto. Також скиньте .modal-dialogзначення переповнення до initial.

Дивіться робочий зразок:

http://www.bootply.com/T0yF2ZNTUd

.modal{
    display: block !important; /* I added this to see the modal, you don't need this */
}

/* Important part */
.modal-dialog{
    overflow-y: initial !important
}
.modal-body{
    height: 250px;
    overflow-y: auto;
}

Дякую за це Це чудово працює. Може бути щось не зрозуміло мені в css. Я спробував призначити максимальну висоту модального тіла: 65%, яка не працює. Надане вами рішення працює лише в тому випадку, якщо я призначаю фіксовану висоту модальному тілу. Чи немає способу сказати, що модальний діалог займає 85% вікна, а модальне тіло повинно займати, наприклад, 90% модального діалогу? Але знову ж таки рішення, яке ви надали, працює для мене. Дякую!
Subodh Nijsure

3
@SubodhNijsure Вибачте за пізню відповідь. Ви не можете встановити висоту у%, тому що це буде означати% його батьківського, у цьому випадку батьківський .modal-content та його висота залежить від його дітей. Тому це не спрацює, якщо ви не встановите одну з них висоти. Або встановіть висоту .modal-content або встановіть .modal-body height. Якщо ви встановите висоту .modal-content, то ви зможете встановити висоту .modal-body у%, і це буде% його батьківського, тож якщо ви встановите його менше 100%, у вікні буде порожнє місце знизу, оскільки ви не заповнюєте всю висоту .modal-content.
Карлос Калла

Майте на увазі, що initialключове слово CSS не працює для Internet Explorer, хоча воно працює і для Edge.
trysis

18
лише невеликий вказівник: замість "висота 250 пікселів", яка може виглядати некрасиво на деяких телефонах з висотою лише 230 пікселів або менше з навбаром у пейзажі: просто використовуйте, max-height: 80vh;що становить 80% від загальної висоти вікна перегляду і лише для максимальної висоти, а не якщо це невелике спливаюче вікно
Тоскан

1
працює чудово, але після закриття модальних посилань у вікні 'батьків' більше не можна натискати ... вирішується за допомогою наступного коду: .modal .modal-body {max-height: 420px; overflow-y: авто; }
cwhisperer

119

Якщо ви підтримуєте лише IE 9 або новішої версії, ви можете використовувати цей CSS, який плавно масштабуватиме розмір вікна. Можливо, вам доведеться налаштувати "200px", але залежно від висоти заголовка або колонтитула.

.modal-body{
    max-height: calc(100vh - 200px);
    overflow-y: auto;
}

Відповідно до [1] та [2], це також підтримується Chrome, Firefox та Safari. [1] developer.mozilla.org/en-US/docs/Web/CSS/… [2] developer.mozilla.org/en-US/docs/Web/CSS/…
ctron

Примітка. Це рішення змушує popover з'являтися під заголовком або колонтитулом залежно від обраного варіанту або вгорі, або внизу. Дивіться цю створену нами скрипку: jsfiddle.net/2qeo99k3/4 Без злому css це працює просто чудово, просто видаліть її у скрипці, щоб побачити працює
Марк Руссель

Проблему подолання можна знайти тут: stackoverflow.com/questions/45666828/…
Marc Roussel

37

Проблема вирішена комбінованим розчином @carlos calla та @jonathan marston.

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

20

Для версій Bootstrap> = 4.3

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

Ось приклад:

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.bundle.min.js"></script>
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" rel="stylesheet"/>
<!-- Button trigger modal -->
<button type="button" class="btn btn-primary" data-toggle="modal" data-target="#exampleModalScrollable">
  Launch demo modal
</button>

<!-- Modal -->
<div class="modal fade" id="exampleModalScrollable" tabindex="-1" role="dialog" aria-labelledby="exampleModalScrollableTitle" aria-hidden="true">
  <div class="modal-dialog modal-dialog-scrollable" role="document">
    <div class="modal-content">
      <div class="modal-header">
        <h5 class="modal-title" id="exampleModalScrollableTitle">Modal title</h5>
        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
          <span aria-hidden="true">&times;</span>
        </button>
      </div>
      <div class="modal-body">
        the<br>quick<br>brown<br>fox<br>
        the<br>quick<br>brown<br>fox<br>
        the<br>quick<br>brown<br>fox<br>
        the<br>quick<br>brown<br>fox<br>
        the<br>quick<br>brown<br>fox<br>
        the<br>quick<br>brown<br>fox<br>
        the<br>quick<br>brown<br>fox<br>
        the<br>quick<br>brown<br>fox<br>
        the<br>quick<br>brown<br>fox<br>
        the<br>quick<br>brown<br>fox<br>
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
        <button type="button" class="btn btn-primary">Save changes</button>
      </div>
    </div>
  </div>
</div>


14

Додаючи чудову відповідь Карлоса Калли .

Необхідно встановити висоту .modal-body, Але ви можете використовувати медіа-запити, щоб переконатися, що він відповідає розміру екрана.

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

@media (min-height: 500px) {
    .modal-body { height: 400px; }
}

@media (min-height: 800px) {
    .modal-body { height: 600px; }
}

Припущення, що висота на мобільному пристрої буде дорівнює 400 пікс. Використання ширини для визначення висоти взагалі не є можливим рішенням. Занадто багато випадків використання, які можуть призвести до порушення цього.
Полуниця

2
@Strawberry він фактично використовував min-висоту (не min-ширину) і переконався, що вказана висота менша, ніж мінімальна висота в медіа-запиті. Крім того, він лише наводить приклад своєї ідеї, оскільки медіа-запит може сильно відрізнятися залежно від того, чого хоче досягти ОП.
Карлос Калла

12

Необов’язково : Якщо ви не хочете, щоб модал перевищував висоту вікна та використовував смугу прокрутки в .modal-body, ви можете використовувати це чуйне рішення. Дивіться робочу демонстрацію тут: http://codepen.io/dimbslmh/full/mKfCc/

function setModalMaxHeight(element) {
  this.$element     = $(element);
  this.$content     = this.$element.find('.modal-content');
  var borderWidth   = this.$content.outerHeight() - this.$content.innerHeight();
  var dialogMargin  = $(window).width() > 767 ? 60 : 20;
  var contentHeight = $(window).height() - (dialogMargin + borderWidth);
  var headerHeight  = this.$element.find('.modal-header').outerHeight() || 0;
  var footerHeight  = this.$element.find('.modal-footer').outerHeight() || 0;
  var maxHeight     = contentHeight - (headerHeight + footerHeight);

  this.$content.css({
      'overflow': 'hidden'
  });

  this.$element
    .find('.modal-body').css({
      'max-height': maxHeight,
      'overflow-y': 'auto'
  });
}

$('.modal').on('show.bs.modal', function() {
  $(this).show();
  setModalMaxHeight(this);
});

$(window).resize(function() {
  if ($('.modal.in').length != 0) {
    setModalMaxHeight($('.modal.in'));
  }
});

5

Я знаю, що це стара тема, але це може допомогти комусь іншому.

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

також, якщо ви хочете повноекранний діалог, просто не коментуйте ширину: auto; всередині .modal-dialog.повний екран.

https://jsfiddle.net/lot224/znrktLej/

І ось css, який я використовував для зміни діалогового вікна завантаження.

.modal-dialog.full-screen {
    position:fixed;
    //width:auto;  // uncomment to make the width based on the left/right attributes.
    margin:auto;                        
    left:0px;
    right:0px;
    top:0px;
    bottom:0px;
}

.modal-dialog.full-screen .modal-content {
      position:absolute;
      left:10px;
      right:10px;
      top:10px;
      bottom:10px;
}

.modal-dialog.full-screen .modal-content .modal-header {
        height:55px;  // adjust as needed.
}

.modal-dialog.full-screen .modal-content .modal-body {
        overflow-y: auto;
          position: absolute;
          top: 0;
          bottom: 0;
        left:0;
        right:0;
          margin-top: 55px; // .modal-header height
          margin-bottom: 80px;  // .modal-footer height
}

.modal-dialog.full-screen .modal-content .modal-footer {
        height:80px;  // adjust as needed.
        position:absolute;
        bottom:0;
        left:0;
        right:0;
}

5

Або простіше, ви можете розмістити спочатку між тегами, а потім у класі css.

<div style="height: 35px;overflow-y: auto;"> Some text o othre div scroll </div>

1
#scroll-wrap {
    max-height: 50vh;
    overflow-y: auto;
}

Використання max-heightза vhдопомогою підрозділу на modal-bodyабо роздільній оболонці всередині modal-body. Це дозволить змінити розмір висоти modal-bodyабо обгорткового розділу (у цьому прикладі) автоматично, коли користувач змінить розмір вікна.

vh - це одиниця довжини, що становить 1% від розміру вікна перегляду для висоти вікна перегляду.

Схема сумісності браузера для vhодиниці.

Приклад: https://jsfiddle.net/q3xwr53f/


1

Що працювало для мене, це встановити висоту на 100%, якщо перелив на автоматичну надію це допоможе

   <div style="height: 100%;overflow-y: auto;"> Some text o othre div scroll </div>

0

Просте js рішення встановити модальну висоту, пропорційну висоті тіла:

$(document).ready(function () {
    $('head').append('<style type="text/css">.modal .modal-body {max-height: ' + ($('body').height() * .8) + 'px;overflow-y: auto;}.modal-open .modal{overflow-y: hidden !important;}</style>');
});

Зріст тіла повинен бути 100%:

html, body {
    height: 100%;
    min-height: 100%;
}

Я встановив модальний зріст тіла до 80% тіла, це, звичайно, можна налаштувати.

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


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