Emirodgar

Cómo crear un modo oscuro en una web

Publicado el 15/05/2021 2 minutos de lectura Programación

Muchas páginas ofrecen la opción a sus visitantes de cambiar la plantilla web y pasar de una versión clara (generalmente blanca) a una oscura.

¿Cómo podemos crear un modo oscuro para una página web? aunque iba a crear mis propios códigos, he partido de este tutorial.

Crear el enlace para cambiar

El primer paso será ofrecer el enlace que permita -a través de JavaScript y el almacenamiento interno del navegador- seleccionar la versión clara o la oscura.

<a href="#" onclick="localStorage.setItem('mode', (localStorage.getItem('mode') || 'dark') === 'dark' ? 'light' : 'dark'); localStorage.getItem('mode') === 'dark' ? document.querySelector('body').classList.add('dark') : document.querySelector('body').classList.remove('dark')" title="Dark/light">Modo oscuro</a>

Con este enlace lo que estamos haciendo es seleccionar una versión u otra.

Crear el listener para cambiar la clase

Cada vez que hacemos clic en el enlace lo que tenemos que hacer es asignar una clase “clara” u “oscura” a la página web para que de esa forma se cambie el color. Esto lo hacemos estableciendo un listener para que obtenga el valor de localStorage.

document.addEventListener('DOMContentLoaded', (event) => {
  ((localStorage.getItem('mode') || 'dark') === 'dark') ? document.querySelector('body').classList.add('dark') : document.querySelector('body').classList.remove('dark')
})

Crear los estilos para el modo noche

Ya sólo nos queda establecer qué estilos CSS tendrá el modo noche. Dado que lo que hace el listener es asignar la clase dark al elemento body de nuestra página, debemos crear los estilos de la siguiente manera:

body.dark code[class*=language-],
body.dark table tbody>tr:nth-child(odd)>td,
body.dark table tbody>tr:nth-child(odd)>th {
  background: #282c34;
  color:white;
}
body.dark h1,h2,h3,h4 { color:white;}
body.dark .post .post-content p {color :white;} 

Los estilos CSS dependerán de cada página web. Los que he puesto antes son los que corresponde a mi blog.