Para uma pergunta diferente , compus esta resposta , incluindo este código de exemplo .
Nesse código, uso a roda do mouse para aumentar / diminuir o zoom de uma tela HTML5. Encontrei algum código que normaliza as diferenças de velocidade entre o Chrome e o Firefox. No entanto, o manuseio de zoom no Safari é muito, muito mais rápido do que em qualquer um deles.
Aqui está o código que tenho atualmente:
var handleScroll = function(e){
var delta = e.wheelDelta ? e.wheelDelta/40 : e.detail ? -e.detail/3 : 0;
if (delta) ...
return e.preventDefault() && false;
};
canvas.addEventListener('DOMMouseScroll',handleScroll,false); // For Firefox
canvas.addEventListener('mousewheel',handleScroll,false); // Everyone else
Qual código posso usar para obter o mesmo valor 'delta' para a mesma quantidade de roda do mouse rolando no Chrome v10 / 11, Firefox v4, Safari v5, Opera v11 e IE9?
Esta pergunta está relacionada, mas não tem uma boa resposta.
Edit : Investigações adicionais mostram que um evento de rolagem 'up' é:
| evt.wheelDelta | evt.detail ------------------ + ---------------- + ------------ Safari v5 / Win7 | 120 0 0 Safari v5 / OS X | 120 0 0 Safari v7 / OS X | 12 0 0 Chrome v11 / Win7 | 120 0 0 Chrome v37 / Win7 | 120 0 0 Chrome v11 / OS X | 3 (!) 0 (possivelmente errado) Chrome v37 / OS X | 120 0 0 IE9 / Win7 120 Indefinido Opera v11 / OS X | 40 -1 Opera v24 / OS X | 120 0 0 Opera v11 / Win7 | 120 -3 Firefox v4 / Win7 | indefinido | -3 Firefox v4 / OS X | indefinido | -1 Firefox v30 / OS X | indefinido | -1
Além disso, o uso do trackpad do MacBook no OS X fornece resultados diferentes, mesmo quando se move devagar:
- No Safari e Chrome,
wheelDelta
é um valor de 3 em vez de 120 para a roda do mouse. - No Firefox ,
detail
geralmente é2
, às vezes1
, mas ao rolar muito lentamente, NÃO HANDLER DE EVENTOS FOI DE TODOS .
Então a questão é:
Qual é a melhor maneira de diferenciar esse comportamento (idealmente sem nenhum agente de usuário ou sistema operacional farejando)?
fonte
e.wheelDelta/120
?Respostas:
Editar setembro de 2014
Dado que:
… Só posso recomendar o uso deste código simples de contagem baseada em sinais:
A tentativa original de estar correta segue.
Aqui está minha primeira tentativa de um script para normalizar os valores. Ele tem duas falhas no OS X: o Firefox no OS X produzirá valores 1/3 do que deveriam ser e o Chrome no OS X produzirá valores 1/40 do que deveriam ser.
Você pode testar esse código em seu próprio navegador aqui: http://phrogz.net/JS/wheeldelta.html
Sugestões para detectar e melhorar o comportamento no Firefox e Chrome no OS X são bem-vindas.
Editar : Uma sugestão do @Tom é simplesmente contar cada chamada de evento como um único movimento, usando o sinal da distância para ajustá-la. Isso não fornecerá ótimos resultados com rolagem suave / acelerada no OS X, nem manipulará perfeitamente os casos quando a roda do mouse for movida muito rapidamente (por exemplo,
wheelDelta
240), mas isso ocorre com pouca frequência. Agora, este código é a técnica recomendada mostrada na parte superior desta resposta, pelos motivos aqui descritos.fonte
(((evt.deltaY <0 || evt.wheelDelta>0) || evt.deltaY < 0) ? 1 : -1)
não sei o que o controle de qualidade descobre com isso.Aqui está minha tentativa maluca de produzir um delta coerente e normalizado entre navegadores (-1 <= delta <= 1):
Isso é totalmente empírico, mas funciona muito bem no Safari 6, FF 16, Opera 12 (OS X) e IE 7 no XP
fonte
event
objeto-ino
?o
variável está lá para mostrar que queremos o evento original e não um evento agrupado, como jQuery ou outras bibliotecas, pode passar para os manipuladores de eventos.Nossos amigos do Facebook reuniram uma ótima solução para esse problema.
Eu testei em uma tabela de dados que estou construindo usando o React e ela rola como manteiga!
Esta solução funciona em uma variedade de navegadores, no Windows / Mac, e ambos usando o trackpad / mouse.
O código fonte pode ser encontrado aqui: https://github.com/facebook/fixed-data-table/blob/master/src/vendor_upstream/dom/normalizeWheel.js
fonte
Criei uma tabela com valores diferentes retornados por diferentes eventos / navegadores, levando em consideração o DOM3
wheel
evento que alguns navegadores já suportam (tabela abaixo).Com base nisso, fiz esta função para normalizar a velocidade:
http://jsfiddle.net/mfe8J/1/
Tabela para
mousewheel
,wheel
eDOMMouseScroll
eventos:fonte
Outra solução mais ou menos independente ...
Porém, isso não leva tempo entre os eventos. Alguns navegadores parecem sempre acionar eventos com o mesmo delta e apenas acioná-los mais rapidamente ao rolar rapidamente. Outros variam os deltas. Pode-se imaginar um normalizador adaptável que leva tempo em consideração, mas que seria um pouco complicado e complicado de usar.
Trabalho disponível aqui: jsbin / iqafek / 2
fonte
Solução simples e funcional:
fonte
Para suporte ao zoom em dispositivos touch, registre-se nos eventos gesturestart, gesturechange e gestend e use a propriedade event.scale. Você pode ver o código de exemplo para isso.
Para o Firefox 17, o
onwheel
evento está planejado para ser suportado pelas versões para desktop e móvel (conforme os documentos MDN onwheel ). Também para o Firefox, talvez oMozMousePixelScroll
evento específico do Gecko seja útil (embora presumivelmente isso agora esteja obsoleto, pois o evento DOMMouseWheel agora está obsoleto no Firefox).Para Windows, o próprio driver parece gerar os eventos WM_MOUSEWHEEL, WM_MOUSEHWHEEL (e talvez o evento WM_GESTURE para a panorâmica do touchpad?). Isso explicaria por que o Windows ou o navegador não parecem normalizar os próprios valores do evento do mousewheel (e pode significar que você não pode escrever um código confiável para normalizar os valores).
Para suporte a eventos
onwheel
( não onmousewheel) no Internet Explorer para IE9 e IE10, você também pode usar o evento padrão W3Conwheel
. No entanto, um ponto pode ser um valor diferente de 120 (por exemplo, um único ponto se torna 111 (em vez de -120) no mouse usando esta página de teste ). Escrevi outro artigo com outros detalhes sobre os eventos da roda que podem ser relevantes.Basicamente, em meus próprios testes para eventos de roda (estou tentando normalizar os valores para rolagem), descobri que recebo valores variados para SO, fornecedor de navegador, versão de navegador, tipo de evento e dispositivo (mouse Microsoft tiltwheel, gestos do touchpad do laptop , touchpad para laptop com scrollzone, mouse mágico da Apple, scrollball poderoso da Apple, touchpad para Mac, etc.).
E precisa ignorar vários efeitos colaterais da configuração do navegador (por exemplo, Firefox mousewheel.enable_pixel_scrolling, chrome --soll-pixels = 150), configurações do driver (por exemplo, Synaptics touchpad) e configuração do sistema operacional (configurações do mouse do Windows, preferências do mouse OSX, Configurações do botão X.org).
fonte
Este é um problema com o qual estou lutando há algumas horas hoje e não pela primeira vez :(
Eu tenho tentado resumir valores com um "toque" e ver como diferentes navegadores relatam valores, e eles variam muito, com o Safari relatando números de ordem maior em quase todas as plataformas, o Chrome relatando muito mais (três vezes mais ) do que o firefox, o firefox sendo equilibrado a longo prazo, mas bem diferente entre plataformas em pequenos movimentos (no gnomo Ubuntu, quase apenas +3 ou -3, parece que resume eventos menores e envia um grande "+3")
As soluções atuais encontradas agora são três:
A ideia no Qooxdoo é boa e funciona, e é a única solução que atualmente achei completamente consistente entre navegadores.
Infelizmente, tende a renormalizar também a aceleração. Se você tentar (nas demos) e rolar para cima e para baixo na velocidade máxima por um tempo, perceberá que a rolagem extremamente rápida ou extremamente lenta produz basicamente basicamente a mesma quantidade de movimento. Pelo contrário, se você recarregar a página e deslizar muito lentamente, notará que ela rolará muito rápido ".
Isso é frustrante para um usuário de Mac (como eu) costumava dar vigorosos movimentos de rolagem no touchpad e esperando chegar ao topo ou ao fundo da coisa rolada.
Ainda mais, como reduz a velocidade do mouse com base no valor máximo obtido, quanto mais o usuário tenta acelerá-lo, mais lento, enquanto um usuário de "rolagem lenta" experimenta velocidades bastante rápidas.
Isso torna essa solução (caso contrário brilhante) uma implementação ligeiramente melhor da solução 1.
Portei a solução para o plugin jquery mousewheel: http://jsfiddle.net/SimoneGianni/pXzVv/
Se você jogar por um tempo, verá que começará a obter resultados bastante homogêneos, mas também perceberá que ele tende a + 1 / -1 com valores muito rápidos.
Agora estou trabalhando para aprimorá-lo para detectar picos melhor, para que eles não enviem tudo "fora de escala". Também seria bom obter também um valor flutuante entre 0 e 1 como valor delta, para que haja uma saída coerente.
fonte
Definitivamente, não há uma maneira simples de normalizar todos os usuários em todos os SOs em todos os navegadores.
Fica pior do que as variações listadas - na instalação do WindowsXP + Firefox3.6, a roda do mouse faz 6 por rolagem de um ponto - provavelmente porque em algum lugar que esqueci eu acelerei a roda do mouse, no sistema operacional ou em algum lugar: config
No entanto, estou trabalhando em um problema semelhante (com um aplicativo semelhante, mas não em tela) e isso ocorre comigo apenas usando o sinal delta de +1 / -1 e medindo ao longo do tempo na última vez em que foi acionado, tem uma taxa de aceleração, ou seja. se alguém rola uma vez vs várias vezes em alguns momentos (o que eu apostaria é como o Google Maps faz isso).
O conceito parece funcionar bem nos meus testes, basta adicionar menos de 100ms à aceleração.
fonte
fonte