Estou trabalhando em um aplicativo da web baseado em iPad e preciso evitar a rolagem excessiva para que pareça menos com uma página da web. No momento, estou usando isso para congelar a janela de visualização e desativar o deslocamento excessivo:
document.body.addEventListener('touchmove',function(e){
e.preventDefault();
});
Isso funciona muito bem para desativar o overscroll, mas meu aplicativo tem vários divs roláveis, e o código acima os impede de rolar .
Estou visando o iOS 5 e superior apenas, então evitei soluções hacky como o iScroll. Em vez disso, estou usando este CSS para meus divs roláveis:
.scrollable {
-webkit-overflow-scrolling: touch;
overflow-y:auto;
}
Isso funciona sem o script de overscroll do documento, mas não resolve o problema de rolagem div.
Sem um plugin jQuery, existe alguma maneira de usar a correção overscroll, mas isentar meus divs $ ('. Scrollable')?
EDITAR:
Eu encontrei algo que é uma solução decente:
// Disable overscroll / viewport moving on everything but scrollable divs
$('body').on('touchmove', function (e) {
if (!$('.scrollable').has($(e.target)).length) e.preventDefault();
});
A janela de visualização ainda se move quando você rola para além do início ou do final do div. Eu gostaria de encontrar uma maneira de desativar isso também.
Respostas:
Isso resolve o problema ao rolar para além do início ou do final do div
Observe que isso não funcionará se você quiser bloquear a rolagem da página inteira quando um div não tiver estouro. Para bloquear isso, use o seguinte manipulador de eventos em vez do imediatamente acima (adaptado desta pergunta ):
fonte
.scrollable
diretamente (que é o que eu tentei originalmente para resolver esse problema). Se você é um novato em JavaScript e quer um código fácil para remover esses manipuladores em algum ponto da linha, essas duas linhas funcionam muito bem para mim!$(document).off('touchmove');
AND$('body').off('touchmove touchstart', '.scrollable');
Usar a excelente resposta de Tyler Dodge continuou demorando no meu iPad, então eu adicionei algum código de limitação, agora é bastante suave. Às vezes, há alguns pulos mínimos durante a rolagem.
Além disso, adicionar o seguinte CSS corrige algumas falhas de renderização ( fonte ):
fonte
Em primeiro lugar, evite ações padrão em todo o seu documento, como de costume:
Em seguida, interrompa a propagação de sua classe de elementos para o nível do documento. Isso impede que ele alcance a função acima e, portanto, e.preventDefault () não é iniciado:
Este sistema parece ser mais natural e menos intensivo do que calcular a classe em todos os movimentos de toque. Use .on () em vez de .bind () para elementos gerados dinamicamente.
Considere também estas metatags para evitar que coisas desagradáveis aconteçam ao usar seu div rolável:
fonte
Você pode simplesmente adicionar um pouco mais de lógica em seu código de desativação de overscroll para garantir que o elemento em questão não seja aquele que você gostaria de rolar? Algo assim:
fonte
A melhor solução para isso é css / html: Faça uma div para envolver seus elementos, se ainda não a tiver e defina-a para a posição fixa e overflow oculto. Opcional, defina a altura e a largura como 100% se quiser preencher toda a tela e nada além da tela inteira
fonte
Verifique se o elemento rolável já está rolado para cima ao tentar rolar para cima ou para baixo ao tentar rolar para baixo e, a seguir, evitando que a ação padrão interrompa o movimento da página inteira.
fonte
Eu estava procurando uma maneira de evitar a rolagem de todo o corpo quando há um pop-up com uma área de rolagem (um pop-up de "carrinho de compras" que tem uma exibição de rolagem do seu carrinho).
Eu escrevi uma solução muito mais elegante usando javascript mínimo para apenas alternar a classe "noscroll" em seu corpo quando você tem um pop-up ou div que gostaria de rolar (e não "overscroll" todo o corpo da página).
enquanto navegadores de desktop observam overflow: hidden - o iOS parece ignorar isso, a menos que você defina a posição como fixa ... o que faz com que a página inteira tenha uma largura estranha, então você também deve definir a posição e a largura manualmente. use este css:
e este jquery:
fonte
Eu trabalhei um pequeno workarround sem jquery. Não perfert, mas funciona bem (especialmente se você tiver um scroll-x em um scoll-y) https://github.com/pinadesign/overscroll/
Sinta-se à vontade para participar e melhorar
fonte
Esta solução não requer que você coloque uma classe rolável em todos os seus divs roláveis, então é mais geral. A rolagem é permitida em todos os elementos que são ou são filhos de INPUT elements contenteditables e overflow scroll ou autos.
Eu uso um seletor personalizado e também armazeno em cache o resultado da verificação no elemento para melhorar o desempenho. Não há necessidade de verificar o mesmo elemento todas as vezes. Isso pode ter alguns problemas, como apenas escrito, mas pensei em compartilhar.
fonte
Embora desabilitar todos os eventos "touchmove" possa parecer uma boa ideia, assim que você precisar de outros elementos roláveis na página, isso causará problemas. Além disso, se você desabilitar apenas eventos "touchmove" em certos elementos (por exemplo, corpo se você quiser que a página não seja rolável), assim que for habilitado em qualquer outro lugar, o IOS causará uma propagação imparável no Chrome quando o URL bar alterna.
Embora eu não possa explicar esse comportamento, parece que a única forma de prevenir parece definir a posição do corpo para
fixed
. O único problema é que você perderá a posição do documento - isso é especialmente irritante em modais, por exemplo. Uma maneira de resolver isso seria usar estas funções simples do VanillaJS:Usando essa solução, você pode ter um documento fixo e qualquer outro elemento em sua página pode estourar usando CSS simples (por exemplo,
overflow: scroll;
). Não há necessidade de aulas especiais ou qualquer outra coisa.fonte
Aqui está uma solução compatível com zepto
fonte
este funciona para mim (JavaScript puro)
html:
fonte
Experimente isso. Funcionará perfeitamente.
fonte
Tive uma sorte surpreendente com o simples:
Funciona muito bem para desativar a rolagem excessiva de pop-ups ou menus e não força as barras do navegador a aparecerem como ao usar position: fixed. MAS - você precisa salvar a posição de rolagem antes de definir a altura fixa e restaurá-la ao ocultar o pop-up, caso contrário, o navegador rolará para cima.
fonte