domingo, 14 de febrero de 2021

👨‍💻 Cómo crear 7 efectos CSS "hover" distintos desde cero

En el tutorial de hoy, vamos a crear 7 diferentes efectos CSS para el estado "hover" (cuando sitúas el ratón o el dedo sobre un elemento cliclable). Mientras vemos esto aprenderemos un montón de cosas, por ejemplo, cómo animar iconos basados en fuentes, animar bordes y trazados curvilíneos en formato SVG ("paths"). Podrás aplicar estos efectos "hover" CSS en todo tipo de situaciones. ¡Vamos a zambullirnos!

Sólo para darte una idea de lo que vas a aprender a lo largo de este tutorial, echa un vistazo a una de las demostraciones que vamos a crear:

Empecemos con éste, nos vemos en el primer paso…

1. Efecto hover CSS que revela un icono

En este primer ejemplo, exploraremos el ejemplo que acabas de ver: un efecto hover en el que el texto es reemplazado por un icono mediante un desplazamiento animado.

Comienza con el código de marcado de página

Empezaremos con una sencilla lista desordenada que representa un menú de página típico. Cada enlace de menú incluirá dos elementos span. El primero contendrá el texto ancla, mientras que el segundo contendrá un icono de Font Awesome:

Especificar los estilos

La lista estará constituida por un contenedor flexible cuyo contenido está centrado horizontalmente:

Nota: Este estilo base se añadirá a todas las demostraciones que vamos a construir, por lo que no lo volveremos a explicar. La demo también tiene algunos estilos con fines estéticos que reutilizaremos cada vez (como un fondo oscuro, etc.) y que puedes copiar desde la demostración en CodePen.

El primer span de cada elemento tendrá un poco de relleno (padding) a su alrededor:

A continuación, el segundo span estará posicionado de forma absoluta y oculto por defecto. Además, su icono estará centrado tanto horizontal como verticalmente:

Cada vez que pasemos el cursor sobre un enlace, su texto desaparecerá. Por otro lado, en ese momento el icono asociado se hará visible:

Afortunadamente, existe la opción de modificar la dirección de las animaciones deslizantes según nuestras necesidades. Por defecto, durante la animación del desplazamiento, el icono aparecerá de arriba a abajo, mientras que el texto se moverá hacia la parte inferior. Para cambiar ese comportamiento, tenemos que pasar el atributo data-animation a la lista de destino. Los posibles valores son to-top, to-right,y to-left.

Los estilos correspondientes se muestran a continuación:

Aquí está la demostración completa de CodePen que resume los casos antes mencionados:


2. Efecto hover CSS de desplazamiento revelador

En este segundo ejemplo continuaremos con otro efecto de desplazamiento donde el texto es reemplazado por un impresionante icono basado en una fuente. Pero, esta vez, el reemplazo ocurrirá en segundo plano y no será visible para nosotros, gracias a un "deslizamiento" que ocurre en primer plano:

The animation in action

Especifica el código de marcado de página

Como siempre, comenzaremos con una lista sin ordenar que contendrá los enlaces de página. Sin embargo, en este caso, cada uno de nuestros enlaces tendrá un atributo data-icon. El valor de este atributo coincidirá con la respresentación Unicode de un icono de Font Awesome:

Especifica los estilos

A continuación, definiremos los pseudoelementos ::before y ::after de todos los enlaces.

  • El pseudo-elemento ::before se colocará en el centro del enlace, aunque inicialmente será invisible.
  • El pseudo-elemento ::after cubrirá las dimensiones completas del enlace, pero también estará oculto de forma predeterminada. Su contenido contendrá un icono de Font Awesome especificado en el relevante atributo data-icon:

Cada vez que pasemos el cursor sobre un enlace, primero aparecerá rápidamente el pseudo-elemento ::before. Luego, se desplazará hacia la derecha y aparecerá el icono. Durante ese tiempo, el color del texto de ancla se establecerá en transparente.

Para lograr esta precisa sincronización, tenemos que personalizar la velocidad de las transiciones. Por ejemplo, añadiremos retrasos tanto a los enlaces, como a su pseudo-elemento ::after:

Si prefieres una animación en sentido inverso, sencillamente agrega el atributo data-animation="to-left" a la correspondiente lista:

la animacion en accion

Aquí está la demostración de Codepen que cubre ambos casos:


3. Efecto de desplazamiento CSS con subrayado animado

En nuestro tercer ejemplo veremos un habitual efecto de deslizamiento en donde se revela un subrayado mediante un desplazamiento animado:

The animation in action

Especificar el código de marcado de página

Comenzaremos con una lista desordenada que almacenará los enlaces de página:

Especificar los estilos

A continuación, definiremos el pseudo-elemento ::before para todos los enlaces. Lo colocaremos en la parte inferior de su contenedor y le asignaremos translate: scaleX(0), por lo que inicialmente estará oculto.

Además, le aplicaremos transform-origin: left porque queremos que la animación comience de izquierda a derecha:

Cada vez que pasemos el cursor sobre un enlace, aparecerá su pseudo-elemento:

De forma similar al ejemplo anterior, tenemos la opción de cambiar la dirección de la animación del deslizamiento. La línea aparecerá de izquierda a derecha de forma predeterminada, pero para cambiar ese comportamiento, tenemos que pasar el atributo data-animation a la lista de destino. Los valores posibles son to-left y center.

Los estilos correspondientes son los siguientes:

¡Un extra!

Podemos ir un paso más allá y cambiar el valor de la propiedad transform-origin del pseudo-elemento dependiendo de su estado. Esto hace que el subrayado aparezca por un lado y desaparezca por el otro:

The animation in action

Aquí están las reglas que implementan esta funcionalidad:

Aquí tienes la demostración de CodePen para los escenarios que discutimos:

4. Animación CSS de efecto hover con múltiples líneas

Continuando, en este cuarto ejemplo explicaremos un efecto de desplazamiento donde son reveladas varias líneas secuencialmente. Lo atractivo de esta técnica es que nos da la impresión de que el borde del elemento flotado está siendo dibujado. ¡Esto es genial!

Nota: este efecto también se puede lograr con SVG, y veremos algo similar en una demostración posterior.

The animation in action

Especificar el código de marcado de página

Una vez más, nuestro marcado constará de una lista desordenada. Cada uno de los enlaces de menú contendrá cuatro elementos span vacíos:

Especificar los estilos

Los elementos span estarán posicionados de forma absoluta y ocultos de forma predeterminada. Sin embargo, sus propiedades position y transform-origen serán diferentes:

A medida que pasamos el ratón sobre un enlace, sus elementos span se harán visibles secuencialmente, tras una rotación en el sentido de las agujas del reloj. Para conseguirlo, controlaremos cuándo se hacen visibles el segundo, el tercero y el cuarto elemento span:

Al modificar el valor de la propiedad transform-origin y cancelar los retardos de nuestros elementos, podemos generar fácilmente otro efecto agradable:

The animation in action

Para incorporar este efecto en nuestro menú, tenemos que anexarle el atributo data-animation="diagonal". Esto dará como resultado los siguientes estilos CSS:

Echa un vistazo a la demo en CodePen que nos da esos efectos:


5. Efecto hover con un círculo SVG animado

En este quinto ejemplo, explicaremos paso a paso un efecto de desplazamiento donde es animada un un trazado SVG, rodeando nuestro vínculo. La técnica que vamos a usar no es algo nuevo; en realidad, Jake Archibald ya escribió sobre ello hace algunos años.

The animation in action

Especificar el código de marcado de página

Una vez más, comenzaremos con una lista desordenada, pero esta vez incluiremos un SVG anidado dentro de cada enlace:

El SVG será una elipse representada a través del elemento path. Le daremos preserveAspectRatio="ninguno" porque, como veremos en un momento, debe cubrir las dimensiones completas del elemento padre, incluso aunque esté estirado.

Especificar los estilos

El SVG estará posicionado de forma absoluta y centrado dentro de su contenedor. Además, como mencionamos anteriormente, será lo suficientemente grande como para cubrir el texto ancla:

El elemento path tendrá un trazo y su color de relleno será transparente:

Para animar el trazado de la trayectoria, necesitaremos dos propiedades adicionales. Concretamente, las propiedades stroke-dasharray y stroke-dashoffset.

La propiedad stroke-dasharray es responsable de crear guiones entre espacios huecos en nuestro trazo. Por ejemplo, si establecemos stroke-dasharray: 50 en el trazado, tendrá el siguiente aspecto:

La propiedad stroke-dashoffset es responsable de cambiar la posición (desfase) de esos guiones.

Así que aquí está el truco:

  • En primer lugar, el valor de la propiedad stroke-dasharray debe coincidir con la longitud del trazo de la trayectoria. En lugar de adivinarlo, JavaScript proporciona una práctica manera para conseguirlo mediante el método getTotalLength().
  • A continuación, asignaremos el valor resultante (o su valor negativo para un efecto invertido) a la propiedad stroke-dashoffset. Esta sencilla combinación ocultará el SVG.
  • A continuación, cada vez que pasemos el cursor sobre un vínculo, ejecutaremos una animación que cambiará el valor de la propiedad stroke-dashoffset a 0. Como resultado de esto, el trazado será gradualmente "dibujado".

Teniendo en cuenta todo lo anterior, primero vamos a recuperar la longitud del trazado (sólo para la primera trayectoria) mediante JavaScript:

A continuación, asignaremos este valor a las correspondientes propiedades:

Por último, como mejora, en lugar de crear directamente el código de los valores stroke-dasharray y stroke-dashoffset, podríamos especificarlos dinámicamente usando JavaScript (¡intenta hacerlo tú mismo!).

Aquí está la demostración final, que nos da un refrescante efecto hover que parece trazado sobre una pizarra:

6. Efecto hover con una línea SVG ondulada

Ahora que conocemos los principios básicos que rigen la animación de trayectorias SVG, echemos un rápido vistazo a otros dos ejemplos muy similares. En ambos, no habrá ninguna necesidad de estirar los SVGs, por lo que no haremos uso del atributo preserveAspectRatio="none".

El primero revelará un subrayado ondulado.

Aquí está la demostración:

7. Efecto hover con una flecha SVG apuntando

En el tercer ejemplo con un SVG se revelará un icono Iconmonstr (una flecha apuntando).

Aquí está la demostración para que puedas deducirlo por ti mismo:


Conclusión

¡Con esto concluimos un nuevo tutorial, amigos! Ha sido un viaje un poco largo, pero espero que lo hayas disfrutado y hayas aprendido algunas cosas nuevas a incluir en tu kit de herramientas para el front-end.

Por último, pero no menos importante, he añadido todas las demostraciones de este tutorial en una colección de CodePen. ¡No olvides visitarlo y darle un poco de amor!

Me encantaría ver tus efectos favoritos con CSS. Da igual si provienen de CodePen, de un sitio web inspirador o de cualquier otro lugar. No olvides compartirlos con nosotros en la sección de comentarios.

Como siempre, ¡muchas gracias por leernos!

Más tutoriales de efectos hover mediante CSS y JS

Aprende a crear efectos hover CSS aún más interesantes con estos tutoriales de Tuts+:


    Fuentes.

    https://webdesign.tutsplus.com/es/tutorials/how-to-create-different-css-hover-effects-from-scratch--cms-34222