O Bootstrap modal
adiciona automaticamente a classe modal-open
ao corpo quando uma caixa de diálogo modal é exibida e a remove quando a caixa de diálogo está oculta. Portanto, você pode adicionar o seguinte ao seu CSS:
body.modal-open {
overflow: hidden;
}
Você pode argumentar que o código acima pertence à base de código CSS do Bootstrap, mas essa é uma solução fácil para adicioná-lo ao seu site.
Atualização 8 de fevereiro de 2013
Agora, isso parou de funcionar no Twitter Bootstrap v. 2.3.0 - eles não adicionam mais a modal-open
classe ao corpo.
Uma solução alternativa seria adicionar a classe ao corpo quando o modal estiver prestes a ser exibido e removê-lo quando o modal estiver fechado:
$("#myModal").on("show", function () {
$("body").addClass("modal-open");
}).on("hidden", function () {
$("body").removeClass("modal-open")
});
Atualização 11 de março de 2013
Parece que a modal-open
classe retornará no Bootstrap 3.0, explicitamente com o objetivo de impedir a rolagem:
Reintroduz a abertura .modal no corpo (para que possamos nuke o pergaminho lá)
Veja isto: https://github.com/twitter/bootstrap/pull/6342 - veja a seção Modal .
modal-open
retornará no Bootstrap 3; portanto, quando for iniciado, será seguro remover o código acima.A resposta aceita não funciona no celular (iOS 7 com Safari 7, pelo menos) e não quero o MOAR JavaScript em execução no meu site quando o CSS funcionar.
Este CSS impedirá que a página de segundo plano role sob o modal:
No entanto, ele também tem um leve efeito colateral de rolar para o topo.
position:absolute
resolve isso, mas reintroduz a capacidade de rolar no celular.Se você conhece a sua viewport ( meu plugin para adicionar a viewport à
<body>
), basta adicionar uma alternância de css para aposition
.Também adiciono isso para impedir que a página subjacente salte para a esquerda / direita ao mostrar / ocultar modais.
esta resposta é um x-post.
fonte
position: fixed
o corpo.Simplesmente oculte o excesso de corpo e isso fará com que o corpo não role. Quando você oculta o modal, reverta-o para automático.
Aqui está o código:
fonte
Você pode tentar definir o tamanho do corpo para o tamanho da janela com estouro: oculto quando o modal estiver aberto
fonte
Você precisa ir além da resposta de @ charlietfl e considerar as barras de rolagem; caso contrário, poderá ver um documento refluir.
Abrindo o modal:
body
largurabody
estouro comohidden
Defina explicitamente a largura do corpo para o que era na etapa 1.
Fechando o modal:
body
estouro comoauto
Defina a
body
largura comoauto
Inspirado em: http://jdsharp.us/jQuery/minute/calculate-scrollbar-width.php
fonte
$body.css("overflow", "auto");
na última etapa :)Aviso: A opção abaixo não é relevante para o Bootstrap v3.0.x, pois a rolagem nessas versões foi explicitamente confinada ao próprio modal. Se você desativar os eventos de roda, poderá inadvertidamente impedir que alguns usuários visualizem o conteúdo em modais com alturas maiores que a altura da janela de exibição.
Outra opção: eventos de roda
O evento de rolagem não é cancelável. No entanto, é possível cancelar os eventos de roda do mouse e roda . A grande ressalva é que nem todos os navegadores legados os suportam, a Mozilla recentemente adicionou suporte para este último no Gecko 17.0. Não conheço a propagação completa, mas o IE6 + e o Chrome os suportam.
Veja como aproveitá-los:
JSFiddle
fonte
overflow:hidden
é melhor por enquanto.fonte
Não foi possível fazê-lo funcionar no Chrome apenas alterando o CSS, porque não queria que a página voltasse ao topo. Isso funcionou bem:
fonte
Tente este:
funcionou para mim. (suporta IE8)
fonte
position: fixed
.Espero que isto ajude...
fonte
Adicionar a classe 'is-modal-open' ou modificar o estilo da tag body com javascript é bom e funcionará como deveria. Mas o problema que enfrentaremos é quando o corpo ficar sobrecarregado: oculto, ele irá pular para o topo (scrollTop se tornará 0). Isso se tornará um problema de usabilidade mais tarde.
Como solução para esse problema, em vez de alterar o estouro da tag body: oculto altere-o na tag html
fonte
Não tenho certeza sobre esse código, mas vale a pena tentar.
No jQuery:
Como eu disse antes, não tenho 100% de certeza, mas tente de qualquer maneira.
fonte
A partir de novembro de 2017, o Chrome introduziu uma nova propriedade css
overscroll-behavior: contain;
que resolve esse problema, embora, por enquanto, tenha limitado suporte a vários navegadores.
veja os links abaixo para obter detalhes completos e suporte ao navegador
fonte
A melhor solução é a
body{overflow:hidden}
solução somente de css usada pela maioria dessas respostas. Algumas respostas fornecem uma correção que também evita o "salto" causado pela barra de rolagem que desaparece; no entanto, nenhum era muito elegante. Então, eu escrevi essas duas funções, e elas parecem funcionar muito bem.Confira este jsFiddle para vê-lo em uso.
fonte
open modal
largura dos botões. Chrome on 8Muitos sugerem "overflow: hidden" no corpo, o que não funcionará (pelo menos no meu caso), pois fará o site rolar para o topo.
Esta é a solução que funciona para mim (tanto em telefones celulares quanto em computadores), usando o jQuery:
Isso fará com que a rolagem do modal funcione e impedirá que o site role ao mesmo tempo.
fonte
Você pode usar a seguinte lógica, eu testei e funciona (mesmo no IE)
fonte
Não tenho 100% de certeza de que isso funcionará com o Bootstrap, mas vale a pena tentar - ele funcionou com o Remodal.js, que pode ser encontrado no github: http://vodkabears.github.io/remodal/ e faria sentido para os métodos para ser bem parecido.
Para parar a página pulando para o topo e também impedir a troca correta de conteúdo, adicione uma classe ao
body
quando o modal for acionado e defina estas regras de CSS:É
position:static
oheight:auto
que combinam para parar o salto do conteúdo para a direita. Ooverflow-y:hidden;
pára a página de ser scrollable atrás do modal.fonte
Com base neste violino: http://jsfiddle.net/dh834zgw/1/
o seguinte snippet (usando jquery) desabilitará a rolagem da janela:
E no seu css:
Agora, quando você remover o modal, não se esqueça de remover a classe noscroll na tag html:
fonte
overflow
ser definido comohidden
? +1, pois isso funcionou para mim (usandohidden
).Eu tinha uma barra lateral que foi gerada pelo hack da caixa de seleção. Mas a idéia principal é salvar o documento scrollTop e não alterá-lo durante a rolagem da janela.
Eu simplesmente não gostei da página pulando quando o corpo se torna 'overflow: hidden'.
fonte
Infelizmente, nenhuma das respostas acima corrigiu meus problemas.
Na minha situação, a página da web originalmente possui uma barra de rolagem. Sempre que clico no modal, a barra de rolagem não desaparece e o cabeçalho se move para a direita um pouco.
Então tentei adicionar
.modal-open{overflow:auto;}
(o que a maioria das pessoas recomendou). Ele realmente corrigiu os problemas: a barra de rolagem aparece depois que eu abro o modal. No entanto, outro efeito colateral é o de que "o fundo abaixo do cabeçalho se moverá para a esquerda um pouco, junto com outra barra longa atrás do modal"Felizmente, depois de acrescentar
{padding-right: 0 !important;}
, tudo está corrigido perfeitamente. O cabeçalho e o fundo do corpo não se moveram e o modal ainda mantém a barra de rolagem.Espero que isso ajude aqueles que ainda estão presos a esse problema. Boa sorte!
fonte
A maioria das peças está aqui, mas não vejo nenhuma resposta que junte tudo.
O problema é triplo.
(1) impedir a rolagem da página subjacente
(2) e remova a barra de rolagem
(3) limpar quando o modal for demitido
Se o modal não for tela cheia, aplique as ligações .modal a uma sobreposição de tela cheia.
fonte
Minha solução para o Bootstrap 3:
porque para mim o único
overflow: hidden
aluno dabody.modal-open
turma não impediu que a página se movesse para a esquerda devido ao originalmargin-right: 15px
.fonte
Acabei de fazer desta maneira ...
Mas quando o scroller desapareceu, mudou tudo 20px, então eu adicionei
logo depois.
Funciona para mim.
fonte
Se os modais tiverem 100% de altura / largura, "mouseenter / leave" funcionará para ativar / desativar a rolagem com facilidade. Isso realmente funcionou para mim:
fonte
trabalhou para mim
fonte
Por que não fazer isso como Bulma? Quando modal estiver ativo, adicione ao html sua classe .is-clipped que está excedente: oculto! Importante; E é isso.
Edit: Okey, Bulma tem esse bug, então você deve adicionar também outras coisas como
fonte
Como para mim esse problema apresentado principalmente no iOS, forneço o código para corrigir isso apenas no iOS:
fonte
Nenhuma das respostas acima funcionou perfeitamente para mim. Então eu encontrei outra maneira que funciona bem.
Basta adicionar um
scroll.(namespace)
ouvinte e conjuntoscrollTop
dodocument
que o mais recente do seu valor ...e também remova o ouvinte no seu script de fechamento.
atualizar
parece, isso não funciona bem no chrome. alguma sugestão para corrigi-lo?
fonte
Isso funcionou para mim:
fonte
Para aqueles que querem saber como obter o evento scroll para o modal de inicialização 3:
fonte