--- title: wheel slug: Web/API/Element/wheel_event tags: - eventos translation_of: Web/API/Element/wheel_event ---

El evento "wheel" se dispara cuando la ruleta de un dispositivo (usualmente un ratón) gira. Este evento reemplaza al ahora obsoleto evento {{event("mousewheel")}}.

Información general

Interfaz
{{domxref("WheelEvent")}}
Sincronía
asíncrono
Bubble
Si
Cancelable
Si
Target
defaultView, Document, Element
Acción predet.
Scroll, atras/adelante (historial), o zoom.

Propiedades

Este evento implementa las propiedades de:  {{domxref("WheelEvent")}}, {{domxref("MouseEvent")}}, {{domxref("UIEvent")}} y {{domxref("Event")}}.

Propiedades de WheelEvent

{{page("/en-US/docs/Web/API/WheelEvent", "Properties")}}

Propiedades de MouseEvent

{{page("/en-US/docs/Web/API/MouseEvent", "Properties")}}

Propiedades UIEvent

{{page("/en-US/docs/Web/API/UIEvent", "Properties")}}

Propiedades Event

{{page("/en-US/docs/Web/API/Event", "Properties")}}

Métodos

Este evento implementa los métodos de:  {{domxref("WheelEvent")}}, {{domxref("MouseEvent")}}, {{domxref("UIEvent")}} y {{domxref("Event")}}.

Métodos de WheelEvent

{{page("/en-US/docs/Web/API/WheelEvent", "Methods")}}

Métodos de MouseEvent

{{page("/en-US/docs/Web/API/MouseEvent", "Methods")}}

Métodos de UIEvent

{{page("/en-US/docs/Web/API/UIEvent", "Methods")}}

Métodos de Event

{{page("/en-US/docs/Web/API/Event", "Methods")}}

Especificaciones

Especificación Estado Comentario
{{SpecName('DOM3 Events','DOM3-Events.html#event-type-wheel','wheel')}} {{Spec2('DOM3 Events')}} Definición inicial.

Compatibilidad

{{CompatibilityTable}}

Característica Chrome Edge Firefox (Gecko) Internet Explorer Opera Safari
Soporte básico 31 {{CompatVersionUnknown}} {{CompatGeckoDesktop("17.0")}} {{CompatIE("9.0")}}[1] 18 7.0
Característica Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Soporte básico {{CompatUnknown}} {{CompatGeckoMobile("17.0")}} {{CompatUnknown}} {{CompatUnknown}} {{CompatUnknown}}

[1] Internet Explorer solo toma el evento "wheel" mediante addEventListener, no se permite el atributo onwheel en objetos del DOM. Bug report.
 

Escuchar al evento en distintos navegadores

En el siguiente script se crea el método multi-navegador addWheelListener que permite escuchar el evento wheel en diferentes navegadores a la vez que se previene el funcionamiento por defecto.

// crea el metodo "addWheelListener" global
// ejemplo: addWheelListener( elem, function( e ) { console.log( e.deltaY ); e.preventDefault(); } );
(function(window,document) {

    var prefix = "", _addEventListener, support;

    // detecta el tipo de evento permitido por el navegador
    if ( window.addEventListener ) {
        _addEventListener = "addEventListener";
    } else {
        _addEventListener = "attachEvent";
        prefix = "on";
    }

    // detecta el tipo de evento wheel manejado por el navegador
    support = "onwheel" in document.createElement("div") ? "wheel" : // Los navegadores modernos permiten "wheel"
              document.onmousewheel !== undefined ? "mousewheel" : // Webkit e IE soportan al menos "mousewheel"
              "DOMMouseScroll"; // Asumiremos que el resto de navegadores son Firefox antiguos

    window.addWheelListener = function( elem, callback, useCapture ) {
        _addWheelListener( elem, support, callback, useCapture );

        // controlaremos MozMousePixelScroll en Firefox antiguos
        if( support == "DOMMouseScroll" ) {
            _addWheelListener( elem, "MozMousePixelScroll", callback, useCapture );
        }
    };

    function _addWheelListener( elem, eventName, callback, useCapture ) {
        elem[ _addEventListener ]( prefix + eventName, support == "wheel" ? callback : function( originalEvent ) {
            !originalEvent && ( originalEvent = window.event );

            // Creamos un objeto de evento
            var event = {
                // tomamos como referencia el objeto original
                originalEvent: originalEvent,
                target: originalEvent.target || originalEvent.srcElement,
                type: "wheel",
                deltaMode: originalEvent.type == "MozMousePixelScroll" ? 0 : 1,
                deltaX: 0,
                deltaZ: 0,
                preventDefault: function() {
                    originalEvent.preventDefault ?
                        originalEvent.preventDefault() :
                        originalEvent.returnValue = false;
                }
            };

            // calculamos deltaY (y deltaX) dependiendo del evento
            if ( support == "mousewheel" ) {
                event.deltaY = - 1/40 * originalEvent.wheelDelta;
                // Webkit tambien soporta wheelDeltaX
                originalEvent.wheelDeltaX && ( event.deltaX = - 1/40 * originalEvent.wheelDeltaX );
            } else {
                event.deltaY = originalEvent.detail;
            }

            // Disparamos el callback
            return callback( event );

        }, useCapture || false );
    }

})(window,document);

Notas para Gecko

Orden de los eventos en eventos antiguos

Si el evento wheel no ha sido implementado, los eventos DOMMouseScroll y MozMousePixelScroll se usarán para dar retrocompativilidad. Sus atributos se calculan dependiendo del delta del evento wheel y el padre más cercano. Si el evento wheel o alguno de los anteriores invoca {{ domxref("event.preventDefault()") }}, no ocurrirá nada.

El orden de ejecución del evento es:

  1. Eventos wheel en grupo de eventos por defecto (aplicaciones web y add-ons pueden manejar los eventos de este grupo)
  2. Un evento DOMMouseScroll vertical en caso de que el deltaY, en consecutivas llamadas del evento se vuelva mayor que 1.0 o menor que -1.0
  3. Un evento MozMousePixelScroll vertical en caso de que el deltaY del último evento wheel no sea igual a cero
  4. Un evento DOMMouseScroll horizontal en caso de que el deltaX acumule un valor mayor que 1.0 o menor que -1.0
  5. Un evento MozMousePixelScroll horizontal en caso de que el deltaX del último evento no sea igual que cero
  6. Un evento wheel en el grupo de sistema (Solamente add-ons pueden gestionar este grupo de eventos)


¿Qué ocurre si preventDefault() es llamado?

wheel (grupo por defecto de evetos) Se llama preventDefault()        
DOMMouseScroll (Vertical) No se llama Se llama preventDefault()      
MozMousePixelScroll (Vertical) No se llama defaultPrevented devuelve true Se llama preventDefault()    
DOMMouseScroll (Horizontal) No se llama No se ve afectado No se ve afectado Se llama preventDefault()  
MozMousePixelScroll (Horizontal) No se llama No se ve afectado No se ve afectado defaultPrevented devuelve true Se llama preventDefault()
wheel (grupo de eventos de sistema) defaultPrevented devuelve true defaultPrevented devuelve true defaultPrevented devuelve true defaultPrevented devuelve true defaultPrevented devuelve true

En caso de que un Add-on necesite conocer si uno de los eventos legacy es usado por contenidos del DOM puede usar el evento wheel de #6. Lee la documentación de nsIEventListenerService para mayor detalle acerca del grupo de eventos de sistema.

Los valores delta y las acciones por defecto de eventos predefinidos pueden ser personalizados en las preferencias de usuario (details). Por lo tanto, no se debe presuponer que alguna acción en concreto va a ocurrir tras recibir este evento.

Valores delta

Los valores delta no indican la cantidad de scroll actual de manera predeterminada. Si el usuario presiona alguna tecla mdificadora mientras mueve la rueda de scroll, dicha acción puede causar otra totalmente diferente a la esperada, como ir adelante o atras por el historial o hacer zoom. Además, incluso cuando la acción sea la esperada, el elemento que la recibe puede ser distinto al deseado.
El objetivo del evento wheel solo está definido por la posición del cursor en el momento que se dispara este.

El valor de deltaMode

En Windows, los siguientes 3 eventos nativos del DOM causan eventos wheel.

WM_MOUSEWHEEL (Evento wheel vertical del ratón)
El deltaMode puede ser DOM_DELTA_LINEDOM_DELTA_PAGE. Depende de las preferencias de usuario en Windows (Para configuraciones por defecto, debería ser DOM_DELTA_LINE).
WM_MOUSEHWHEEL (Evento wheel horizontal del ratón)
EldeltaMode puede ser DOM_DELTA_LINEDOM_DELTA_PAGE. Sin embargo, ni la configuración de velocidad de rueda de ratón de Windows ni ningún UI similar de drivers permite modificar el scroll de páginas. De modo que, normalmente este valor es DOM_DELTA_LINE.
WM_GESTURE (Solo utilizado en navegación gestual)
El deltaMode es siempre DOM_DELTA_PIXEL. Pero la mayoría de dispositivos táctiles de portatiles emulan la rueda de ratón en lugar de usar este evento. Este evento es usado típicamente en Tablet PC.

En Mac, el valor de deltaMode depende del dispositivo. Si el dispositivo permite alta resolución, el scroll se hará en pixels, de manera que el valor del deltaMode será DOM_DELTA_PIXEL. De todos modos, el usuario puede cambiarlo a DOM_DELTA_LINE con la preferencia "mousewheel.enable_pixel_scrolling".  Si el dispositivo no soporta alta resolución, es siembre DOM_DELTA_LINE.

En otras plataformas, el valor de deltaMode es siempre DOM_DELTA_LINE.

Eventos no confiables

Los eventos wheel no nativos nunca causarán acción por defecto.

Ver también