Realza la manera en que se carga una página web con animaciones CSS
() translation by (you can also view the original English article)
En un tutorial previo, creamos una página responsiva a pantalla completa con flexbox. Hoy, haremos que esta página sea más atractiva agregándole algunas animaciones de CSS.
Aquí está lo que vamos a crear:
1. El archivo HTML
Para añadir las animaciones deseadas, actualizaremos ligeramente el marcado (markup) de la página inicial. En el tutorial anterior, el marcado de nuestro elemento main
se veía así:
1 |
<main class="page-main"> |
2 |
<div>
|
3 |
<h1>...</h1> |
4 |
<p>...</p> |
5 |
<p>...</p> |
6 |
</div>
|
7 |
</main>
|
Para los fines de este tutorial, añadiremos algunas envolturas (wrappers) adicionales, cambiándolo a esto:
1 |
<main class="page-main"> |
2 |
<div>
|
3 |
<div class="text-wrapper"> |
4 |
<h1>...</h1> |
5 |
</div>
|
6 |
<div class="text-wrapper p-wrapper"> |
7 |
<p>...</p> |
8 |
</div>
|
9 |
<div class="text-wrapper p-wrapper"> |
10 |
<p>...</p> |
11 |
</div>
|
12 |
</div>
|
13 |
</main>
|
Abajo se muestra el marcado general de la página después de esta modificación:
1 |
<div class="wrapper"> |
2 |
<header class="page-header"> |
3 |
<nav>
|
4 |
<h2>...</h2> |
5 |
<ul>...</ul> |
6 |
<button class="cta-contact">...</button> |
7 |
</nav>
|
8 |
</header>
|
9 |
<main class="page-main"> |
10 |
<div>
|
11 |
<div class="text-wrapper"> |
12 |
<h1>...</h1> |
13 |
</div>
|
14 |
<div class="text-wrapper p-wrapper"> |
15 |
<p>...</p> |
16 |
</div>
|
17 |
<div class="text-wrapper p-wrapper"> |
18 |
<p>...</p> |
19 |
</div>
|
20 |
</div>
|
21 |
</main>
|
22 |
<footer class="page-footer"> |
23 |
<small>...</small> |
24 |
<ul>...</ul> |
25 |
</footer>
|
26 |
</div>
|
2. Añadiendo los estilos CSS iniciales
Con el HTML colocado, concentremos nuestra atención en las cosas importantes: el CSS.
Para iniciar haremos cuatro cosas:
- Ocultamos todos los elementos de la página.
- Ajustamos los estilos para los elementos
header
yfooter
y sus subelementos. - Definimos los estilos para
::after
del pseudo-elemento delheader
. - Especificamos lo estilos para las envolturas del texto y sus subelementos dentro de
main
.
Aquí están los estilos asociados:
1 |
/* variables */
|
2 |
:root { |
3 |
--main-purple-color: #9e89b8; |
4 |
}
|
5 |
|
6 |
.page-header nav > *, |
7 |
.page-main, |
8 |
.page-footer > * { |
9 |
opacity: 0; |
10 |
}
|
11 |
|
12 |
.page-header, |
13 |
.page-footer, |
14 |
.page-main .text-wrapper { |
15 |
overflow: hidden; |
16 |
}
|
17 |
|
18 |
.page-header nav > * { |
19 |
transform: translateY(-30px); |
20 |
}
|
21 |
|
22 |
.page-footer > * { |
23 |
transform: translateY(30px); |
24 |
}
|
25 |
|
26 |
.page-header { |
27 |
position: relative; |
28 |
}
|
29 |
|
30 |
.page-header::after { |
31 |
content: ''; |
32 |
position: absolute; |
33 |
bottom: 0; |
34 |
left: 0; |
35 |
width: 100%; |
36 |
height: 2px; |
37 |
background: var(--main-purple-color); |
38 |
z-index: 99999; |
39 |
transform: scaleX(0); |
40 |
}
|
41 |
|
42 |
.page-main .text-wrapper + .text-wrapper { |
43 |
margin-top: 10px; |
44 |
}
|
45 |
|
46 |
.page-main .text-wrapper * { |
47 |
transform: translateY(120%); |
48 |
}
|
49 |
|
50 |
.page-main .p-wrapper * { |
51 |
transform: translateY(-120%); |
52 |
}
|
3. Iniciando las animaciones CSS
Con HTML y CSS básico preparados, ahora podemos concentrarnos en las animaciones de la página.
No obstante, antes de hacer eso, asegurémonos de que entendemos cuándo deberían ejecutarse: idealmente, tan pronto como la página esté completamente cargada. Esto asegura que todos los recursos de la página estarán listos, colocados en la posición correcta, y no perderemos ninguno de los efectos de animación.
Teniendo en cuenta eso, primero esperamos que se cargue la página, y cuando eso ocurra, usamos JavaScript para añadir una clase loaded
al body
.
Aquí está el código JavaScript relacionado:
1 |
window.addEventListener("load", () => { |
2 |
document.querySelector("body").classList.add("loaded"); |
3 |
});
|
Cualquier animación que apliquemos se hará a los descendientes de la clase loaded
.
Así que, nuestra primera animación de escalado se dirige al pseudoelemento ::after
del header
:
1 |
.loaded .page-header::after { |
2 |
animation: scaleIn 1.3s ease-in 0.2s forwards; |
3 |
}
|
4 |
|
5 |
@keyframes scaleIn { |
6 |
100% { |
7 |
transform: scaleX(1); |
8 |
}
|
9 |
}
|
Sugerencia: De forma predeterminada, el origen de transformación de un elemento es su centro, por lo que la animación del pseudo-elemento comienza desde su
centro. Si quieres que la animación inicie desde otra posición, solo cambia el valor de la propiedad transform-origin
del elemento de destino.
A continuación puedes ver cómo cambia nuestra animación cuando aplicamos un transform-origin
diferente:
Luego, utilizamos un efecto de aparición gradual para mostrar los elementos de la página. Además de esta animación, también utilizamos una animación deslizable para mostrar el contenido de header
y de footer
:
1 |
.loaded .page-main { |
2 |
animation: fadeIn 1s ease-in 0.7s forwards; |
3 |
}
|
4 |
|
5 |
.loaded .page-header nav > *, |
6 |
.loaded .page-footer > * { |
7 |
animation: fadeIn 1s ease-in 0.7s forwards, slideIn 0.8s ease-in 0.9s forwards; |
8 |
}
|
9 |
|
10 |
@keyframes fadeIn { |
11 |
60% { |
12 |
opacity: 0; |
13 |
}
|
14 |
|
15 |
100% { |
16 |
opacity: 1; |
17 |
}
|
18 |
}
|
19 |
|
20 |
@keyframes slideIn { |
21 |
100% { |
22 |
transform: translateY(0); |
23 |
}
|
24 |
}
|
Finalmente, los elementos de main
se hacen visibles a través de un efecto deslizante:
1 |
.loaded .page-main .text-wrapper * { |
2 |
animation: slideIn 0.6s cubic-bezier(0.54, 0.46, 0.54, 0.94) 2s forwards; |
3 |
}
|
4 |
|
5 |
@keyframes slideIn { |
6 |
100% { |
7 |
transform: translateY(0); |
8 |
}
|
9 |
}
|
Ahora veamos nuevamente lo que acabamos de crear:
Conclusión
En este breve tutorial, logramos animar una página HTML de flexbox aprovechando las animaciones CSS.
Unas cuantas notas antes de cerrar:
- En vez de animaciones CSS, también podríamos haber utilizado transiciones CSS (casi todas nuestras animaciones van desde un estado inicial hasta un estado final). La animación de aparición gradual es la más complicada porque incluye tres pasos de animación (0%, 60%, 100%).
- En lugar de transformaciones 2d, podríamos haber utilizado igualmente transformaciones 3d.
- Experimenta con los valores de las propiedades
animation-duration
yanimation-delay
para modificar las animaciones según tus necesidades. - Es probable que en las pantallas de dispositivos móviles quieras limitar el número de animaciones que se producen (por ejemplo, eliminar las animaciones de pie de página). Las animaciones de demostración funcionan bien, especialmente en las pantallas donde todos los contenidos de la página son visibles.
Aprende más sobre animación CSS
- Animación CSSIntroducción para principiantes a la animación CSSCatalin Miron
- CSSUna guía visual para la animación CSSKezz Bracey
- AnimaciónTrabajando correctamente con animaciones de fotogramas clave en CSSCraig campbell
- AnimaciónFunciones Easing in a Cubic BezierGuy Routledge
- FlexboxCómo crear una página responsiva a pantalla completa con FlexboxGeorge Martsoukos