Como colocar a barra de rolagem apenas para o corpo modal?

164

Eu tenho o seguinte elemento:

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

Ele mostra o diálogo modal mais ou menos assim, basicamente, coloca a barra de rolagem inteira modal-dialoge nãomodal-body o conteúdo que estou tentando exibir.

A imagem é mais ou menos assim:

insira a descrição da imagem aqui

Como faço para obter apenas uma barra de rolagem modal-body?

Eu tentei atribuir style="overflow-y: scroll; max-height:85%; margin-top: 50px; margin-bottom:50px;"a, modal-bodymas não funcionou.

Subodh Nijsure
fonte
1
Por favor, forneça uma amostra de trabalho para lhe dar uma melhor ajuda, você pode usar bootply.com/new para fazer isso.
Carlos Calla
Em seguida, permitir opcionais blocos de cabeçalho e rodapé de fluidos no interior de modo modal que apenas os pergaminhos do corpo: stackoverflow.com/questions/49173969/...
leontalbot

Respostas:

297

Você tem que definir o heightda .modal-bodye dar-lhe overflow-y: auto. Redefina também o .modal-dialogvalor de estouro para initial.

Veja a amostra de trabalho:

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;
}
Carlos Calla
fonte
Obrigado por isso. Isso funciona muito bem. Pode ser que algo não esteja claro para mim em css. Tentei atribuir a altura máxima do corpo modal: 65% que não funciona. A solução que você forneceu funciona apenas se eu atribuir altura fixa ao corpo modal. Não há como dizer que o diálogo modal ocupa 85% da janela e o corpo modal deve ocupar, digamos, 90% do diálogo modal? Mas, novamente, a solução que você forneceu funciona para mim, por enquanto. Obrigado!
Subodh Nijsure
3
@SubodhNijsure Desculpe pela resposta tardia. Você não pode definir a altura em% porque isso significa uma% de seu pai, nesse caso o pai é .modal-content e sua altura depende de seus filhos. É por isso que não funcionará, a menos que você defina uma delas. Você define a altura do conteúdo .modal ou a altura do corpo .modal. Se você definir altura .modal-content, poderá definir a altura de .modal-body em% e será um% de seu pai, portanto, se você definir menos de 100%, haverá espaço em branco no inferior, já que você não está preenchendo toda a altura do conteúdo .modal.
Carlos Calla
Lembre-se de que a initialpalavra-chave do CSS não funciona no Internet Explorer, embora funcione no Edge.
trysis
18
apenas um pequeno indicador: em vez de "altura 250px", que pode parecer feia em alguns telefones com apenas 230px de altura ou menos com a barra de navegação na paisagem: use max-height: 80vh;80% da altura total da viewport e apenas a altura máxima, não se é uma pequena janela pop
Toskan (
1
funciona bem, mas depois de fechar o modal, os links na janela 'pai' não são mais clicáveis ​​... resolvidos com o seguinte código: .modal .modal-body {max-height: 420px; estouro-y: automático; }
cwhisperer
119

Se você estiver suportando apenas o IE 9 ou superior, poderá usar este CSS que será dimensionado suavemente para o tamanho da janela. Você pode precisar ajustar os "200px", dependendo da altura do cabeçalho ou rodapé.

.modal-body{
    max-height: calc(100vh - 200px);
    overflow-y: auto;
}
Jonathan Marston
fonte
De acordo com [1] e [2], isso também é suportado pelo Chrome, Firefox e Safari. [1] developer.mozilla.org/en-US/docs/Web/CSS/… [2] developer.mozilla.org/en-US/docs/Web/CSS/…
ctron em
Nota: Esta solução faz as aparece popover sob cabeçalho ou rodapé, dependendo da opção selecionada superior ou inferior Veja este I violino criado: jsfiddle.net/2qeo99k3/4 Sem o css cortá-lo funciona muito bem basta removê-lo no violino para ver ele funciona
Marc Roussel
Uma solução para o popover pode ser encontrada aqui: stackoverflow.com/questions/45666828/...
Marc Roussel
36

Problema resolvido com a solução combinada @carlos calla e @jonathan marston.

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

Para versões do Bootstrap> = 4.3

O Bootstrap 4.3 adicionou um novo recurso de rolagem interno aos modais. Isso faz apenas o conteúdo do corpo modal rolar se o tamanho do conteúdo, de outro modo, a página rolar. Para usá-lo, basta adicionar a classe modal-dialog-scrollable à mesma div que possui o modal-dialog classe .

Aqui está um exemplo:

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

Kodos Johnson
fonte
14

Adicionando ao Carlos Calla ótima resposta de .

A altura do .modal-body deve ser definida, MAS você pode usar consultas de mídia para garantir que seja apropriado para o tamanho da tela.

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

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

@media (min-height: 800px) {
    .modal-body { height: 600px; }
}
laurakurup
fonte
Assumir que a altura será 400px ou superior em um dispositivo móvel está com defeito. Usar a largura para determinar a altura não é uma solução viável. Existem muitos casos de uso que causariam isso.
Morango
2
@Strawberry ele realmente usou min-height (não min-width) e certificou-se de que a altura fornecida seja menor que a min-height na consulta de mídia. Além disso, ele está apenas dando um exemplo para sua ideia, porque a consulta à mídia pode variar muito, dependendo do que o OP deseja alcançar.
Carlos Calla
12

Opcional : Se você não quiser que o modal exceda a altura da janela e use uma barra de rolagem no corpo .modal, poderá usar esta solução responsiva. Veja uma demonstração de trabalho aqui: 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'));
  }
});
dimbslmh
fonte
5

Eu sei que esse é um tópico antigo, mas isso pode ajudar outra pessoa.

Consegui fazer o corpo rolar, fixando a posição do elemento de diálogo modal. E como eu nunca saberia a altura exata da janela do navegador, peguei as informações que eu tinha certeza, a altura do cabeçalho e do rodapé. Consegui, então, fazer com que as margens superior e inferior do elemento modal correspondessem àquelas alturas. Isso produziu o resultado que eu estava procurando. Eu joguei um violino para mostrar meu trabalho.

Além disso, se você quiser uma caixa de diálogo em tela cheia, desmarque a largura: auto; dentro da seção .modal-dialog.full-screen.

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

E aqui está o css que eu usei para modificar a caixa de diálogo de inicialização.

.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;
}
Bogus Hawtsauce
fonte
5

Ou mais simples, você pode colocar entre suas tags primeiro e depois na classe css.

<div style="height: 35px;overflow-y: auto;"> Some text o othre div scroll </div>
user7695590
fonte
1
#scroll-wrap {
    max-height: 50vh;
    overflow-y: auto;
}

Usando max-heightcom vhcomo a unidade na modal-bodydivisória de um wrapper ou dentro da modal-body. Isso redimensionará a altura demodal-body ou a divisão de agrupamento (neste exemplo) automaticamente quando um usuário redimensionar a janela.

vh é a unidade de comprimento que representa 1% do tamanho da janela de exibição para a altura da janela de exibição.

Gráfico de compatibilidade do navegador paravh unidade.

Exemplo: https://jsfiddle.net/q3xwr53f/

Steven
fonte
1

O que funcionou para mim foi definir a altura para 100% e ter o estouro no auto espero que isso ajude

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

Uma solução js simples para definir a altura modal proporcional à altura do corpo:

$(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>');
});

a altura do corpo deve ser de 100%:

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

Eu defino a altura do corpo modal para 80% do corpo, isso pode ser personalizado.

Espero que ajude.

migli
fonte