Crea la aplicación de una casa inteligente con TailwindCSS (parte 1)

Curso Básico de Tailwind 2 y 3

Toma las primeras clases gratis

COMPARTE ESTE ARTÍCULO Y MUESTRA LO QUE APRENDISTE

¡Te doy la bienvenida a un nuevo reto de CSS! Esta vez desarrollaremos la aplicación de una casa inteligente con TailwindCSS.

Compártenos el resultado final en los comentarios y/o en Twitter con el hashtag #RetosPlatziCSS. 😉

Platzi Tailwind CSS

Antes de comenzar, los cursos de Platzi que te recomiendo para realizar este reto son los siguientes:

Recuerda que en la segunda parte de este reto haremos las animaciones de esta casa inteligente: Animaciones con TailwindCSS.

Paso 0: planeación

Para este reto te propongo que realices los siguientes 8 pasos:

  1. Revisión del diseño e identificación de elementos
  2. Creación del proyecto e instalación de Tailwind
  3. Maquetación del layout principal
  4. Maquetación del modal: Estructura principal
  5. Maquetación del modal: Título y subtítulo
  6. Maquetación del modal: Plano y contenedor de cards
  7. Maquetación del modal: Cards
  8. ¡Compártenos tu resultado en los comentarios!

💡 Recomendación: Evita copiar y pegar el código. Trata de transcribir cada detalle y entender muy bien su funcionamiento (Sin afán, tómate tu tiempo). Solo de esta forma podrás convertirte en un(a) experto(a) en maquetación con CSS.

ʕ•́ᴥ•̀ʔっ ¡Empecemos!

Paso 1: Revisión del diseño e identificación de elementos

Lo primero que debemos hacer (antes de comenzar a escribir código) es tener una comprensión general del diseño y de los elementos. Para lograrlo puedes dividir el diseño en mini estructuras y darles un nombre para que te sirva de guía más adelante.

En nuestro caso, la división del diseño en mini estructuras a nivel general quedaría de la siguiente forma:

Casa inteligente CSS

💡 Esta división no tiene que ser algo muy elaborado, simplemente es una guía para identificar visualmente los elementos y saber por donde arrancar.

Normalmente comenzamos con la maquetación de los elementos más grandes (como layouts y contenedores) y luego se abordan los elementos más pequeños (como botones, íconos, textos, etc). Además de facilitar muchísimo la maquetación de sitios web, esto también permite que nuestro código sea escalable a futuro.

Lo que te propongo, teniendo en cuenta lo anterior, es comenzar creando la maquetación de afuera hacia adentro, es decir, primero el layout (el componente principal que va a contener el modal), luego el contenedor del modal y luego los elementos dentro del modal. Así organizaremos bien nuestras estructuras de HTML y también se nos facilitará muchísimo trabajar con la versión del diseño en mobile.

Paso 2: Creación del proyecto e instalación de TailwindCSS

La maquetación de nuestra aplicación inteligente la haremos con TailwindCSS, un framework de CSS que nos brinda una gran cantidad de clases de CSS para poder hacer nuestros sitios web de una forma mucho más rápida. Esto quiere decir que no tendemos que escribir código CSS (solo en algunos casos), sino únicamente añadir las clases de CSS que Tailwind ya tiene disponibles a nuestro HTML y listo.

Para comenzar a trabajar con TailwindCSS debemos seguir algunos pasos para su instalación. Para ello, te recomiendo tomar la clase sobre Creación del proyecto e instalación de Tailwind del Curso Básico de Tailwind donde nuestra profe Ana nos enseña paso a paso cómo realizar esta configuración. También pueds seguir los pasos de instalación de la documentación oficial de TailwindCSS.

💡 Si solamente quieres explorar TailwindCSS y saber cómo funciona, te recomiendo utilizar Tailwind Play, una herramienta que te permite usar TailwindCSS de forma online.

Una vez tengas toda la configuración lista, podemos comenzar con la maquetación de nuestra aplicación.

Paso 3: Maquetación del layout principal

Antes de comenzar con la maquetación del layout principal, revisemos cómo sería el resultado final que queremos conseguir tanto en desktop como en mobile:

Layout CSS Platzi

Para construir este layout hagamos una lista de lo que necesitamos hacer junto con las propiedades y valores que nos permitirían lograr eso que necesitamos:

Lo que necesitamos Propiedad(es) y valor(es) para lograrlo
Centrar vertical y horizontalmente el modal en un futuro display: grid y place-items: center
Tener una imagen de fondo background-image: url('../image.png')
Centrar la imagen de fondo background-position: center
Hacer que la imagen ocupe todo el tamaño disponible sin dañar sus proporciones background-size: cover
Añadir un espacio entre él y el modal del futuro en mobile padding: 2rem
Quitar el espacio entre el layout y el modal en desktop padding: 0 dentro de un media query como @media (min-width: 1024px)
Evitar que al añadir el espacio entre él y el modal no aumente las dimensiones del layout y nos genere scoll horizontal y vertical box-sizing: border-box
Darle un ancho del 100% width: 100%
Darle un alto mínimo que tenga el mismo alto de la pantalla del usuario min-height: 100vh

Una vez conocemos cuáles son las propiedades que nos ayudarán a conseguir el resultado que necesitamos en nuestro layout principal, debemos hacer una analogía entre esas propiedades y valores vs. las clases de CSS que TailwindCSS nos provee.

Por ejemplo, si quiero usar padding: 2rem, lo ideal es que no escribamos esto en CSS (es decir, que no tengamos un archivo de estilos en donde tengamos que poner div { padding: 2rem }) sino que busquemos en la documentación de TailwindCSS, cuál sería la clase equivalente a padding: 2rem para poder añadirla en nuestro HMTL.

Teniendo en cuenta lo anterior, aquí te comparto una tabla en donde tenemos las propiedades y valores al lado izquierdo, y las clases de TailwindCSS correspondientes al lado derecho:

Propiedades y valores en CSS Clase en TailwindCSS
display: grid grid
place-items: center place-items-center
background-position: center bg-center
background-size: cover bg-cover
box-sizing: border-box box-border
min-height: 100vh min-h-screen
width: 100% w-full
padding: 2rem p-8
@media (min-width: 1024px) { padding: 0 } lg:p-0

Ya que sabemos cuáles son las clases de TailwindCSS que necesitamos, debemos añadirlas a nuestro HTML así:

<div class="grid place-items-center bg-plant bg-center bg-cover box-border min-h-screen w-full p-8 lg:p-0">
    <!-- Aquí va el modal -->
</div>

Para este caso, lo único que nos hace falta es la imagen de fondo de la clase bg-plant. Para ello, debemos modificar la configuración de TailwindCSS (ya que es una imagen que no provee TailwindCSS por defecto) para añadir una clase propia (custom), así:

module.exports = {
  content: ['./public/index.html', './src/**/*.{html,js}'],
  theme: {
      extend: {
        backgroundImage: {
          'plant': "url('https://images.pexels.com/photos/916339/pexels-photo-916339.jpeg?auto=compress&cs=tinysrgb&dpr=2&h=750&w=1260')",
        }
      }
  },
  plugins: [],
}

La imagen de la planta la tomé de Pexels.

Y para decirle a nuestro body que no tenga margin y que tenga la fuente Popins podemos añadir CSS así:

@import url('https://fonts.googleapis.com/css2?family=Poppins:wght@300;500&display=swap');

body {
  margin: 0;
  font-family: 'Poppins', sans-serif;
}

También podemos agregar la clase m-0 en la etiqueta body y añadir la fuente a la configuración de TailwindCSS. 😉

Paso 4: Maquetación del modal: Estructura principal

Revisemos cómo sería el resultado final que queremos conseguir tanto en desktop como en mobile:

3

Hagamos nuevamente una lista de lo que necesitamos hacer junto con las propiedades y valores que nos permitirían lograr eso que necesitamos:

Lo que necesitamos Propiedad(es) y valor(es) para lograrlo
Ubicar los elementos futuros (textos y contenedor del plano y cards) de forma vertical display: flex y flex-direction: column
Añadir un espacio entre el modal y el contenedor de los elementos del futuro padding: 2rem
Quitar el espacio entre el modal y el contenedor en mobile ya que el espacio es más pequeño padding: 0 dentro de un media query como @media (min-width: 1024px)
Evitar que al añadir el espacio entre el modal y el contenedor no aumente las dimensiones del layout y nos genere scoll horizontal y vertical box-sizing: border-box
Darle un ancho máximo de 1024px max-width: 1024px
Darle un ancho del 100% del tamaño del contenedor en desktop width: 100%
Darle un ancho de un poco más de la mitad del tamaño del contenedor en mobile width: 66.666667%

Teniendo en cuenta lo anterior, aquí te comparto una tabla en donde tenemos las propiedades y valores al lado izquierdo, y las clases de TailwindCSS correspondientes al lado derecho:

Propiedades y valores en CSS Clase en TailwindCSS
display: flex flex
flex-direction: column flex-col
padding: 2rem p-8
@media (min-width: 1024px) { padding: 4rem } lg:p-16
box-sizing: border-box box-border
max-width: 1024px max-w-screen-lg
width: 100% w-full
width: 66.666667% w-8/12

Ya que sabemos cuáles son las clases de TailwindCSS que necesitamos, debemos añadirlas a nuestro HTML así:

<div class="glassmorphism flex flex-col p-8 lg:p-16 box-border max-w-screen-lg w-full lg:w-8/12">
    <!-- Aquí van los elementos del modal -->
</div>

Nuestro anterior HTML junto con el HTML del layout principal, se vería de la siguiente manera:

<div class="grid place-items-center bg-plant bg-center bg-cover box-border min-h-screen w-full p-8 lg:p-0">
    <div class="glassmorphism flex flex-col p-8 lg:p-16 box-border max-w-screen-lg w-full lg:w-8/12">
        <!-- Aquí van los elementos del modal -->
    </div>
</div>

Como puedes notar, hay una clase de CSS llamada glassmorphism que no corresponde a TailwindCSS, sino que la creamos nosotros para añadir el efecto de vidrio al modal.

Este efecto de vidrio lo podemos conseguir con el generador de efecto glassmorphism en donde puedes cambiar el valor del blur y la transparencia hasta lograr el efecto que más te guste.

En mi caso, usé los valores por defecto del generador, así:

.glassmorphism {
  background: rgba( 255, 255, 255, 0.25 );
  box-shadow: 0 8px 32px 0 rgba( 31, 38, 135, 0.37 );
  backdrop-filter: blur( 4px );
  -webkit-backdrop-filter: blur( 4px );
  border-radius: 10px;
  border: 1px solid rgba( 255, 255, 255, 0.18 );
}

En este tutorial puedes aprender un poco más sobre el efecto Glassmorphism con CSS: # Crea tu planeador semanal con CSS Grid, Flexbox y Glassmorphism 💪

Paso 5: Maquetación del modal: Título y subtítulo

Revisemos el resultado final:

4

Hagamos una lista de lo que necesitamos hacer junto con las propiedades y valores que nos permitirían construir el primer texto:

Lo que necesitamos Propiedad(es) y valor(es) para lograrlo
Un tamaño de fuente de 1rem en mobile font-size: 1rem
Un tamaño de fuente de 1.25rem en dekstop font-size: 1.25rem dentro de un media query como @media (min-width: 1024px) { ... }
Quitarle la márgen superior que tienen los párrafos por defecto margin-top: 0px
Darle un espacio entre él y el texto de abajo margin-bottom: 0.5rem
Centrar el texto text-align: center

Teniendo en cuenta lo anterior, aquí te comparto una tabla en donde tenemos las propiedades y valores al lado izquierdo, y las clases de TailwindCSS correspondientes al lado derecho:

Propiedades y valores en CSS Clase en TailwindCSS
font-size: 1rem; line-height: 1.5rem text-base
@media (min-width: 1024px) { … } lg:
font-size: 1.25rem; line-height: 1.75rem; text-xl
margin-top: 0px mt-0
margin-bottom: 0.5rem mb-2
text-align: center text-center

Ya que sabemos cuáles son las clases de TailwindCSS que necesitamos, debemos añadirlas a nuestro HTML así:

<p class="text-base lg:text-xl mt-0 mb-2 text-center">You are controlling</p>

Para construir el segundo texto, hagamos otra lista de lo que necesitamos hacer junto con las propiedades y valores que nos permitirían lograr eso que necesitamos:

Lo que necesitamos Propiedad(es) y valor(es) para lograrlo
Un tamaño de fuente de 1.5rem en mobile font-size: 1.5rem
Un tamaño de fuente de 2.25rem en desktop font-size: 2.25rem dentro de un media query como @media (min-width: 1024px) { ... }
Quitarle la márgen superior que tienen los títulos por defecto margin-top: 0px
Centrar el texto text-align: center
Darle un grosor al texto font-weight: 700

Teniendo en cuenta lo anterior, aquí te comparto una tabla en donde tenemos las propiedades y valores al lado izquierdo, y las clases de TailwindCSS correspondientes al lado derecho:

Propiedades y valores en CSS Clase en TailwindCSS
font-size: 1.5rem; line-height: 2rem text-2xl
@media (min-width: 1024px) { … } lg:
font-size: 2.25rem; line-height: 2.5rem text-4xl
margin-top: 0px mt-0
text-align: center text-center
font-weight: 700 font-bold

Ya que sabemos cuáles son las clases de TailwindCSS que necesitamos, debemos añadirlas a nuestro HTML así:

<h1 class="text-2xl lg:text-4xl m-0 text-center font-bold">Main Lounge & Dining Room</h1>

Nuestro anterior HTML junto con el HTML de los pasos anteriores se vería de la siguiente forma:

<div class="grid place-items-center bg-plant bg-center bg-cover box-border min-h-screen w-full p-8 lg:p-0">
    <div class="glassmorphism flex flex-col p-8 lg:p-16 box-border max-w-screen-lg w-full lg:w-8/12">
        <p class="text-base lg:text-xl mt-0 mb-2 text-center">You are controlling</p>
        <h1 class="text-2xl lg:text-4xl m-0 text-center font-bold">Main Lounge & Dining Room</h1>
        <!-- Aquí va el plano y el contenedor de las cards -->
    </div>
</div>

Paso 6: Maquetación del modal: Plano y contenedor de cards

Antes de comenzar con la maquetación del plano y el contenedor de las cards, revisemos cómo sería el resultado final que queremos conseguir tanto en desktop como en mobile:

5

Para construir el contenedor del plano y el contenedor de las cards, hagamos una lista de lo que necesitamos hacer junto con las propiedades y… sí, ya lo sabes 😅… véamos cómo queda:

Lo que necesitamos Propiedad(es) y valor(es) para lograrlo
Ubicar los elementos futuros (plano y contenedor de las cards) de forma horizontal en desktop display: flex y flex-direction: row dentro de un media query como @media (min-width: 1024px) { ... }
Ubicar los elementos futuros (plano y contenedor de las cards) de forma vertical en mobile display: flex y flex-direction: column
Espacio entre los hijos gap: 1.25rem
Centrado de los hijos vertical y horizontalmente justify-content: center y align-items: center
Darle un ancho del 100% del tamaño del contenedor width: 100%
Darle un espacio superior de 2rem en mobile margin-top: 2rem
Darle un espacio superior de 4rem en desktop margin-top: 4rem dentro de un media query como @media (min-width: 1024px) { ... }
Darle un espacio inferior de 0px en mobile margin-bottom: 0
Darle un espacio inferior de 4rem en desktop margin-bottom: 4rem dentro de un media query como @media (min-width: 1024px) { ... }

Teniendo en cuenta lo anterior, aquí te comparto una tabla en donde tenemos las propiedades y valores al lado izquierdo, y las clases de TailwindCSS correspondientes al lado derecho:

Propiedades y valores en CSS Clase en TailwindCSS
display: flex flex
flex-direction: column flex-col
@media (min-width: 1024px) { … } lg:
flex-direction: row flex-row
gap: 1.25rem gap-5
justify-content: center justify-center
align-items: center items-center
width: 100% w-full
margin-top: 2rem mt-8
margin-top: 4rem mt-16
margin-bottom: 0px mb-0
margin-top: 4rem; margin-bottom: 4rem my-16

Ya que sabemos cuáles son las clases de TailwindCSS que necesitamos, debemos añadirlas a nuestro HTML así:

<div class="flex flex-col lg:flex-row lg:gap-5 justify-center items-center w-full mt-8 lg:mt-16 mb-0 lg:my-16">
    <!-- Aquí va el plano y el contenedor de las cards -->
</div>

Veamos ahora la lista para construir el contenedor del plano:

Lo que necesitamos Propiedad(es) y valor(es) para lograrlo
Centrar vertical y horizontalmente el plano display: grid y place-items: center
Darle un ancho del 100% en mobile w-full
Darle un ancho del 66.666667% en desktop para que las cards ocupen el ancho restante w-4/6 dentro de un media query como @media (min-width: 1024px) { ... }

Las propiedades y las clases de TailwindCSS correspondientes:

Propiedades y valores en CSS Clase en TailwindCSS
display: grid grid
place-items: center place-items-center
width: 100% w-full
@media (min-width: 1024px) { … } lg:
width: 66.666667% w-4/6

Y las añadimos a la estructura HTML:

<div class="grid place-items-center w-full lg:w-4/6">
    <img class="w-full'" src="https://i.ibb.co/09fmVRK/plan.png" alt="plan">
</div>

Vamos ahora con el contenedor de las cards:

Lo que necesitamos Propiedad(es) y valor(es) para lograrlo
Centrar vertical y horizontalmente el plano display: grid y place-items: center
Darle un ancho del 100% en mobile w-full
Darle un ancho del 33.333333% en desktop (medida que se obtiene de restar el 100% del total menos el 66.66% del contenedor del plano) w-2/6 dentro de un media query como @media (min-width: 1024px) { ... }
Darle un espacio superior de 2rem en mobile margin-top: 2rem
Darle un espacio superior de 0px en desktop margin-top: 0 dentro de un media query como @media (min-width: 1024px) { ... }

Clases de TailwindCSS:

Propiedades y valores en CSS Clase en TailwindCSS
display: grid grid
place-items: center place-items-center
width: 100% w-full
@media (min-width: 1024px) { … } lg:
width: 33.333333% w-2/6
margin-top: 2rem mt-8
margin-top: 0 mt-0

HTML:

<div class="controls grid place-items-center w-full lg:w-2/6 mt-8 lg:mt-0">
    <!-- Aquí va el contenedor interno de las cards -->
</div>

¡Muy bien! Ahora el contenedor interno de las cards (sí, otro contenedor, recuerda la revisión e identificación de elementos que hicimos al principio):

Lo que necesitamos Propiedad(es) y valor(es) para lograrlo
Crear 2 columnas del mismo tamaño con espaciado en mobile y desktop display: grid, grid-template-columns: repeat(2, minmax(0, 1fr)) y gap: 1.25rem por fuera y por dentro de un media query como @media (min-width: 1024px) { ... }
Crear 4 columnas del mismo tamaño con espaciado en tablet display: grid, grid-template-columns: repeat(4, minmax(0, 1fr)) y gap: 1.25rem por dentro de un media query como @media (min-width: 768px) { ... }
Crear 2 filas del mismo tamaño con espaciado en mobile y desktop display: grid, grid-template-rows: repeat(2, minmax(0, 1fr)) y gap: 1.25rem por fuera y por dentro de un media query como @media (min-width: 1024px) { ... }
Crear 1 fila con espaciado en tablet display: grid, grid-template-row: repeat(1, minmax(0, 1fr)) y gap: 1.25rem por dentro de un media query como @media (min-width: 768px) { ... }
Darle un ancho máximo de 1024px max-width: 1024px
Darle un ancho del 100% en mobile w-full

Clases de TailwindCSS correspondientes:

Propiedades y valores en CSS Clase en TailwindCSS
display: grid grid
gap: 1.25rem gap-5
grid-template-columns: repeat(2, minmax(0, 1fr)) grid-cols-2
grid-template-columns: repeat(4, minmax(0, 1fr)) grid-cols-4
grid-template-rows: repeat(1, minmax(0, 1fr)) grid-rows-1
grid-template-rows: repeat(2, minmax(0, 1fr)) grid-rows-2
@media (min-width: 1024px) { … } lg:
@media (min-width: 768px) { … } md:
max-width: 1024px max-w-screen-lg
width: 100% w-full

Y añadimos las clases al HTML:

<div class="controls grid gap-5 grid-cols-2 md:grid-cols-4 lg:grid-cols-2 grid-rows-2 md:grid-rows-1 lg:grid-rows-2 max-w-full w-full">
    <!-- Aquí van las cards -->
</div>

La imagen del plano la tomé de Habitat Pod.

Y, para añadirle unos estilos adicionales para el responsive especialmente, escribimos el siguiente CSS:

.controls {
  min-height: 300px;
}

.controls img {
  margin: 0.5rem;
}

@media (max-width: 1024px) {
  .controls {
    width: 100%;
    min-height: 100px;
  }
}

@media (max-width: 767px) {
  .controls {
    max-width: 300px;
    min-height: 200px;
  }
}

Todo el HTML de este paso se vería de la siguiente forma:

<div class="flex flex-col lg:flex-row lg:gap-5 justify-center items-center w-full mt-8 lg:mt-16 mb-0 lg:my-16">
    <div class="grid place-items-center w-full lg:w-4/6">
        <img class="w-full'" src="https://i.ibb.co/09fmVRK/plan.png" alt="plan">
    </div>
    <div class="controls grid place-items-center w-full lg:w-2/6 mt-8 lg:mt-0">
        <div class="controls grid gap-5 grid-cols-2 md:grid-cols-4 lg:grid-cols-2 grid-rows-2 md:grid-rows-1 lg:grid-rows-2 max-w-full w-full">
            <!-- Aquí van las cards -->
        </div>
    </div>
</div>

Paso 7: Maquetación del modal: Cards

Antes de comenzar con la maquetación de las cards, revisemos cómo sería el resultado final que queremos conseguir tanto en desktop como en mobile:

1

Para construir el contenedor principal de las cards, hagamos una lista de lo que necesitamos hacer junto con las propiedades y valores que nos permitirían lograr eso que necesitamos:

Lo que necesitamos Propiedad(es) y valor(es) para lograrlo
Posicionamiento relativo para que el input absoluto se adhiera a él position: relative
Centrar vertical y horizontalmente los elementos internos display: grid y place-items: center
Evitar que se aumenten las dimensiones de la card box-sizing: border-box
Darle un ancho del 100% w-full
Darle un alto del 100% h-full
Aplicarle un estilo al mouse para indicar que la card es clickeable cursor: pointer

Teniendo en cuenta lo anterior, aquí te comparto una tabla en donde tenemos las propiedades y valores al lado izquierdo, y las clases de TailwindCSS correspondientes al lado derecho:

Propiedades y valores en CSS Clase en TailwindCSS
position: relative relative
display: grid grid
place-items: center place-items-center
box-sizing: border-box box-border
width: 100% w-full
height: 100% w-full
cursor: pointer cursor-pointer

Ya que sabemos cuáles son las clases de TailwindCSS que necesitamos, debemos añadirlas a nuestro HTML así:

<div class="glassmorphism relative grid place-items-center py-3 box-border w-full h-full cursor-pointer">
   <!-- Aquí van los elementos de la card -->
</div>

Para añadir el texto a la card, hagamos una lista de lo que necesitamos hacer junto con las propiedades y valores que nos permitirían lograr eso que necesitamos:

Lo que necesitamos Propiedad(es) y valor(es) para lograrlo
Remover las márgenes por defecto margin: 0px
Darle un tamaño de 0.875rem font-size: 0.875rem

Teniendo en cuenta lo anterior, aquí te comparto una tabla en donde tenemos las propiedades y valores al lado izquierdo, y las clases de TailwindCSS correspondientes al lado derecho:

Propiedades y valores en CSS Clase en TailwindCSS
margin: 0px m-0
font-size: 0.875rem; line-height: 1.25rem text-sm

Ya que sabemos cuáles son las clases de TailwindCSS que necesitamos, debemos añadirlas a nuestro HTML así:

<p class="m-0 text-sm">Lights</p>

Para añadir el ícono a la card:

Lo que necesitamos Propiedad(es) y valor(es) para lograrlo
Un ancho de 2rem width: 2rem
Añadirle un espaciado de 0.5rem margin: 0.5rem

Teniendo en cuenta lo anterior, aquí te comparto una tabla en donde tenemos las propiedades y valores al lado izquierdo, y las clases de TailwindCSS correspondientes al lado derecho:

Propiedades y valores en CSS Clase en TailwindCSS
width: 2rem w-8
margin: 0.5rem m-2

Y ya que sabemos cuáles son las clases de TailwindCSS que necesitamos, debemos añadirlas a nuestro HTML:

<img class="w-8 m-2" src="https://img.icons8.com/pastel-glyph/64/000000/light--v1.png"/>

El ícono lo tomé de icons8.

Para añadir el toggle button a la card tenemos una lista enorme de las propiedades que necesitamos. Lo mejor de todo es que en este reto sobre Dark Mode con Animaciones en CSS y JavaScript escribimos todo el paso a paso para que puedas crear este toggle button como todo(a) un(a) experto(a).

Propiedades y valores en CSS Clase en TailwindCSS
position: absolute absolute
width: 100% w-full
height: 100% w-full
opacity: 0 opacity-0
display: flex flex
align-items: center items-center
background-color: rgb(156 163 175) bg-gray-400
height: 1.5rem h-6
width: 3rem w-12
border-radius: 9999px rounded-full
background-color: rgb(255 255 255) bg-white
margin: 0.25rem m-1
height: 1.25rem h-5
width: 1.25rem w-5

Ya que sabemos cuáles son las clases de TailwindCSS que necesitamos, debemos añadirlas a nuestro HTML así:

<input id="lights-toggle-button" type="checkbox" class="absolute w-full h-full opacity-0">
<label for="lights-toggle-button" class="flex items-center bg-gray-400 h-6 w-12 rounded-full">
    <div class="toggle-dot bg-white m-1 h-5 w-5 rounded-full"></div>
</label>

Y el CSS correspondiente sería:

#lights-toggle-button:checked + label {
  background-color: MediumSpringGreen;
}

label .toggle-dot {
  transition: transform 0.3s ease;
}

#lights-toggle-button:checked + label .toggle-dot {
  transform: translateX(1.3rem);
}

Más colores nativos de CSS aquí.

Antes de terminar, añadimos el JavaScript correspondiente que también aprendimos en el reto sobre Dark Mode con Animaciones en CSS y JavaScript:

const lightsToggleButton = document.getElementById('lights-toggle-button')

function addDarkStyle (toggleButton) {
    toggleButton.addEventListener('change', () => {
      document.body.classList.toggle('dark')
    })
}

addDarkStyle(lightsToggleButton)

Finalmente el HTML de toda nuestra card quedaría de la siguiente forma:

<div class="glassmorphism relative grid place-items-center py-3 box-border w-full h-full cursor-pointer">
    <p class="m-0 text-sm">Lights</p>
    <img class="w-8 m-2" src="https://img.icons8.com/pastel-glyph/64/000000/light--v1.png"/>
    <input id="lights-toggle-button" type="checkbox" class="absolute w-full h-full opacity-0">
    <label for="lights-toggle-button" class="flex items-center bg-gray-400 h-6 w-12 rounded-full">
    <div class="toggle-dot bg-white m-1 h-5 w-5 rounded-full"></div>
    </label>
</div>

Paso 8: ¡Compártenos tu resultado en los comentarios!

¡Este paso es mi favorito! Compártenos en los comentarios y/o en Twitter con el hashtag #RetosPlatziCSS el resultado final de la aplicación de una casa inteligente con TailwindCSS. 😄

Aquí te comparto:

No olvides que puedes encontrar la segunda parte de este reto en: Animaciones con TailwindCSS.

Cuéntanos qué otro tipo de retos te gustaría encontrar en esta sección.

#NuncaParesDeAprender

Curso Básico de Tailwind 2 y 3

Toma las primeras clases gratis

COMPARTE ESTE ARTÍCULO Y MUESTRA LO QUE APRENDISTE

0 Comentarios

para escribir tu comentario

Artículos relacionados