Estou usando o plugin scrollTo jQuery e gostaria de saber se é possível desabilitar temporariamente a rolagem no elemento da janela por meio de Javascript? O motivo pelo qual eu gostaria de desativar a rolagem é que, quando você rola enquanto scrollTo está animando, fica realmente feio;)
Obviamente, eu poderia fazer um $("body").css("overflow", "hidden");
e colocá-lo novamente no modo automático quando a animação parar, mas seria melhor se a barra de rolagem ainda estivesse visível, mas inativa.
javascript
jquery
scroll
Olivier Lalonde
fonte
fonte
Respostas:
O
scroll
evento não pode ser cancelado. Mas você pode fazer isso cancelando estes eventos de interação: Rolagem domouse e toque e Botões associados à rolagem.
[ Demo de trabalho ]
ATUALIZAÇÃO: área de trabalho fixa do Chrome e navegadores móveis modernos com ouvintes passivos
fonte
Faça isso simplesmente adicionando uma classe ao corpo:
Adicione a classe e remova quando desejar reativar a rolagem, testada no IE, FF, Safari e Chrome.
Para dispositivos móveis , você precisará lidar com o
touchmove
evento:E desative para reativar a rolagem. Testado no iOS6 e Android 2.3.3
fonte
touchmove
evento, como acontece com$('body').bind('touchmove', function(e){e.preventDefault()})
. Editou esta resposta para incluir esta solução móvel.$('body,html')
Aqui está uma maneira realmente básica de fazer isso:
É meio nervoso no IE6.
fonte
(0, 0)
, basta usar a posição atual de rolagem.A solução a seguir é JavaScript básico, mas puro (sem jQuery):
fonte
scroll-behavior: smooth
bucks isso. Além disso, eu discordo de Oto dizendo que a culpa é do navegador. Você está basicamente assumindo que algo acontecerá instantaneamente quando, na realidade, é assíncronoEsta solução manterá a posição atual de rolagem enquanto a rolagem estiver desativada, ao contrário de algumas que fazem o usuário voltar ao topo.
É baseado na resposta dos galambalazs , mas com suporte para dispositivos de toque e refatorado como um único objeto com o invólucro do plugin jquery.
Demonstração aqui.
No github aqui.
fonte
mousewheel
trabalhou um charmeLamento responder a uma postagem antiga, mas estava procurando uma solução e me deparei com essa pergunta.
Existem várias soluções alternativas para esse problema ainda exibir a barra de rolagem, como fornecer ao contêiner uma altura de 100% e um
overflow-y: scroll
estilo.No meu caso, acabei de criar uma div com uma barra de rolagem que exibo enquanto adicionava
overflow: hidden
ao corpo:A barra de rolagem do elemento deve ter estes estilos:
Isso mostra uma barra de rolagem cinza, espero que ajude futuros visitantes.
fonte
Eu estava procurando uma solução para esse problema, mas não estava satisfeito com nenhuma das soluções acima ( ao escrever esta resposta ), por isso vim com essa solução ..
CSS
JS
fonte
overflow-y: scroll
ao.scrollDisabled
estilo. Caso contrário, houve um pequeno salto à medida que a barra de rolagem se ocultava a cada vez. Claro, isso só funciona para mim porque minha página é longa o suficiente para precisar de uma barra de rolagem, mesmo nas telas maiores.De acordo com o post dos galambalazs, eu adicionaria suporte para dispositivos de toque, permitindo tocar, mas sem rolar para cima ou para baixo:
fonte
No Chrome 56 e em outros navegadores modernos, você precisa adicionar
passive:false
àaddEventListener
chamada para fazer opreventDefault
trabalho. Então, eu uso isso para parar de rolar no celular:fonte
Não, eu não aceitaria a manipulação de eventos porque:
nem todos os eventos têm garantia de atingir o corpo,
selecionar texto e mover para baixo, na verdade, rola o documento,
se na fase do evento desanexar sth der errado, você estará condenado.
Mordi isso ao fazer uma ação de copiar e colar com uma área de texto oculta e, adivinhe, a página rola sempre que eu faço uma cópia, porque internamente eu tenho que selecionar a área de texto antes de ligar
document.execCommand('copy')
.Seja como for, observe o
setTimeout()
:Existe um momento piscando quando as barras de rolagem desaparecem momentaneamente, mas é aceitável.
fonte
Dependendo do que você deseja alcançar com a rolagem removida, basta corrigir o elemento do qual deseja remover a rolagem (ao clicar ou qualquer outro gatilho que você deseja desativar temporariamente a rolagem)
Eu estava procurando por uma solução "temp no scroll" e por minhas necessidades, isso resolveu
faça uma aula
então com Jquery
Descobri que essa era uma solução bastante simples que funciona bem em todos os navegadores e também facilita o uso em dispositivos portáteis (como iPhones, tablets etc.). Como o elemento está temporariamente corrigido, não há rolagem :)
NOTA! Dependendo do posicionamento do seu elemento "contentContainer", pode ser necessário ajustá-lo da esquerda. O que pode ser feito facilmente adicionando um valor à esquerda do css nesse elemento quando a classe fixa está ativa
fonte
Outra solução:
Dessa forma, você sempre tem uma barra de rolagem vertical, mas como a maior parte do meu conteúdo é maior que a janela de visualização, isso é bom para mim. O conteúdo é centralizado com uma div separada, mas sem definir a margem novamente no corpo, meu conteúdo permaneceria à esquerda.
Estas são as duas funções que eu uso para mostrar meu popup / modal:
Resultado: fundo sem rolagem e sem reposicionamento do conteúdo por causa da barra de rolagem esquerda. Testado com o FF atual, Chrome e IE 10.
fonte
Que tal agora? (Se você estiver usando jQuery)
fonte
Estou usando showModalDialog , para mostrar a página secundária como caixa de diálogo modal.
ocultar barras de rolagem da janela principal:
e ao fechar a caixa de diálogo modal, mostrando as barras de rolagem da janela principal:
para acessar elementos na janela principal a partir da caixa de diálogo:
apenas para quem pesquisar sobre showModalDialog : (após a linha 29 do código original)
fonte
Cancelar o evento como na resposta aceita é um método horrível na minha opinião: /
Em vez disso, usei
position: fixed; top: -scrollTop();
abaixo.Demonstração: https://jsfiddle.net/w9w9hthy/5/
No meu projeto pop-up do jQuery: https://github.com/seahorsepip/jPopup
Esse código leva em consideração os problemas de largura, altura, barra de rolagem e salto de página.
Possíveis problemas resolvidos com o código acima:
Se alguém tiver alguma melhoria no código de congelamento / descongelamento da página acima, avise-me para que eu possa adicionar essas melhorias ao meu projeto.
fonte
fonte
Eu tenho o mesmo problema, abaixo está a minha maneira de lidar com isso.
Espero que isso ajude.
fonte
Com base na resposta de Cheyenne Forbes, e uma que encontrei aqui via fcalderan: Apenas desative o scroll, não o oculte? e para corrigir o problema de Hallodom da barra de rolagem desaparecer
CSS:
JS:
Esse código o leva ao topo da página, mas acho que o código do fcalderan tem uma solução alternativa.
fonte
Sei que essa é uma pergunta antiga, mas tive que fazer algo muito semelhante e, depois de algum tempo procurando uma resposta e tentando abordagens diferentes, acabei usando uma solução muito fácil.
Meu problema era muito semelhante, quase idêntico, a única diferença é que eu não precisava mostrar a barra de rolagem - só precisava garantir que sua largura ainda fosse usada, para que a largura da página não mudasse enquanto minha sobreposição fosse exibida .
Quando começo a deslizar minha sobreposição na tela, faço:
e depois que deslizo minha sobreposição da tela, faço:
IMPORTANTE: isso funciona perfeitamente porque minha sobreposição está posicionada
absolute
,right: 0px
quandovisible
.fonte
O método mais simples é:
Para desfazê-lo:
Fácil de implementar, mas a única desvantagem é:
Isso ocorre porque a barra de rolagem é removida e a janela de exibição se torna um pouco maior.
fonte
body
parahtml
.overflow:hidden
não funciona láAqui está a minha solução para parar o pergaminho (sem jQuery). Eu o uso para desativar a rolagem quando o menu lateral aparece.
Coloquei 17px de preenchimento à direita para compensar o desaparecimento da barra de rolagem. Mas isso também é problemático, principalmente para navegadores móveis. Resolvido obtendo a largura da barra de acordo com este .
Todos juntos nesta caneta.
fonte
Tenho um problema semelhante em dispositivos touch. Adicionar "touch-action: none" ao elemento resolveu o problema.
Para maiores informações. Veja isso:-
https://developer.mozilla.org/en-US/docs/Web/CSS/touch-action
fonte
Esta é a solução mais simples que cheguei até agora. E acredite, tentei todos os outros e este é o mais fácil. Ele funciona muito bem em dispositivos Windows , que empurram a página da direita para ter espaço para a barra de rolagem do sistema e dispositivos IOS que não exigem espaço para suas barras de rolagem nos navegadores. Portanto, usando isso, você não precisará adicionar preenchimento à direita para que a página não pisque quando você oculta o excesso de corpo ou html com css .
A solução é bem simples se você pensar bem. A idéia é dar ao window.scrollTop () a mesma posição exata no momento em que um pop-up é aberto. Altere também essa posição quando a janela for redimensionada (pois a posição de rolagem muda assim que isso acontece).
Aqui vamos nos...
Primeiro vamos criar a variável que permitirá que você saiba que o pop-up está aberto e chame-o stopWindowScroll . Se não fizermos isso, você receberá um erro de uma variável indefinida na sua página e a definirá como 0 - como inativo.
Agora vamos fazer a função de pop-up aberto, que pode ser qualquer função no seu código que aciona qualquer pop-up que você estiver usando como um plugin ou personalizado. Nesse caso, será um pop-up personalizado simples com um documento simples na função de clique.
Portanto, a próxima coisa que fazemos é criar a função pop-up fechada, que repito novamente pode ser qualquer função que você já tenha criado ou esteja usando em um plugin. O importante é que precisamos dessas 2 funções para definir o stopWindowScroll variável como 1 ou 0 para saber quando está aberta ou fechada.
Em seguida, vamos criar a função window.scroll para impedir a rolagem uma vez que o stopWindowScroll mencionado acima estiver definido como 1 - como ativo.
É isso aí. Não é necessário CSS para que isso funcione, exceto seus próprios estilos para a página. Isso funcionou como um encanto para mim e espero que ajude você e outras pessoas.
Aqui está um exemplo de trabalho no JSFiddle:
Exemplo de JS Fiddle
Deixe-me saber se isso ajudou. Saudações.
fonte
fonte
Este código funcionará no Chrome 56 e mais (a resposta original não funciona mais no Chrome).
Usar
DomUtils.enableScroll()
para ativar a rolagem.Use
DomUtils.disableScroll()
para desativar a rolagem.fonte
Para evitar o salto, é isso que eu usei
e no meu css
fonte
Encontrei esta resposta em outro site :
Desativar rolagem:
Após fechar a janela pop-up, role:
fonte
A solução de galambalazs é ótima! Funcionou perfeitamente para mim no Chrome e no Firefox. E também pode ser estendido para impedir qualquer evento padrão da janela do navegador. Digamos que você esteja fazendo um aplicativo na tela. Você pode fazer isso:
E então, no seu aplicativo, digamos que você processará seus próprios eventos, como mouse, teclado, eventos de toque e assim por diante ... Você pode desativar os eventos padrão quando o mouse entra na tela e reativá-los quando o mouse apaga-se:
Você pode até desativar o menu do botão direito com este hack:
fonte
Eu tive um problema de animação semelhante em telas móveis, mas não em laptops, ao tentar animar uma div usando o comando animar do jquery. Então, decidi usar um timer que restaurava a posição de rolagem da janela com tanta frequência que, a olho nu, o documento pareceria estático. Essa solução funcionou perfeitamente em um dispositivo móvel de tela pequena como o Samsung Galaxy-2 ou iphone-5.
Lógica principal desta abordagem : O cronômetro para definir a posição de rolagem da janela para a posição de rolagem original deve ser iniciado antes do comando jquery animate e, quando a animação for concluída, precisamos limpar esse cronômetro (
original scroll position
é a posição imediatamente antes do início da animação).Descobri, para minha surpresa agradável, que o documento realmente parecia estático durante a duração da animação, se o intervalo do cronômetro fosse o
1 millisecond
que eu estava buscando.Outra solução que funcionou : Com base na resposta de Mohammad Anini nesta postagem para ativar / desativar a rolagem, também descobri que uma versão modificada do código, conforme abaixo, funcionava.
fonte
Uma solução simples que funcionou para mim (desativar a rolagem de janela temporariamente).
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 esqueça de remover a classe noscroll na tag html:
fonte