Cómo crear el efectos CSS "hover" desde cero

 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:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
<ul class="menu">
  <li>
    <a href="#0">
      <span>About</span>
      <span>
        <i class="fas fa-address-card" aria-hidden="true"></i>
      </span>
    </a>
  </li>
  <li>
    <a href="#0">
      <span>Projects</span>
      <span>
        <i class="fas fa-tasks" aria-hidden="true"></i>   
      </span>
    </a>
  </li>
  ...
</ul>

Especificar los estilos

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

1
2
3
4
.menu {
  display: flex;
  justify-content: center;
}

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:

1
2
3
4
.menu a span:first-child {
  display: inline-block;
  padding: 10px;
}

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:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
.menu a {
  display: block;
  position: relative;
  overflow: hidden;
}
 
.menu a span:last-child {
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  transform: translateY(-100%);
}

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

01
02
03
04
05
06
07
08
09
10
11
.menu a span {
  transition: transform 0.2s ease-out;
}
 
.menu a:hover span:first-child {
  transform: translateY(100%);
}
 
.menu a:hover span:last-child {
  transform: none;
}

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-topto-right,y to-left.

Los estilos correspondientes se muestran a continuación:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
.menu[data-animation="to-top"] a span:last-child {
  transform: translateY(100%);
}
 
.menu[data-animation="to-top"] a:hover span:first-child {
  transform: translateY(-100%);
}
 
.menu[data-animation="to-right"] a span:last-child {
  transform: translateX(-100%);
}
 
.menu[data-animation="to-right"] a:hover span:first-child {
  transform: translateX(100%);
}
 
.menu[data-animation="to-left"] a span:last-child {
  transform: translateX(100%);
}
 
.menu[data-animation="to-left"] a:hover span:first-child {
  transform: translateX(-100%);
}
Artículo Anterior Artículo Siguiente
post ADS 1
post ADS 2