Jose Luis Bedoya
Platzi Team
Los estilos en React son fundamentales para crear interfaces atractivas y profesionales. Dominar las diferentes técnicas para implementar CSS en tus aplicaciones React te permitirá desarrollar componentes más mantenibles y escalables. En este contenido exploraremos tres métodos principales para agregar estilos a nuestras aplicaciones React, analizando sus ventajas y desventajas para que puedas elegir la mejor opción según las necesidades de tu proyecto.
¿Cómo implementar estilos globales con CSS en React?
Los estilos globales con CSS son la forma más básica y tradicional de estilizar componentes en React. Si ya tienes experiencia con HTML y CSS, esta aproximación te resultará familiar.
Para implementar estilos globales con CSS:
styles.css)Este método es ideal para proyectos pequeños debido a su simplicidad. Sin embargo, presenta limitaciones importantes cuando tu aplicación comienza a crecer:
Veamos un ejemplo práctico de implementación:
// En cart.jsx import './styles.css'; const Cart = () => { return ( <div className="cart"> Soy una carta </div> ); }; export default Cart; /* En styles.css */ .cart { padding: 20px; margin: 10px; background-color: pink; }
Es importante notar que en React usamos className en lugar de class como atributo para asignar clases CSS, ya que class es una palabra reservada en JavaScript.
¿Qué son los módulos CSS y cómo nos ayudan a modularizar estilos?
Los módulos CSS son una solución elegante para el problema de la colisión de nombres de clases en aplicaciones React más grandes. Esta técnica permite encapsular los estilos de cada componente, generando nombres de clase únicos automáticamente.
Para implementar módulos CSS:
Crea un archivo con la extensión .module.css (por ejemplo, Cart.module.css)
Define tus estilos usando selectores de clase normales
Importa el módulo en tu componente y utiliza las clases como propiedades del objeto importado
// En cart.jsx import styles from './Cart.module.css';
const Cart = () => { return ( <div className={styles.cart}> Soy una carta </div> ); };
export default Cart;
/* En Cart.module.css */ .cart { padding: 20px; margin: 10px; background-color: lightblue; }
Al inspeccionar el elemento en el navegador, notarás que React ha generado un nombre de clase único con un identificador, como cart_a1b2c3. Esta es la principal ventaja de los módulos CSS: evitan conflictos de nombres entre componentes, permitiéndote usar nombres de clase simples y descriptivos sin preocuparte por colisiones.
¿Cómo podemos mejorar nuestros estilos con Sass en React?
Sass (Syntactically Awesome Style Sheets) es un preprocesador CSS que extiende las capacidades del CSS tradicional, permitiéndonos usar:
Para implementar Sass en React:
npm install sass.module.scss o .module.sassSass ofrece dos sintaxis diferentes:
Ejemplo con SCSS:
// En cart.jsx import styles from './Cart.module.scss'; const Cart = () => { return ( <div className={styles.cart}> Soy una carta </div> ); }; export default Cart; /* En Cart.module.scss */ $primary: lightblue; .cart { padding: 20px; margin: 10px; background-color: $primary; }
Ejemplo con Sass:
// En Cart.module.sass $primary: lightblue .cart padding: 20px margin: 10px background-color: $primary
La principal ventaja de usar Sass es la capacidad de organizar mejor tus estilos con variables, mixins y otras características que hacen tu código más mantenible y reutilizable.
¿Cuál método de estilizado elegir para tu proyecto React?
La elección del método depende principalmente del tamaño y complejidad de tu proyecto:
Recomendación: Para la mayoría de los proyectos profesionales, los módulos CSS o Sass son la mejor opción, ya que proporcionan encapsulación y evitan conflictos de nombres, facilitando el mantenimiento a largo plazo.
Los estilos son una parte fundamental del desarrollo frontend con React. Dominar estas técnicas te permitirá crear interfaces de usuario más atractivas y mantenibles. ¿Has probado alguna de estas técnicas en tus proyectos? ¿Cuál prefieres y por qué? Comparte tus experiencias en los comentarios.
Jose Luis Bedoya
Platzi Team
Kevin Alfonso Olivella Felizzola
Cristian Mora
Jessica Silvia Payano Castro
Moises Hernandez
Paula Andrea Beltrán Salazar
Aloy Foxy
Johan Moises Ariza Mahecha
Jesus Bustamante
Victor Manuel Polo Ruedas
Jesus Bustamante
Jose Luis Bedoya
Jesús Manuel Alarcón Maldonado
Diego Frank Lipa Choque
Carlos Naveda
Karen Cortes
Paola Sofía Mendoza
Jorge Luis Garza Gutierrez
Ulises Rodríguez Candela
Melissa Monroy Moreno
Anthony Utrera
Joan Casanovas Salvatella
Rey Ángeles
Nicolas Alejandro Baak Poot
una ventaja muy grande de sass, es que al ser un pre procesador, se compila! Lo que hace que no ocupe espacio en el bundle de tu aplicación web, no interfiere en el rendimiento!
SI
Mi solución al reto...
Asi quedo mi card:
Poco pero trabajo honesto.
Jajaja hace tiempo no estilaba en CSS
Me acostumbré a hacerlo con Tailwind, pero no he perdido práctica 😅
Amo diseñar interfaces así que la mía quedo así, quise volver a repetir una vieja versión que hice con Tailwind
Comparto mi solución al reto haciendo uso de props
Card.jsx
import styles from "./Card.module.scss" const Card = ({title, content, image}) => { return( <> <div className={styles.card}> <img src={image} alt="" className={styles.image}/> <div className={styles.title}>{title}</div> <div className={styles.content}>{content}</div> </div> </> ) } export default Card ```**Card.module.scss** ```js .card { background-color: #fff; border-radius: 12px; box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); padding: 16px; max-width: 300px; text-align: center; transition: transform 0.2s ease-in-out; color: #000; &:hover { transform: scale(1.05); } } .title { font-size: 1.2rem; font-weight: bold; margin-bottom: 8px; color: inherit; } .content { font-size: 1rem; color: #444; } .image{ width: 100%; height: 150px; object-fit: cover; border-radius: 12px 12px 0 0; }
App.jsx
import Card from './components/Card/Card' function App() { let information = "Lorem ipsum, dolor sit amet consectetur adipisicing elit. Corrupti, quo repellendus, quasi nesciunt magnam tenetur quaerat eveniet illo minus hic libero soluta. Voluptatem quibusdam possimus nihil quis ipsum repudiandae explicabo!" const urlImage = "https://images.unsplash.com/photo-1742147550712-9c25dc0832aa?q=80&w=1991&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" return ( <> <Card title="Titulo" content={information} image={urlImage}></Card> </> ) } export default App
Wow como lo hiciste ?
// Card.jsx import styles from "./Card.module.scss" import spider from "../../assets/img/spider-man.png" import logo from "../../assets/img/logo-spider-man.png" export const Card = ({ nombre, estatura, edad }) => { return ( <div> <div> <span>{nombre}</span> </div> <img src="{spider}" alt="Spider man"> <div> <div> <span>{estatura}</span> </div> <div> <img src="{logo}" alt=""> </div> <div> <span>{edad}</span> </div> </div> </div> ) }
// App.jsx import { Card } from "./componentes/Card/Card" import { Button } from "./componentes/Button/Button" import styles from "../src/componentes/Card/Card.module.scss" function App() { const info = [ { nombre: 'Spider-Man1', estatura: '1.75 cm', edad: '18 años' }, { nombre: 'Spider-Man2', estatura: '1.75 cm', edad: '18 años' }, { nombre: 'Spider-Man3', estatura: '1.75 cm', edad: '18 años' }, ] return ( <> <div> {info.map((card, index) => ( <Card key={index} nombre={card.nombre} estatura={card.estatura} edad={card.edad} /> ))} </div> <Button><p>Gris</p></Button> <Button blue ><p>Azul</p></Button> ) } export default App
// Card.module.scss $primary: pink; $fondo-card: #131517; $borde-card: #33343c; $bottom-color: #421d22; .cards_wrapper { position: absolute; top: 0; left: 0; width: 100%; min-height: 100vh; display: flex; justify-content: space-around; align-items: center; } .card { width: 18%; height: 60vh; border-radius: 1vw; border: 0.1vw solid $borde-card; background: radial-gradient(125% 125% at 50% 10%, $fondo-card 40%, $bottom-color 100%); display: flex; justify-content: center; align-items: center; flex-direction: column; } .spider { width: 70%; height: 70%; object-fit: cover; } .card_info { margin-bottom: 1vw; width: 90%; height: 15%; border-radius: 1vw; background: $fondo-card; backdrop-filter: blur(50px); box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.37); display: flex; justify-content: space-around; align-items: center; color: white; font-family: 'Poppins', sans-serif; text-align: center; padding: 0.5vw; } .estatura { margin-left: 1vw; border-top: 0.1vw solid $bottom-color; border-top-right-radius: 2vw; padding: 0.8vw; font-size: 1vw; } .edad { margin-right: 1vw; border-top: 0.1vw solid $bottom-color; border-top-left-radius: 2vw; padding: 0.8vw; font-size: 1vw; } .card_logo_container { width: 25%; border-bottom: 0.1vw solid $bottom-color; border-bottom-right-radius: 2vw; border-bottom-left-radius: 2vw; background: $bottom-color; margin-bottom: 1.3vw; display: flex; justify-content: center; align-items: center; } .card_logo { width: 100%; } .card_name { width: 90%; height: 10%; margin-top: 0.5vw; background: radial-gradient(125% 125% at 50% 10%, $fondo-card 40%, $bottom-color 100%); border-bottom: 0.1vw solid $bottom-color; border-bottom-right-radius: 2vw; border-bottom-left-radius: 2vw; display: flex; justify-content: center; align-items: center; font-size: 1vw; }
es sorprendente que react + vite tenga css modules de forma nativa! 🙀
Hola! así quedo mi card. 💚 Use lorem ipsum para generar el texto de relleno, y flexbox para organizar los elementos internos del componente.
Con todo amigo!
Dejo mi aporte:
React evita la superposición de clases y estilos con el uso de CSS Modules. Al emplear módulos CSS, cada clase se convierte en única al ser alterada automáticamente por React, añadiendo identificadores únicos. Esto significa que, aunque diferentes componentes tengan clases con el mismo nombre, no habrá conflictos, ya que cada uno mantendrá su estilo específico. Esto es especialmente útil en aplicaciones grandes, donde la modularidad y la encapsulación de estilos son clave para evitar conflictos de CSS.
Mi card humildemente
mi card.
Asi quedo mi card