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


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 height, либо устанавливаете .modal-body height. Если вы установите .modal-content height, то вы сможете установить высоту .modal-body в%, и это будет% от его родителя, поэтому, если вы установите его менее 100%, на пустом месте будет bottom, так как вы не заполняете всю высоту .modal-content.
Карлос Калла

Имейте в виду, что initialключевое слово CSS не работает для Internet Explorer, хотя оно работает для Edge.
trysis

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

1
работает нормально, но после закрытия модального окна ссылки в родительском окне больше не доступны для щелчка мышью ... решается с помощью следующего кода: .modal .modal-body {max-height: 420px; переполнение-у: авто; }
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

Примечание: Это решение заставляет всплывающее окно появляться под верхним или нижним колонтитулом в зависимости от выбранной опции сверху или снизу. Посмотрите эту созданную мной скрипку: jsfiddle.net/2qeo99k3/4 Без взлома css он работает просто отлично, просто удалите его в скрипке, чтобы увидеть это работает
Марк Руссель

Обходной путь для поповера можно найти здесь: stackoverflow.com/questions/45666828/…
Марк

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 добавил новую встроенную функцию прокрутки к модалам. Это делает только прокрутку содержимого модального тела, если размер содержимого иначе заставил бы прокрутить страницу. Чтобы использовать его, просто добавьте класс modal-dialog-scrollable к тому же div, который имеет класс modal-dialog .

Вот пример:

<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; }
}

Предположение, что на мобильном устройстве высота будет 400px или больше, является ошибочным. Использование ширины для определения высоты вообще неосуществимо. Есть слишком много вариантов использования, которые могут привести к поломке.
Клубника

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

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

Я знаю, что это старая тема, но это может помочь кому-то еще.

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

Кроме того, если вы хотите полноэкранное диалоговое окно, просто откомментируйте width: auto; внутри раздела .modal-dialog.full-screen.

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или обертка div внутри modal-body. Это изменит высотуmodal-body или div обтекания (в этом примере), когда пользователь изменит размер окна.

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%, это, конечно, можно настроить.

Надеюсь, поможет.


0

В последней версии начальной загрузки есть класс, чтобы сделать модальное тело прокручиваемым.

.modal-dialog-прокручивается до .modal-dialog .

Модальная ссылка Bootstrap для прокручиваемого содержимого модального тела

<!-- Scrollable modal -->
<div class="modal-dialog modal-dialog-scrollable">
  ...
</div>
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.