¿Cómo crear un cursor personalizado usando CSS?

El cursor personalizado mejora la legibilidad del documento y atrae la atención del usuario hacia una parte específica de la página web. Hoy vamos a aprender cómo crear un cursor personalizado para una página web usando HTML, CSS y Javascript.

Acercarse:

  • Oculte el cursor predeterminado.
  • Defina las clases que contienen todas las animaciones.
  • Agregue y elimine estas clases dinámicamente cuando se presiona el botón del mouse o cuando se mueve el puntero del mouse.

Ejemplo: 
 

HTML

<!DOCTYPE html>
<html>
 
<head>
    <style>
        :root {
            --color: 255, 71, 84;
            --cursor-size: 30px;
        }
 
        * {
            cursor: none;
        }
 
        html,
        body {
            height: 100%;
        }
 
        body {
            margin: 0;
            overflow: hidden;
 
            background: #121212;
        }
 
        .custom-cursor {
            position: absolute;
            z-index: 99;
            top: 0;
            left: 0;
 
            width: var(--cursor-size);
            height: var(--cursor-size);
 
            border: calc(var(--cursor-size)
                        /30) solid #fff;
            border-radius: 50%;
 
            animation: cursor 800ms infinite
                    alternate ease-in-out;
              pointer-events: none;
        }
 
        .custom-cursor::before {
            content: "";
            display: block;
            width: calc(var(--cursor-size) / 2);
            height: calc(var(--cursor-size) / 2);
 
            position: absolute;
            top: 50%;
            left: 50%;
            transform: translate(-50%, -50%);
 
            border: calc(var(--cursor-size) / 6)
                    solid rgba(var(--color), 0.5);
 
            border-radius: 50%;
 
            animation: cursor-before 800ms infinite
                    alternate ease-in-out;
        }
 
        .custom-cursor.click {
            animation: cursor-click 800ms
                normal ease-in-out;
        }
 
        @keyframes cursor {
            from {
                transform: scale(1);
                border-color: #fff;
            }
 
            to {
                transform: scale(1.5);
                border-color: rgb(var(--color));
            }
        }
 
        @keyframes cursor-before {
            from {
                transform: translate(-50%, -50%) scale(1);
                border-color: rgba(var(--color), 0.5);
            }
 
            to {
                transform: translate(-50%, -50%) scale(1.5);
                border-color: rgba(var(--color), 0.75);
            }
        }
 
        @keyframes cursor-click {
 
            0%,
            100% {
                transform: scale(1);
            }
 
            50% {
                transform: scale(2.5);
                border-color: rgb(var(--color));
            }
        }
    </style>
</head>
 
<body>
    <div class="custom-cursor"></div>
</body>
 
</html>

Código JavaScript: 
 

javascript

const cursor = document
    .querySelector(".custom-cursor");
 
// Adding the animations when the
// mouse button is clicked
 
window.addEventListener("mousedown", (event) => {
    if (!cursor.classList.contains("click")) {
        cursor.classList.add("click");
 
        setTimeout(() => {
            cursor.classList.remove("click");
        }, 800);
    }
});
 
// Getting the position of the cursor
window.addEventListener("mousemove", (event) => {
    let x = event.pageX - cursor.offsetWidth / 2,
        y = event.pageY - cursor.offsetHeight / 2;
 
    cursor.style.left = `${x}px`;
    cursor.style.top = `${y}px`;
});

Código completo: 
 

HTML

<!DOCTYPE html>
<html>
 
<head>
    <style>
        :root {
            --color: 255, 71, 84;
            --cursor-size: 30px;
        }
 
        * {
            cursor: none;
        }
 
        html,
        body {
            height: 100%;
        }
 
        body {
            margin: 0;
            overflow: hidden;
 
            background: #121212;
        }
 
        .custom-cursor {
            position: absolute;
            z-index: 99;
            top: 0;
            left: 0;
 
            width: var(--cursor-size);
            height: var(--cursor-size);
 
            border: calc(var(--cursor-size)
                        / 30) solid #fff;
            border-radius: 50%;
 
            animation: cursor 800ms infinite
                    alternate ease-in-out;
        }
 
        .custom-cursor::before {
            content: "";
            display: block;
            width: calc(var(--cursor-size) / 2);
            height: calc(var(--cursor-size) / 2);
 
            position: absolute;
            top: 50%;
            left: 50%;
            transform: translate(-50%, -50%);
 
            border: calc(var(--cursor-size) / 6)
                    solid rgba(var(--color), 0.5);
 
            border-radius: 50%;
 
            animation: cursor-before 800ms
                infinite alternate ease-in-out;
        }
 
        .custom-cursor.click {
            animation: cursor-click 800ms
                normal ease-in-out;
        }
 
 
        @keyframes cursor {
            from {
                transform: scale(1);
                border-color: #fff;
            }
 
            to {
                transform: scale(1.5);
                border-color: rgb(var(--color));
            }
        }
 
        @keyframes cursor-before {
            from {
                transform: translate(-50%, -50%) scale(1);
                border-color: rgba(var(--color), 0.5);
            }
 
            to {
                transform: translate(-50%, -50%) scale(1.5);
                border-color: rgba(var(--color), 0.75);
            }
        }
 
        @keyframes cursor-click {
 
            0%,
            100% {
                transform: scale(1);
            }
 
            50% {
                transform: scale(2.5);
                border-color: rgb(var(--color));
            }
        }
    </style>
</head>
 
<body>
    <div class="custom-cursor"></div>
    <script>
        const cursor = document
            .querySelector(".custom-cursor");
 
        // Adding the animations when the
        // mouse button is clicked
 
        window.addEventListener("mousedown", (event) => {
            if (!cursor.classList.contains("click")) {
                cursor.classList.add("click");
 
                setTimeout(() => {
                    cursor.classList.remove("click");
                }, 800);
            }
        });
 
        // Getting the position of the cursor
        window.addEventListener("mousemove", (event) => {
            let x = event.pageX - cursor.offsetWidth / 2,
                y = event.pageY - cursor.offsetHeight / 2;
 
            cursor.style.left = `${x}px`;
            cursor.style.top = `${y}px`;
        });
    </script>
</body>
 
</html>

Producción:

Navegadores compatibles:

  • Google Chrome
  • Borde
  • Mozilla Firefox
  • Ópera
  • Safari

Publicación traducida automáticamente

Artículo escrito por rbbansal y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *