No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Curso Básico de Tailwind 2 y 3

Curso Básico de Tailwind 2 y 3

Ana María Díaz Solorio

Ana María Díaz Solorio

Agregando el Dark Mode

26/29
Recursos

¿Cómo implementar Dark Mode en Tailwind 2.0?

El Dark Mode es una de las funcionalidades más destacadas de Tailwind 2.0, y su implementación puede transformar completamente la apariencia de tus aplicaciones web. En este artículo, aprenderás a integrar el Dark Mode en tu proyecto utilizando la librería de Tailwind CSS, asegurando una apariencia moderna y atractiva tanto en modo claro como en oscuro. Veamos cómo se hace.

¿Cómo definir la configuración correcta para Dark Mode?

Para activar el Dark Mode en Tailwind 2.0, es crucial modificar la configuración predeterminada. Primero, dirígete al archivo de configuración de Tailwind y localiza la opción de Dark Mode, la cual está definida como false de manera predeterminada. Puedes configurarla para que funcione con media o class, pero aquí nos enfocaremos en la opción class para alternar entre el modo claro y oscuro.

// tailwind.config.js
module.exports = {
  darkMode: 'class', // Alternativa a 'media'
  theme: {
    // configuraciones adicionales
  }
}

¿Cómo aplicar estilos específicos para Dark Mode?

Una vez configurado, puedes aplicar estilos Dark Mode utilizando las clases de Tailwind. Los cambios principales involucran la definición de colores para el modo oscuro en el Figma, como grises más oscuros y variaciones de color personalizadas.

  1. Estilo del Body:
<body class="dark:bg-gray-900">
  <!-- contenido -->
</body>
  1. Estilo de la Navbar:
<nav class="dark:bg-gray-800 fixed z-10">
  <!-- contenido de la navbar -->
</nav>
  1. Cambios en los Elementos de Texto e Iconos:
<!-- Iconos y texto en modo oscuro -->
<div class="dark:text-white">
  <!-- contenido -->
</div>

¿Qué pasos seguir para integrar el cambio dinámico de modo?

La funcionalidad de cambio dinámico del modo entre claro y oscuro es posible mediante el uso de JavaScript para gestionar eventos de usuario. Veamos cómo integrarlo:

  1. Agregar event listener al botón toggle:
    Coloca un ID en tu botón de toggle en la barra de navegación.
<button id="toggle" class="p-2">
  <!-- Icono de la luna -->
</button>
  1. Programación del cambio con JavaScript:
document.addEventListener('DOMContentLoaded', () => {
  const htmlElement = document.querySelector('html');
  const toggleButton = document.getElementById('toggle');

  toggleButton.addEventListener('click', () => {
    htmlElement.classList.toggle('dark');
  });
});

¿Cómo asegurar la apariencia en dispositivos móviles?

Finalmente, verifica que el Dark Mode sea también funcional en dispositivos móviles. Para esto, incorpora revisiones visuales en múltiples tamaños de pantalla para asegurar que todos los estilos se aplican adecuadamente. Aquí se utiliza @media query dentro de CSS:

@media (prefers-color-scheme: dark) {
  .dark\:bg-gray-900 {
    background-color: #1a202c;
  }
}

Ahora tienes las herramientas para crear aplicaciones web responsivas y visualmente impresionantes que sean amigables para los ojos de los usuarios, incluso en condiciones de poca luz. ¡Sigue explorando y mejorando tus habilidades en Tailwind CSS y desarrollo frontend para destacar en tus proyectos!

Aportes 24

Preguntas 1

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

No se compliquen con las cards (tarjetas), en el archivo index.css o tailwind.css como sea lo hallan nombrado, definan un estilo para las tarjetas pares y otro para las impares.

.card:nth-child(odd) {
  @apply bg-secondary text-white dark:bg-gray-700;
}
.card:nth-child(even) {
  @apply bg-white text-tertiary dark:bg-gray-800 dark:text-gray-300;
}

Es más sencillo solo utilizando la función toggle del classlist. Con esto simplementa agregará o quitará la clase según sea el caso correspondiente, quedaría de la siguiente manera:

const htmlElement = document.querySelector("html");
const toggleButton = document.querySelector("#toggle");

toggleButton.addEventListener("click", () =>{
	htmlElement.classList.toggle('dark');
})

Pueden ahorrarse más definiciones de id’s (o clases si lo desean) si obtenemos todos los elementos que coinciden y les asignamos los eventos mediante un ciclo:

const htmlElement = document.querySelector('html');
const toggleButton = document.querySelectorAll('.toggle');
toggleButton.forEach( item => {
    item.addEventListener('click', () => {
        htmlElement.classList.toggle( 'dark' );
    });
});

Ahora, puedo asignar la clase (para mi caso) toggle en cualquier elemento que quiera darle el comportamiento y no tendré que escribir código adicional.

Para agregar el dark mode se debe configurar el archivo de configuración tailwind.config.js agregando la propiedad darkMode seguido de la palabra ‘class’ (importante hacer build al guardar cambios).

module.exports = {
  darkMode: 'class',
  // ...
}

En los elementos del sitio web se agrega la clase dark: seguido de la clase que tendrá el dark mode, por ejemplo:

<p class="text-3xl font-semibold text-primary dark:text-white">Recomendados</p>


Mi bloque de javacript en el archivo index.html:

    <script>
        const htmlElement = document.querySelector('html');
        const moonNav = document.querySelector('#moonNav');
        const moonTab = document.querySelector('#moonTab');
        const toggleButton = document.querySelector('#toggle');
        const toggleButtonSm = document.querySelector('#toggle-sm');

        toggleButton.addEventListener('click', toggleDarkMode);
        toggleButtonSm.addEventListener('click', toggleDarkMode);

        function toggleDarkMode() {
                htmlElement.classList.toggle('dark');
                moonNav.classList.toggle('dark');
                moonTab.classList.toggle('dark');
            }
    </script>

Otra forma de implementar el Dark Mode es utilizando Alpine.js

  • Primero agregamos el script de Alpine.js a nuestro index.html
 <script src="//unpkg.com/alpinejs" defer></script>
  • Luego agregamos el siguiente código a nuestra etiqueta html, que básicamente crea una variable que nos permitirá a partir de su valor asignar el valor de la clase dinámicamente.
<html lang="en" x-data="{dark:false}" x-bind:class="dark ? 'dark' : ''">
  • Para finalizar agregamos el siguiente código a nuestro botón de Dark Mode de modo que cada vez que hagamos click en el botón cambie el valor de la variable dark.
<button x-on:click="dark=!dark">
    <i class="fa-solid fa-moon"></i>
</button>

y eso seria todo ya tenemos nuestro Dark Mode 😀

Así vamos hasta ahora!

Estuve casi todo el curso sin poder usar los colores del framework, pero con esto ya me jaló:

/** @type {import('tailwindcss').Config} */

const colors = require('tailwindcss/colors');

module.exports = {
  content: [
    "./src/**/*.{html,js}", "./public/index.html",
  ],
  darkMode: 'class', // or 'media' or 'class'
  theme: {
    extend: {
    colors : {
      'primary':"#CC2D4A",
      'secondary':"#8FA206",
      'tertiary':"#61AEC9",
    },
    textColor:{
      'principal': '#CC2D4A',
      'secondary': '#8FA206',
      'tertiary': '#61AEC9',
    },
    fontFamily: {
      Montserrat: ["Montserrat", "sans-serif"],
    },
      backgroundImage: {
        'sanFrancisco': "url('../img/sanFrancisco.jpg')",
			  'sanFranciscoDesktop': "url('../img/sanFranciscoDesktop.jpg')",
			  'yosemite': "url('../img/yosemite.jpg')",
			  'LA': "url('../img/LA.jpg')",
			  'seattle': "url('../img/seattle.jpg')",
			  'new_york': "url('../img/new_york.jpg')",
			  'norway': "url('../img/norway.jpg')",
			  'sydney': "url('../img/sydney.jpg')",
			  'miami': "url('../img/miami.jpg')",
			  'switzerland': "url('../img/switzerland.jpg')",
			  'bali': "url('../img/bali.jpg')",
			  'norway': "url('../img/norway.jpg')",
			  'chicago': "url('../img/chicago.jpg')",
			  'europe': "url('../img/europe.jpg')",
			  'iceland': "url('../img/iceland.jpg')",
      },
    },
  },
  plugins: [    
    require('tailwind-scrollbar-hide')
  ],
}

Esta clase no me funcionó. No comprendo cual es la causa y en la parte donde “No funciona el darkmode, hay un corte y la profesora no explica cuales serían las causas del no funcionamiento”…venia bien, pero no esta funcionando.

Use el mismo código…

    const htmlElement = document.querySelector("html");
    const toggleButton = document.querySelector("#toggle");
    const toggleButtonSm = document.querySelector("#toggle-sm");
    const toggleDarkMode = () => {
      htmlElement.classList.toggle("dark");
    };
    toggleButton.addEventListener("click", toggleDarkMode);
    toggleButtonSm.addEventListener("click", toggleDarkMode);

Yo hice el **darkmode **más modular, cree un archivo “darkmode.js” y le meti el codigo, y luego en puse la ruta script src=/path/darkmode.js

Tengo entendido que es buena práctica 😊 apenas estoy iniciando como front

Para los que están usando NextJs les dejo una mejor forma de aplicar el darkMode.

https://www.youtube.com/watch?v=z2B3gRt2nj0

Me siento superado con mi codigo jajaja

const htmlElement = document.querySelector("html");
      const button = document.querySelectorAll(".buttonDark");
      button.forEach(el => el.addEventListener("click", cambiar));
      function cambiar(){
         htmlElement.classList.toggle("dark");
      }
Ese corte que hicieron en el video cuando presentaron el error en el script para controlar el dark mode con los botones, debió ser aclarado... Si leen los comentarios se darán cuenta que dejaron muchos estudiantes sin idea como resolver este error. Comunidad les dire como pude resolver este error. 1\. Eliminar la class="dark" del tag html. Recuerden que esto esta forzando el código. 2\. Crear los id en los botones. No necesitan utilizar # para esto. ejemplo: id="toggle". 3\. Mejorar la calidad del script. Pueden lograr el efecto esperado con menos lineas de código: ```js const TOGGLE_BUTTON = document.querySelector('#toggle'); const TOGGLE_BUTTON_MOBILE = document.querySelector('#toggle-mobile'); function toggleDarkMode() { document.documentElement.classList.toggle('dark'); } TOGGLE_BUTTON.addEventListener('click', toggleDarkMode); TOGGLE_BUTTON_MOBILE.addEventListener('click', toggleDarkMode); ```Suerte a todos !
Utilice localStorage para guardar la opcion de dark o light dependiendo de lo ultimo que selecciono el usuario, me quedo asi: ```js const toggleDark = document.querySelector('.toggleDark') const html = document.querySelector('html') if (localStorage.getItem('darkMode') === 'true') { localStorage.setItem('darkMode', 'true') toggleDark.classList.add('active') html.classList.add('dark') } else { localStorage.setItem('darkMode', 'false') toggleDark.classList.remove('active') html.classList.remove('dark') } const toggleDarkMode = () => { console.log(html.classList.contains('dark')) if (!html.classList.contains('dark')) { html.classList.add('dark') toggleDark.classList.add('active') localStorage.setItem('darkMode', 'true') } else { html.classList.remove('dark') toggleDark.classList.remove('active') localStorage.setItem('darkMode', 'false') } } toggleDark.addEventListener('click', toggleDarkMode) ```
Antes de ver el video, veo los comentarios y ya me asuste 😥

Otra forma de hacer que funcionen los botones es la siguiente:

const $html = document.getElementById('html')
const $buttonsDark = document.querySelectorAll('.toggleDark')

const handleDark = () => {
  $html.classList.toggle('dark')
}

$buttonsDark.forEach(btn => btn.addEventListener('click', handleDark))

He notado que las cards se ponen detrás del div de RECOMENDADOS y para solucionarlos agregue los siguientes atributos

class="inline-flex z-10"

donde

<div class="w-auto h-72 items-center mt-6 overflow-x-auto overscroll-x-contain flex space-x-6 overflow-y-hidden inline-flex z-10">

que es el padre de todas las cards

Hice mi implementacion del manejo del dark mode usando web components, ya que me parece mas ordenado y escalable, mi js queda asi:

class ThemeToggle extends HTMLElement {
  constructor() {
    super();

    this.init();
    this.addEventListener("click", this.toggle.bind(this));
  }

  init() {
    if (
      localStorage.theme === "dark" ||
      (!("theme" in localStorage) &&
        window.matchMedia("(prefers-color-scheme: dark)").matches)
    ) {
      document.documentElement.classList.add("dark");
    } else {
      document.documentElement.classList.remove("dark");
    }
  }

  toggle() {
    if (
      localStorage.theme === "dark" ||
      (!("theme" in localStorage) &&
        window.matchMedia("(prefers-color-scheme: dark)").matches)
    ) {
      localStorage.theme = "light";
    } else {
      localStorage.theme = "dark";
    }
  }
}

customElements.define("theme-toggle", ThemeToggle);

Y en el html simplemente envolvemos los switchs de tema en un elemento asi :

<theme-toggle></theme-toggle>
El dark mode no pudo conmigo 😎 **Versión mobile:** ![](https://static.platzi.com/media/user_upload/image-5f61ce0f-54f1-4ee5-892a-59688e5f8f5a.jpg) Aquí les dejo el repositorio con todo el proyecto 💚💚 Mucho éxito en este mundo tech <https://github.com/iamanyyeei/HelloTravel-Tailwind-CSS>
También se puede seleccionar todos los botones en una sola sentencia de la siguiente manera ```js const htmlElement = document.querySelector('html') const darkModeButton = document.querySelectorAll('.dark-mode-btn') darkModeButton.forEach((btn) => { btn.addEventListener('click', () => { htmlElement.classList.toggle('dark') }) }) ```
![](https://static.platzi.com/media/user_upload/mobile%20%286%29-689f6863-034a-463f-add9-1c4cfde416b9.jpg)![](https://static.platzi.com/media/user_upload/mobile%20%285%29-ab411289-3053-4633-9771-0ef0288a3b9e.jpg) Muchas formas de hacerlo, me encanta que asi sea. Yo busque una forma diferente a como lo hice antes, se puede hacer con alpinejs, antes lo hice con js pero cambiando el icono desde js, ahora camvio el icono en tailwind y js solo lo utilizo para hacer toogle

Interesante

Aquí les dejo link a mi project hecho en Reactjs
https://github.com/raycris/travel/tree/master

“Perfectísimo” jaja me encanta 😄