Agregar un modo oscuro a nuestros sitios web es una excelente manera de mejorar la accesibilidad y la experiencia del usuario. En este tutorial, aprenderás a implementar transiciones de tema utilizando la API View Transition, ¡Usando solo CSS y un poco de JavaScript! Descubre cómo crear efectos visuales fluidos y atractivos que harán que tu sitio web se destaque entre los demás.
Estructura del proyecto
Para comenzar crearemos la siguiente estructura del proyecto:
Estructura base de nuestra página web
Lo primero que haremos será crear la estructura base de nuestra página web, además de linkear nuestros archivos reset.css
, index.css
y script.js
.
Reseteando estilos
Ahora vamos a resetear los estilos que por defecto pone el navegador a los elementos HTML. Te dejo el código css aquí abajo 👇:
Agregando contenido a nuestra página web
El contenido de nuestra página es muy poco, por lo que lo agregaremos a continuación.
La etiqueta <div class="background"></div>
no es necesaria que la pongas, pero yo la usaré para que nuestra página no se vea tan simple 😊.
Agregando los estilos CSS 🎨
Ahora, vamos a agregar los estilos para el modo claro ☀️ de nuestra página web.
Crear animación de cambio de tema ✨
Crear esta animación no es muy complicado y solo es cuestión de utilizar un poco de @keyframes
y pseudo-elements
.
En nuestro archivo style.css
, agregaremos los siguientes pseudo-elements y keyframes:
Explicación del código 🧑💻
La API View Transition introduce dos pseudo-elements especiales: ::view-transition-old
y ::view-transition-new
. Estos se utilizan para definir estilos y animaciones para el contenido saliente (el viejo) y el contenido entrante (el nuevo) durante una transición.
::view-transition-old
: Representa el estado del contenido antes de la transición.::view-transition-new
: Representa el estado del contenido después de la transición.
Definición general de animaciones
Aquí, se establece que ambos pseudo-elementos (::view-transition-old
y ::view-transition-new
) tendrán una animación de duración 1.5 segundos.
El término root dentro de estos pseudo-elements
hace referencia al elemento raíz del documento (generalmente el elemento <html>
o el <body>
). Al especificar root, estamos indicando que queremos aplicar las animaciones a toda la vista o pantalla del documento durante la transición de tema.
Animación para el contenido nuevo
Se asigna la animación translateIn
al pseudo-elemento ::view-transition-new
, que representa el contenido que está entrando.
Animación para el Contenido Viejo
Se asigna la animación translateOut
al pseudo-elemento ::view-transition-old
, que representa el contenido que está saliendo.
Definición de la animación translateIn
La animación translateIn
mueve el contenido desde fuera de la parte superior de la pantalla (translateY(-100%)
) a su posición original (translateY(0)
) mientras cambia su opacidad de 0 a 1.
Definición de la animación translateOut
La animación translateOut mueve el contenido desde su posición original (translateY(0)
) hacia fuera de la parte inferior de la pantalla (translateY(100%)
) mientras cambia su opacidad de 1 a 0.
Agregar modo oscuro 🌑
En el mismo archivo styles.css
agregaremos el siguiente código al final de nuestro archivo ya que sino lo haces no se aplicará ningun cambio de tema esto es por la especificidad de CSS.
Eso a sido todo por parte de los archivos html
y css
🎉🎊.
Agregando código JavaScript ⚡
En el archivo script.js
agregaremos el siguiente código:
Si ahora intentas cambiar el tema a oscuro, lo hará 🤩, pero no con la transición 😢 ya que no estamos utilizando la API View Transition, así que ahora vamos a usarla.
Este es el código que agregaremos en el archivo script.js
:
Explicación del código 🧑💻
La API startViewTransition es una nueva característica que facilita la creación de transiciones visuales fluidas al cambiar contenido en la página. Aquí se utiliza para realizar una transición suave al alternar entre los temas claro y oscuro.
document.startViewTransition(cb)
: Este método acepta una función de retorno (callback) que contiene los cambios que deben ocurrir durante la transición. En este caso, la funcióntoggleMode
se pasa como callback, por lo que los cambios de clase (y, por tanto, de tema) ocurren dentro de una transición visual gestionada por la API.
Función toggleMode
La función toggleMode
se encarga de alternar el modo de tema entre claro y oscuro. Lo hace añadiendo o eliminando la clase dark
del elemento body
:
body.classList.toggle('dark')
: Este método añade la clasedark
albody
si no está presente, y la elimina si ya está presente. Es una forma conveniente de alternar entre los dos modos de tema.
Evento click
en el botón
Aquí se añade un evento de click
al botón toggleBtn
que realiza las siguientes acciones:
toggleBtn.addEventListener('click', cb)
: Este método añade un “escuchador” de eventos que se activa cuando el botón es presionado.document.startViewTransition(() => toggleMode())
: Este es el núcleo del código. Invoca la API startViewTransition de document, que inicia una transición visual.
¡Gracias por leer! 🎉
Bueno… 😮💨 Ese a sido todo el tutorial 🤓.
Espero que te haya gustado, y que hayas aprendido algo nuevo. Y lo más importante, que te sea de ayuda para tus futuros proyectos ✨😊.
Happy coding 👻