El Atributo ONMOUSEWHEEL

Detecta el movimiento de la rueda del mouse sobre un elemento.

El atributo onmousewheel detecta el movimiento de la rueda del mouse sobre un elemento. Útil para:

  • Controles de zoom personalizados

  • Scroll horizontal

  • Ajuste de parámetros numéricos

  • Efectos visuales interactivos

Sintaxis Básica

<elemento onmousewheel="funcion(event)">
  • event.deltaY: Fuerza y dirección del desplazamiento (positivo = abajo, negativo = arriba)

  • event.preventDefault(): Cancela el scroll predeterminado.

Ejemplos Detallados

Ejemplo 1: Sistema de Zoom

function manejarZoom(e) {
    e.preventDefault();
    nivelZoom += e.deltaY * -0.002; // Invertir dirección
    element.style.transform = `scale(${nivelZoom})`;
}

Uso: Scroll hacia arriba aumenta el zoom, hacia abajo lo reduce.

Ejemplo 2: Scroll Horizontal

e.target.scrollLeft += e.deltaY * 4; // Convertir desplazamiento vertical a horizontal

Truco: Multiplicar deltaY para ajustar velocidad.

Ejemplo 3: Efecto 3D

element.style.transform = `
    perspective(1000px)
    rotateX(${rotacionX}deg)
    rotateY(${rotacionY}deg)
`;

Efecto: Movimientos de rueda en X/Y rotan el elemento en 3D

Ejemplo 4: Control de Velocidad

velocidad = Math.min(Math.max(0.5, velocidad), 5); // Limitar valores

Buena práctica: Limitar rangos para evitar valores extremos.

Buenas Prácticas

Optimiza el rendimiento:

requestAnimationFrame(() => {
    // Animaciones complejas aquí
});

Combina con CSS:

transition: transform 0.3s; /* Animación suave */

Accesibilidad:

  • Proporciona controles alternativos (botones +/-)

  • Usa aria-live para actualizaciones dinámicas

Compatibilidad y Alternativas

Navegadores modernos: Chrome, Edge, Safari

Firefox: Requiere DOMMouseScroll (obsoleto) o el evento estándar wheel

Alternativa recomendada:

elemento.addEventListener('wheel', funcion);

Conclusión

El onmousewheel permite crear interacciones avanzadas, pero considera:

  • Usar el evento estándar wheel para mejor compatibilidad
  • Optimizar el rendimiento en animaciones complejas
  • Proporcionar alternativas para móviles y accesibilidad

¡Experimenta creando controles personalizados y efectos innovadores!

Nota importante: Para producción, considera usar el evento estándar wheel con addEventListener para mejor compatibilidad entre navegadores.

<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <title>Tutorial: Uso del atributo "onmousewheel" en HTML</title>
    <style>
        .demo-area {
            width: 400px;
            height: 200px;
            border: 2px solid #3498db;
            margin: 20px;
            padding: 20px;
            overflow: hidden;
        }
        #zoom-container {
            text-align: center;
            transition: transform 0.3s;
        }
        .scroll-container {
            display: flex;
            overflow-x: hidden;
            gap: 20px;
        }
        .carta-3d {
            width: 100px;
            height: 100px;
            background: #e74c3c;
            transition: transform 0.5s;
        }
        .rotating-box {
            width: 100px;
            height: 100px;
            background: #2ecc71;
            margin: 20px;
            transform-origin: center;
        }
    </style>
</head>
<body>
    <h1>Tutorial del atributo <code>onmousewheel</code></h1>

    <!-- Ejemplo 1: Zoom interactivo -->
    <h2>1. Control de zoom</h2>
    <div class="demo-area" onmousewheel="manejarZoom(event)">
        <div id="zoom-container">
            <img src="https://via.placeholder.com/300x150" alt="Imagen zoom">
            <p id="zoom-level">Zoom: 100%</p>
        </div>
    </div>

    <!-- Ejemplo 2: Desplazamiento horizontal -->
    <h2>2. Scroll horizontal personalizado</h2>
    <div class="demo-area scroll-container" onmousewheel="scrollHorizontal(event)">
        <div class="item">➡️ Item 1</div>
        <div class="item">➡️ Item 2</div>
        <div class="item">➡️ Item 3</div>
        <div class="item">➡️ Item 4</div>
    </div>

    <!-- Ejemplo 3: Rotación 3D -->
    <h2>3. Efecto 3D con rueda</h2>
    <div class="carta-3d"
         onmousewheel="rotar3D(event)"
         onmouseenter="this.style.transform = 'perspective(1000px)'"
    ></div>

    <!-- Ejemplo 4: Control de velocidad -->
    <h2>4. Ajuste de parámetros</h2>
    <div class="demo-area">
        <div class="rotating-box" onmousewheel="rotarCaja(event)"></div>
        <p>Velocidad de rotación: <span id="velocidad">1x</span></p>
    </div>

    <script>
        // Ejemplo 1: Sistema de zoom
        let nivelZoom = 1;
        function manejarZoom(e) {
            e.preventDefault();
            nivelZoom += e.deltaY * -0.002;
            nivelZoom = Math.min(Math.max(0.5, nivelZoom), 3);
            document.getElementById("zoom-container").style.transform = `scale(${nivelZoom})`;
            document.getElementById("zoom-level").textContent = `Zoom: ${Math.round(nivelZoom * 100)}%`;
        }

        // Ejemplo 2: Scroll horizontal
        function scrollHorizontal(e) {
            e.preventDefault();
            e.target.scrollLeft += e.deltaY * 4;
        }

        // Ejemplo 3: Rotación 3D
        let rotacionX = 0;
        let rotacionY = 0;
        function rotar3D(e) {
            e.preventDefault();
            rotacionX += e.deltaY * 0.5;
            rotacionY += e.deltaX * 0.5;
            e.target.style.transform = `
                perspective(1000px)
                rotateX(${rotacionX}deg)
                rotateY(${rotacionY}deg)
            `;
        }

        // Ejemplo 4: Control de velocidad
        let velocidad = 1;
        function rotarCaja(e) {
            e.preventDefault();
            velocidad += e.deltaY * -0.01;
            velocidad = Math.min(Math.max(0.5, velocidad), 5);
            e.target.style.transform = `rotate(${velocidad * 360}deg)`;
            document.getElementById("velocidad").textContent = `${velocidad.toFixed(1)}x`;
        }
    </script>
</body>
</html>