modal bootstrap remove barra de rolagem

94

Quando eu acionar uma visualização modal na minha página, ela faz com que a barra de rolagem desapareça. É um efeito irritante porque a página de fundo começa a se mover quando o modal entra / desaparece. Existe cura para esse efeito?

El Dude
fonte
1
Resposta compatível com navegador: stackoverflow.com/a/47807685/7186739
Super modelo

Respostas:

115

Este é um recurso, a classe modal-opené adicionada ao HTML bodyquando você mostra o modal e removida quando você o oculta.

Isso faz com que a barra de rolagem desapareça, pois o CSS do bootstrap diz

.modal-open {
    overflow: hidden;
}

Você pode substituir isso especificando

.modal-open {
    overflow: scroll;
}

em seu próprio css.

flup
fonte
Você pode por gentileza ser mais específico?
El Dude
1
Adicionados mais alguns detalhes. Melhor agora?
flup
14
É mais apropriado usar overflow-y: scroll, que acho que aborda melhor a intenção da pergunta dos OPs. Usando overflow: scroll irá adicionar uma barra de rolagem horizontal na parte inferior da tela.
Scott
1
perfeito, funciona com modais de cinta angular também, pode simplesmente incluir o CSS acima em um <style></style>dentro do templateUrlpara não infligir em outros modais no aplicativo.
davidkonrad
2
Use overflow: herdar; em vez de. Desta forma, o modal não remove scroll quando você tem scroll e não adiciona scroll quando você não tem
Alisson Alvarenga
31

Eu acho que herdar é melhor do que rolar porque quando você abre modal, ele sempre abrirá com rolar, mas quando você não tiver nenhum pergaminho você terá o mesmo problema. Então, eu só faço isso:

.modal-open {
  overflow: inherit;
}
Alisson Alvarenga
fonte
Esta é a verdadeira resposta. overflow scroll ainda afetam algum elemento no meu caso.
Coisox
26

eu usei

.modal-open {
  overflow-y: scroll;
}

Neste caso você evita exibir a barra de rolagem horizontal

Mauro
fonte
poderíamos combiná-lo com a resposta de @Alisson Alvarenga e usar overflow-y: inherit;
duodvk
23

É melhor usar overflow-y: role e remova o preenchimento do corpo, bootstrap modal adicionado ao corpo da página.

.modal-open {
  overflow:hidden;
  overflow-y:scroll;
  padding-right:0 !important;
}

Compatível com o navegador IE: o navegador IE faz a mesma coisa por padrão.

Super Model
fonte
1
THX. Além disso, se o pop-up modal precisar rolar e o pai precisar permanecer imóvel .modal-body {max-height: calc (100vh - 210px); overflow-y: automático; } .modal-open {overflow: hidden; overflow-y: scroll; padding-right: 0! importante; }
Oracular Man
9

Graças a Deus encontrei este post! Eu estava puxando meu cabelo tentando descobrir como fazer minhas barras de rolagem voltarem ao fechar a janela usando meu próprio link de fechamento. Tentei as sugestões para CSS, mas não estava funcionando corretamente. Depois de ler

a classe modal-open é adicionada ao corpo do HTML quando você mostra o modal e removida quando você o oculta. - @flup

Eu vim com uma solução usando jquery, então caso outra pessoa tenha o mesmo problema e as sugestões acima não funcionem -

<script>
            jQuery(document).ready(function () {
jQuery('.closeit').click(function () {
 jQuery('body').removeClass('modal-open');
                });
            });
        </script>
Rico
fonte
Tive um problema em que estava substituindo o evento hide.bs.modal para poder executar algum código personalizado quando o modal estava oculto, mas o que não percebi é que impediu que a classe aberta modal fosse removida do corpo - portanto, minha barra de rolagem não voltou ao fechar este modal específico. Não estou removendo a classe modal-open manualmente em meu código hide.bs.modal e isso corrige esse problema.
Jim
1
Você só precisa adicionar um data-dismiss="modal"atributo ao seu link, em vez de fazer algo personalizado como isso. O Bootstrap fará todas as ações de fechamento apropriadas quando o link for clicado.
nollidge de
1
data-despedir = "modal" não está funcionando no meu caso porque estou chamando uma função no controlador angular. A solução jQuery sugerida funciona muito bem para mim.
gianni
5

Eu estava apenas brincando com esse 'recurso' dos modais Bootstrap. Parece que a .modalclasse tem overflow-y:auto;Então, o wrapper modal obtém sua própria barra de rolagem quando o próprio modal torna-se muito alto.

Se você sempre quiser uma barra de rolagem (os designers costumam fazer) Primeiro defina o corpo

body {
    overflow-y:scroll;
}

Então manuseie .modal-open

.modal-open .modal {
    overflow-y:scroll; /* Force a navbar on .modal */
}

.modal-open .topnavbar-wrapper {
    padding-right:17px; /* Noticed that right aligned navbar content got overlapped by the .modal scrollbar */
}

Deixe a barra de rolagem desativada no corpo intocada neste caso

Todas as outras respostas nesta página continuaram fazendo meu conteúdo pular.

Atenção!

Embora essa solução funcionasse para mim o tempo todo, ontem eu tive um problema ao usar essa correção quando o modal é arrastável e grande demais para caber na tela (verticalmente). Pode ter algo a ver com os position:stickyelementos que adicionei?

Brainfeeder
fonte
Quando adicionei body {overflow-y: scroll;}, meu problema foi resolvido. Obrigado, senhor.
FrenkyB
1

Melhor se você criar seu próprio arquivo css para personalizar uma certa parte de sua embalagem de inicialização.

Não altere o arquivo css do bootstrap porque ele mudará tudo em seu bootstrap assim que você usá-lo em outras partes de sua página.

Se sua página for um pouco longa, ela fornecerá automaticamente uma barra de rolagem. E quando o modal for aberto, ele irá ocultar a barra de rolagem porque é isso que o bootstrap faz por padrão.

Para evitar ocultá-lo quando o modal for aberto, basta substituí-lo colocando o código css (abaixo) em seu próprio arquivo css.

.modal-open {
    overflow: scroll;
}

apenas vice-versa ...

.modal-open {
    overflow: hidden;
}
NormanCabilatazan
fonte
3
Esta parece conter as mesmas informações que a outra resposta a esta pergunta. Se sua resposta for diferente, edite-a para esclarecer o que exatamente é diferente. Por favor, adicione uma nova resposta apenas se você tiver algo novo.
Jeffrey Bosboom,
1
Ele contém a mesma resposta, mas tem outra maneira de explicá-la. Às vezes, a compreensão depende de como é explicado.
NormanCabilatazan
1
Nem todos os leitores podem ter a mesma ideia. Melhor dar outra forma de explicar para que eles entendam claramente.
NormanCabilatazan
1

Além disso, se o pop-up modal precisar rolar com o conteúdo interno e o pai precisar permanecer imóvel, adicione o seguinte ao seu Custom.css (substituindo css)

.modal-body {
    max-height: calc(100vh - 210px);
    overflow-y: auto;
}
.modal-open {
    overflow: hidden;
    overflow-y: scroll;
    padding-right: 0 !important;
}
Homem oracular
fonte
0

o modal de bootstrap adiciona um preenchimento assim que abre para que você possa tentar este código em seu próprio css

.modal-open {
    padding: 0 !important;
}
mehdigriche
fonte
0

Isso provavelmente ocorre porque o primeiro modal (quando fechado) remove a classe aberta modal do elemento de corpo e o segundo não a adiciona de volta quando dispara a abertura modal.

Nesse caso, eu usaria o evento para verificar se o modal foi fechado / escondido totalmente e abriria outro

let modal1 = $('.modal1);
let modal2 = $('.modal2);
$modal1.on('hidden.bs.modal', function (e) {
   $modal2.modal('show');
});

Isso irá esperar até que o primeiro modal seja fechado para garantir que o modal aberto seja removido do corpo e adicionado novamente quando aberto.

user1508136
fonte
0

Eu mesmo tive esse problema e encontrar essa pergunta rapidamente me ajudou a entender o que estava causando o comportamento. Então obrigado.

No entanto, acho essas soluções alternativas CSS um pouco deselegantes. A menos que você queira especificamente manter as barras de rolagem (embora eu não consiga pensar em um motivo para isso).

Essencialmente, o Bootstrap está aplicando padding-right a certos elementos para compensar a remoção da barra de rolagem.

Portanto, tudo o que você precisa fazer é colocar um invólucro extra com preenchimento zero ao redor do elemento problemático (e mover a classe que está sendo direcionada para ele).

ou seja, mude disso ...

<div class="fixed-top p-1 bg-dark">
    ...this content will move as padding will be modified...
</div>

... para isso...

<div class="fixed-top p-0 bg-dark">
    <div class="p-1">
        ...this content won't move...
    </div>
</div>
Matt
fonte