Usando o jQuery, gostaria de desativar a rolagem do corpo:
Minha ideia é:
- Conjunto
body{ overflow: hidden;}
- Capturar a corrente
scrollTop();/scrollLeft()
- Associe-se ao evento de rolagem do corpo, defina scrollTop / scrollLeft para o valor capturado.
Existe uma maneira melhor?
Atualizar:
Por favor, veja meu exemplo e um motivo para, em http://jsbin.com/ikuma4/2/edit
Estou ciente de que alguém estará pensando "por que ele não usa apenas position: fixed
no painel?".
Por favor, não sugira isso, pois tenho outros motivos.
Respostas:
A única maneira que encontrei para fazer isso é semelhante ao que você descreveu:
Então, quando estiver pronto para permitir a rolagem novamente, desfaça tudo isso.
Edit: nenhuma razão eu não posso lhe dar o código desde que me dei ao trabalho de desenterrá-lo ...
fonte
auto
, ele seria substituído. Eu precisava preservar a configuração existente, o que também adiciona alguma sobrecarga.html
ebody
comoverflow: hidden
é insuficiente? Ainda acabamos precisando do manipulador de eventos.Isso desativará completamente a rolagem:
Restaurar:
Testei no Firefox e Chrome.
fonte
height: 100%
efetivamente bloqueia a rolagem na posição atual sem pular - no Chrome mais recente, pelo menos.tente isso
fonte
$('#element').off('scroll touchmove mousewheel');
body
rolagem apenas e permita a rolagem dentro de outros elementos filhos que possuemoverflow: scroll
?Eu apenas forneço um pouco de ajuste para a solução por tfe . Em particular, adicionei algum controle adicional para garantir que não haja mudança no conteúdo da página (também conhecida como mudança de página ) quando a barra de rolagem estiver definida como
hidden
.Duas funções Javascript
lockScroll()
eunlockScroll()
podem ser definidas, respectivamente, para bloquear e desbloquear a rolagem da página.onde eu assumi que o
<body>
não tem margem inicial.Observe que, embora a solução acima funcione na maioria dos casos práticos, ela não é definitiva, pois precisa de mais personalização para páginas que incluem, por exemplo, um cabeçalho com
position:fixed
. Vamos entrar neste caso especial com um exemplo. Suponha que você tenhacom
Em seguida, deve-se adicionar o seguinte em funções
lockScroll()
eunlockScroll()
:Por fim, cuide de algum possível valor inicial para as margens ou forros.
fonte
marginRight
emarginLeft
:)você pode usar este código:
fonte
Para desativar a rolagem, tente o seguinte:
reiniciar:
fonte
Eu escrevi um plugin jQuery para lidar com isso: $ .disablescroll .
Impede a rolagem dos eventos de roda do mouse, movimento de toque e pressionamento de tecla, como Page Down.
Há uma demonstração aqui .
Uso:
fonte
Você pode anexar uma função para rolar eventos e impedir seu comportamento padrão.
https://jsfiddle.net/22cLw9em/
fonte
Um revestimento para desativar a rolagem, incluindo o botão do meio do mouse.
edit : De qualquer maneira, não é necessário jQuery, abaixo do mesmo que o vanilla JS (isso significa que não há estruturas, apenas JavaScript):
this.documentElement.scrollTop - padrão
this.body.scrollTop - compatibilidade com o IE
fonte
$("body").css("overflow", "hidden");
$("body").css("overflow", "initial");
fonte
Você não pode simplesmente definir a altura do corpo para 100% e o estouro oculto? Consulte http://jsbin.com/ikuma4/13/edit
fonte
Alguém postou esse código, que tem o problema de não manter a posição de rolagem quando restaurada. A razão é que as pessoas tendem a aplicá-lo ao html e ao corpo ou apenas ao corpo, mas devem ser aplicadas apenas ao html. Dessa forma, quando restaurada, a posição de rolagem será mantida:
Restaurar:
fonte
'overflow': 'auto',
use'overflow': 'initial',
Isso pode ou não funcionar para seus propósitos, mas você pode estender o jScrollPane para disparar outras funcionalidades antes que ele faça sua rolagem. Acabei de testar isso um pouco, mas posso confirmar que você pode pular e impedir a rolagem completamente. Tudo o que fiz foi:
<script type="text/javascript" src="script/jquery.jscrollpane.js"></script>
positionDragY(destY, animate)
funçãoInicie o events.html e você verá uma caixa de rolagem normalmente que, devido à sua intervenção de codificação, não será rolada.
Você pode controlar as barras de rolagem do navegador inteiro dessa maneira (consulte fullpage_scroll.html).
Portanto, presumivelmente, o próximo passo é adicionar uma chamada a alguma outra função que apaga e faz sua mágica de ancoragem, e decide se deve continuar com o pergaminho ou não. Você também tem chamadas de API para definir scrollTop e scrollLeft.
Se você quiser mais ajuda, poste onde quiser!
Espero que isso tenha ajudado.
fonte
Coloquei uma resposta que pode ajudar aqui: jQuery simplemodal desativar rolagem
Ele mostra como desativar as barras de rolagem sem mudar o texto. Você pode ignorar as partes sobre simplemodal.
fonte
Se você quiser apenas desabilitar a rolagem com a navegação pelo teclado, poderá substituir o evento de pressionamento de tecla.
fonte
Tente este código:
fonte
Você pode encobrir a janela com uma div rolável para impedir a rolagem do conteúdo em uma página. E, ocultando e mostrando, você pode bloquear / desbloquear seu pergaminho.
Faça algo parecido com isto:
fonte
Para as pessoas que centralizaram os layouts (via
margin:0 auto;
), aqui está um mash-up daposition:fixed
solução, juntamente com a solução proposta pela @tfe .Use esta solução se você estiver enfrentando o snap da página (devido à barra de rolagem que mostra / oculta).
…combinado com…
… E, finalmente, o CSS para
.modal-noscroll
…Atrevo-me a dizer que este é mais de uma correção adequada do que qualquer das outras soluções lá fora, mas eu não testei que ainda completamente ...: P
Editar: observe que não tenho idéia do quanto isso pode ser ruim (leia-se: explodir) em um dispositivo de toque.
fonte
Você também pode usar o DOM para fazer isso. Digamos que você tenha uma função que você chama assim:
E é só isso! Espero que isso ajude, além de todas as outras respostas!
fonte
Isto é o que acabei fazendo:
CoffeeScript:
Javascript:
fonte
Não tenho certeza se alguém já experimentou minha solução. Este funciona em todo o corpo / html, mas sem dúvida pode ser aplicado a qualquer elemento que dispara um evento de rolagem.
Basta definir e desabilitar o scrollLock conforme necessário.
Aqui está o exemplo JSFiddle
Espero que este ajude alguém.
fonte
Eu acho que a melhor solução e limpa é:
E com o jQuery:
O ouvinte de eventos deve bloquear a rolagem. Basta removê-los para reativar a rolagem
fonte