Para una pregunta diferente , compuse esta respuesta , incluido este código de muestra .
En ese código, uso la rueda del mouse para acercar / alejar un lienzo HTML5. Encontré un código que normaliza las diferencias de velocidad entre Chrome y Firefox. Sin embargo, el manejo del zoom en Safari es mucho, mucho más rápido que en cualquiera de ellos.
Aquí está el código que tengo actualmente:
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
¿Qué código puedo usar para obtener el mismo valor 'delta' para la misma cantidad de rueda del mouse en Chrome v10 / 11, Firefox v4, Safari v5, Opera v11 e IE9?
Esta pregunta está relacionada, pero no tiene una buena respuesta.
Editar : Una investigación adicional muestra que un evento de desplazamiento 'arriba' es:
El | 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 (posiblemente incorrecto) 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
Además, el uso del trackpad MacBook en OS X ofrece resultados diferentes incluso cuando se mueve lentamente:
- En Safari y Chrome, el
wheelDelta
valor es 3 en lugar de 120 para la rueda del mouse. - En Firefox ,
detail
generalmente2
, a veces1
, pero cuando se desplaza muy lentamente, NO HAY MANEJO DE EVENTOS .
Entonces la pregunta es:
¿Cuál es la mejor manera de diferenciar este comportamiento (idealmente sin ningún agente de usuario o sistema operativo)?
fuente
e.wheelDelta/120
?Respuestas:
Editar septiembre de 2014
Dado que:
... Solo puedo recomendar el uso de este código simple de conteo basado en signos:
El intento original de ser correcto sigue.
Aquí está mi primer intento de un script para normalizar los valores. Tiene dos defectos en OS X: Firefox en OS X producirá valores 1/3 de lo que deberían ser, y Chrome en OS X producirá valores 1/40 de lo que deberían ser.
Puede probar este código en su propio navegador aquí: http://phrogz.net/JS/wheeldelta.html
Las sugerencias para detectar y mejorar el comportamiento en Firefox y Chrome en OS X son bienvenidas.
Editar : Una sugerencia de @Tom es simplemente contar cada llamada de evento como un solo movimiento, utilizando el signo de la distancia para ajustarlo. Esto no dará excelentes resultados con un desplazamiento suave / acelerado en OS X, ni manejará perfectamente los casos en que la rueda del mouse se mueva muy rápido (por ejemplo,
wheelDelta
es 240), pero esto sucede con poca frecuencia. Este código es ahora la técnica recomendada que se muestra en la parte superior de esta respuesta, por las razones descritas allí.fuente
(((evt.deltaY <0 || evt.wheelDelta>0) || evt.deltaY < 0) ? 1 : -1)
esa, aunque no estoy seguro de lo que QA descubre con eso.Aquí está mi loco intento de producir un delta cruzado coherente y normalizado (-1 <= delta <= 1):
Esto es totalmente empírico, pero funciona bastante bien en Safari 6, FF 16, Opera 12 (OS X) e IE 7 en XP
fuente
event
-objeto deo
?o
variable está ahí para mostrar que queremos que el evento original y no un evento envuelto como jQuery u otras bibliotecas puedan pasar a los controladores de eventos.Nuestros amigos en Facebook crearon una gran solución para este problema.
¡He probado en una tabla de datos que estoy construyendo usando React y se desplaza como la mantequilla!
Esta solución funciona en una variedad de navegadores, en Windows / Mac, y en ambos usando trackpad / mouse.
El código fuente se puede encontrar aquí: https://github.com/facebook/fixed-data-table/blob/master/src/vendor_upstream/dom/normalizeWheel.js
fuente
Hice una tabla con diferentes valores devueltos por diferentes eventos / navegadores, teniendo en cuenta el
wheel
evento DOM3 que algunos navegadores ya admiten (tabla debajo).Basado en eso, hice esta función para normalizar la velocidad:
http://jsfiddle.net/mfe8J/1/
Tabla de
mousewheel
,wheel
yDOMMouseScroll
eventos:fuente
Otra solución más o menos autónoma ...
Sin embargo, esto no toma tiempo entre eventos. Parece que algunos navegadores siempre activan eventos con el mismo delta, y solo los activan más rápido cuando se desplazan rápidamente. Otros varían los deltas. Uno puede imaginar un normalizador adaptativo que tenga en cuenta el tiempo, pero que se vuelva algo complicado y difícil de usar.
Trabajo disponible aquí: jsbin / iqafek / 2
fuente
Solución simple y funcional:
fuente
Para soporte de zoom en dispositivos táctiles, regístrese para los eventos de inicio de gestos, cambio de gestos y final de gestos y use la propiedad event.scale. Puedes ver código de ejemplo para esto.
Para Firefox 17
onwheel
, se planea que el evento sea compatible con versiones de escritorio y móviles (según los documentos de MDN en onwheel ). También para Firefox, tal vez elMozMousePixelScroll
evento específico Gecko sea útil (aunque presumiblemente esto ahora está en desuso ya que el evento DOMMouseWheel ahora está en desuso en Firefox).Para Windows, el controlador en sí parece generar los eventos WM_MOUSEWHEEL, WM_MOUSEHWHEEL (¿y quizás el evento WM_GESTURE para la panorámica del panel táctil?). Eso explicaría por qué Windows o el navegador no parecen normalizar los valores del evento de la rueda del mouse (y podrían significar que no puede escribir código confiable para normalizar los valores).
Para el soporte de eventos
onwheel
( no en rueda de ratón) en Internet Explorer para IE9 e IE10, también puede usar el evento estándar W3Conwheel
. Sin embargo, una muesca puede ser un valor diferente de 120 (por ejemplo, una muesca única se convierte en 111 (en lugar de -120) en mi mouse usando esta página de prueba ). Escribí otro artículo con otros detalles sobre eventos de rueda que podrían ser relevantes.Básicamente, en mis propias pruebas para eventos de rueda (estoy tratando de normalizar los valores para el desplazamiento), descubrí que obtengo valores variables para el sistema operativo, el proveedor del navegador, la versión del navegador, el tipo de evento y el dispositivo (mouse de Microsoft con doble rueda, gestos del panel táctil de la computadora portátil , panel táctil portátil con zona de desplazamiento, mouse mágico de Apple, bola de desplazamiento del mouse poderoso de Apple, panel táctil de Mac, etc.
Y tiene que ignorar una variedad de efectos secundarios de la configuración del navegador (por ejemplo, Firefox mousewheel.enable_pixel_scrolling, chrome --scroll-pixels = 150), la configuración del controlador (por ejemplo, Synaptics touchpad) y la configuración del sistema operativo (configuración del mouse de Windows, preferencias del mouse OSX, Configuración del botón X.org).
fuente
Este es un problema con el que he estado luchando durante algunas horas hoy, y no por primera vez :(
He estado tratando de resumir los valores en un "deslizamiento" y ver cómo los diferentes navegadores informan valores, y varían mucho, con Safari informando un orden de magnitud de números más grandes en casi todas las plataformas, Chrome informa bastante más (como 3 veces más ) que firefox, firefox está equilibrado a largo plazo pero es bastante diferente entre plataformas en movimientos pequeños (en Ubuntu gnome, casi solo +3 o -3, parece que resume eventos más pequeños y luego envía un gran "+3")
Las soluciones actuales encontradas en este momento son tres:
La idea en Qooxdoo es buena, y funciona, y es la única solución que actualmente considero un navegador cruzado completamente consistente.
Desafortunadamente, tiende a renormalizar también la aceleración. Si lo prueba (en sus demostraciones) y se desplaza hacia arriba y hacia abajo a la velocidad máxima durante un tiempo, notará que desplazarse extremadamente rápido o extremadamente lento básicamente produce casi la misma cantidad de movimiento. Por el contrario, si vuelve a cargar la página y solo desliza muy lentamente, notará que se desplazará bastante rápido ".
Esto es frustrante para un usuario de Mac (como yo) que solía deslizar vigorosamente el mouse sobre el panel táctil y esperaba llegar a la parte superior o inferior del elemento desplazado.
Aún más, dado que reduce la velocidad del mouse en función del valor máximo obtenido, cuanto más intente su usuario acelerar, más disminuirá la velocidad, mientras que un usuario de "desplazamiento lento" experimentará velocidades bastante rápidas.
Esto hace que esta solución (por lo demás brillante) sea una implementación ligeramente mejor de la solución 1.
Porté la solución al complemento jquery mousewheel: http://jsfiddle.net/SimoneGianni/pXzVv/
Si juegas con él por un tiempo, verás que comenzarás a obtener resultados bastante homogéneos, pero también notarás que tiende a valores + 1 / -1 bastante rápido.
Ahora estoy trabajando en mejorarlo para detectar picos mejor, para que no envíen todo "fuera de escala". También sería bueno obtener también un valor flotante entre 0 y 1 como el valor delta, para que haya una salida coherente.
fuente
Definitivamente no hay una manera simple de normalizar a todos los usuarios en todos los sistemas operativos en todos los navegadores.
Se pone peor que las variaciones enumeradas: en mi configuración de Windows XP + Firefox3.6 mi rueda del mouse hace 6 por desplazamiento de una muesca, probablemente porque en algún lugar que he olvidado he acelerado la rueda del mouse, ya sea en el sistema operativo o en algún lugar sobre: config
Sin embargo, estoy trabajando en un problema similar (con una aplicación similar por cierto, pero no lienzo) y se me ocurre simplemente usando el signo delta de +1 / -1 y midiendo con el tiempo la última vez que disparó, tener una tasa de aceleración, es decir. si alguien se desplaza una vez contra varias veces en unos momentos (lo que apostaría es cómo lo hace google maps).
El concepto parece funcionar bien en mis pruebas, solo agregue algo menos de 100 ms a la aceleración.
fuente
fuente