La metodología BEM es una herramienta valiosa y ampliamente utilizada en el desarrollo web moderno que permite organizar y estructurar el código de manera más clara y mantenible. La sigla BEM significa "Bloque, Elemento, Modificador", y se usa principalmente para mejorar la legibilidad y el mantenimiento de códigos CSS y HTML. Esta metodología se basa en una nomenclatura consistente y clara, donde:
Bloque: Representa un contenedor principal, como un componente común en HTML, por ejemplo, una tarjeta o un menú.
Elemento: Son las partes internas de un bloque, como íconos o textos dentro de la tarjeta.
Modificador: Representa variaciones de bloques o elementos, como los estados de activado/desactivado de un botón.
La metodología se compara con el Falcon 9 de SpaceX: el cohete entero es el bloque, sus componentes como el "Second Stage" son elementos, y variaciones como el "Dragon" en la cabeza del cohete son modificadores.
¿Por qué y para qué utilizar BEM en proyectos web?
VEM es crucial para manejar proyectos web porque ofrece varios beneficios al estructurar el código:
Lectura Fácil y Limpia: Permite que tanto el HTML como el CSS sean más comprensibles, lo que facilita la identificación de componentes y modificaciones rápidas.
Escalabilidad y Mantenibilidad: Promueve un código que puede expandirse y modificarse fácilmente, vital para proyectos en crecimiento.
Organización Modular: Facilita la organización del CSS en módulos independientes, haciendo que el código sea más manejable y eficiente.
Evitar Anidamientos Complejos: Gracias a su estructura clara, se evitan selectores CSS largos y complicados, adheriendo a principios de buenas prácticas como SOLID y DRY.
¿Cómo implementar BEM con HTML y CSS?
Implementar BEM implica seguir un esquema de nomenclatura consistente:
Los bloques y sus correspondientes clases CSS deben ser identificados con nombres que reflejen claramente su función. Por ejemplo, las clases para el botón: button, button--active y button__icon.
Guiones y guiones bajos se utilizan para denotar diferencias estructurales:
Guiones bajos (__) separan bloques de sus elementos. Ejemplo: block__element.
Guiones medios (--) diferencian modificadores de bloques o elementos. Ejemplo: block--modifier.
Se puede adaptar el estilo de los guiones siempre que se mantenga una consistencia a lo largo del proyecto.
Ejemplo Práctico en HTML y CSS
Aquí tienes un ejemplo aplicando BEM a un componente HTML simple de botón:
.button{/* Estilos del bloque */}.button__icon{/* Estilos para el elemento icon */}.button--active .button__text{/* Estilos para el modificador cuando el botón está activo */}
¿Cómo BEM ayuda en proyectos grandes?
En proyectos de gran envergadura, donde las estructuras de HTML y CSS se vuelven complejas, BEM ofrece una forma estructurada de dar sentido al caos potencial:
Convenciones Consistentes: Al definir una guía clara de cómo se nombran los bloques, elementos y modificadores, se reduce la confusión y el tiempo necesario para entender el código de otros.
Coherencia en Equipos: Cuando múltiples desarrolladores trabajan en un mismo proyecto, BEM asegura que cada uno comprenda cómo están relacionados los elementos del código.
Te animo a que experimentes con la metodología BEM en tus propios proyectos y descubras la diferencia en claridad y mantenimiento que puedes lograr. ¡No olvides compartir tus experiencias y ejemplos en los comentarios!
Aquí presento un ejemplo de cómo aplicar BEM (Block, Element, Modifier) en un caso de la vida real. Imaginemos que estás trabajando en el diseño de un sitio web para una tienda en línea que vende productos electrónicos. Vamos a aplicar BEM para estilizar una lista de productos y un botón de compra.
Supongamos que el código HTML para la lista de productos es el siguiente:
<ulclass="products-list"><liclass="product"><divclass="product__image"><imgsrc="producto1.jpg"alt="Producto 1"></div><divclass="product__details"><h3class="product__title">Producto 1</h4><pclass="product__description">Descripción del producto 1.</p><spanclass="product__price">$99.99</span><buttonclass="product__buy-button">Comprar</button></div></li><!-- Otras listas de productos --></ul>
Ahora, apliquemos BEM para estilizar estos elementos:
Block: El bloque más grande y significativo es "products-list". Representa la lista de productos.
/* Estilos para el bloque "products-list" */.products-list{list-style: none;margin:0;padding:0;}
Element: Los elementos dentro del bloque "products-list" son "product", "product__image", "product__details", "product__title", "product__description" y "product__price".
/* Estilos para el elemento "product" */.product{display: flex;border:1px solid #ccc;margin-bottom:20px;}/* Estilos para el elemento "product__image" */.product__image{flex:1;padding:10px;}/* Estilos para el elemento "product__details" */.product__details{flex:2;padding:10px;}/* Estilos para el elemento "product__title" */.product__title{font-size:18px;margin:0;margin-bottom:5px;}/* Estilos para el elemento "product__description" */.product__description{margin:0;color:#555;}/* Estilos para el elemento "product__price" */.product__price{font-weight: bold;}
Modifier: Los modificadores cambian el aspecto o el comportamiento de un bloque o elemento. Por ejemplo, podríamos tener un modificador para el botón de compra cuando un producto está en oferta:
/* Estilos para el modificador "product__buy-button--on-sale" */.product__buy-button--on-sale{background-color:#ff9900;color:#fff;border: none;cursor: pointer;}
Ahora, en tu código HTML, puedes aplicar el modificador cuando sea necesario:
Recuerda que BEM es una metodología de nomenclatura para escribir CSS más estructurado y modular. Cada clase tiene su propósito y se evitan selectores complejos o anidados. Con BEM, el código es más mantenible y escalable, lo que es especialmente útil en proyectos grandes y equipos de desarrollo. ¡Espero que este ejemplo te ayude en tu aprendizaje de arquitectura CSS y BEM!
!BEM Logo
¿Qué es BEM?
BEM es una serie de televisión japonesa de anime de aventuras de terror sobrenatural.
Las siglas BEM significan “Block, Element, Modifier” y es un enfoque para estructurar y nombrar clases CSS de manera más organizada y escalable.
Block: Componentes independientes y reutilizables que representan una entidad significativa.
Element: Partes que forman parte del bloque y no tienen uso fuera de él.
Se nombran con doble guion bajo.
Ejemplo:[Block]__[Element]
Modifier: Variaciones o estados de bloques o elementos que cambian su aspecto o comportamiento.
Se nombran con dos guiones.
Ejemplo:[Block]--[Modifer]
Estructuras que podemos encontrar:
[ Block ]
[ Block ]__[ Element ]
[ Block ]--[ Modifier ]
[ Block ]__[ Element ]--[ Modifier ]
[ Block ]--[ Modifier ]
BEM 🚀
.
BEM (Block Element Modifier): Es una metodología que se centra en la estructura del HTML y nombra las clases de manera descriptiva para formar bloques (componentes), elementos y modificadores.
.
Ejemplo:
<divclass="comment"><imgsrc="imagen-usuario.jpg"alt="Imagen de usuario"class="comment__avatar"><pclass="comment__text">Este es un comentario.</p><buttonclass="comment__button comment__button--like">Me gusta</button></div>
/* Estilo base para el bloque de comentario */.comment {display: flex;align-items: center;margin-bottom:0.5rem;}/* Estilos para el avatar del usuario en el comentario */.comment__avatar {width:30px;height:30px;border-radius:50%;margin-right:0.5rem;}/* Estilos para el texto del comentario */.comment__text {font-size:1rem;}/* Estilos para el botón de "Me gusta" en el comentario */.comment__button {background-color:#3b5998;color:white;padding:0.5rem1rem;border: none;border-radius:4px;cursor: pointer;}/* Estilos para el modificador de botón de "Me gusta" destacado */.comment__button--like {background-color:#1877f2;}
El objetivo de la metodologia BEM es hacer que los nombres de los selectores CSS sean lo mas informativos y transparentes posibles.
El nombre del bloque suele ser una sola palabra como .header, pero si tiene una definición de bloque más larga, se divide con un solo guión -
<.lang-switcher {/* Styles */}>
El nombre del elemento comienza con doble guión bajo __:
<.lang-switcher__flag_basic {/* Styles */}>
Solo hay una regla muy crítica en la metodología BEM: un modificador no se puede usar fuera del contexto de su propietario.
<.btn_big{/* Styles */}>
Puede usar btn_bigsolo si el encabezado también está definido.
<<div class=”btn_big”>...</div>>Mal ejemplo
<<div class=”btn_big”>...</div>>Buen ejemplo
Además de estos estilos BEM originales, existen esquemas de nombres alternativos como los estilos Harry Roberts y CamelCase.
camelCase no puede llevar la primer letra en mayúscula de lo contrario se llamaa PascalCase, la de harrys monlanconozco y la de snake_case es con guiones bajos
aquí les recomiendo sobre todo losbque somos nuevos, que no usen _ al pegar palabras, lo que se conoce como nomenclatura snake case, por que en mo caso por ejemplo en el bloque de un menu lo llamaba "menu_principal" luego un elemento quebllamada "productos-digitales" y luego un modoficador que cuando pasaran el mouse hiciera un efector hover no se que de nombre fuera "color_hover" cuando empezaba a juntar todo me confundia porque tenia que poner menu_principal__productos-digitales--color_hover aquí les recomiendo mejor usen nomenclatura pascal o camello y quedaría así. por ejemolo con camello: "menuPrincipal__productosDigitales--colorHover" así ya no hay confusión y saben cual es elnbloque, cual es el elemento y cual el modoficador, espero y me haya explicado, saludos.
Mejorarte el selector en unos simples pasos, gracias, a veces tenia el mismo problema
Tu aporte es muy bueno, decido mejorarlo un poco:
Aquí les recomiendo sobre todo los que somos nuevos, que no usen _ al pegar palabras, lo que se conoce como nomenclatura snake case, porque en mi caso por ejemplo en el bloque de un menú lo llamaba menu_principal luego un elemento que llamada productos-digitales y luego un modificador que cuando pasaran el mouse hiciera un efector hover y ponerle de nombre color_hover. Cuando empezaba a juntar todo me confundía porque tenía que poner.
.menu_principal__productos-digitales--color_hover{...}/* Muy dificil de leer */
Aquí les recomiendo mejor usen nomenclatura pascal o camello y quedaría así. Por ejemplo, con camello:
.menuPrincipal__productosDigitales--colorHover{...}/* Mejor legibilidad */
Así ya no hay confusión y saben cuál es el bloque, cuál es el elemento y cuál el modificador, espero y me haya explicado, saludos.
Este sería mi código HTML con la metodología BEM
<sectionclass="museum"><h2class="museum__title"data-text-one="Modern"data-text-two="Art Gallery"> Modern Art Gallery
</h3><pclass="museum__description"> The arts in the collection of the Modern Art Gallery all started from a
spark of inspiration. Will these pieces inspire you? Visit us and find
out.
</p><aclass="museum__link"href="/location"><spanclass="link__text">Our location</span><spanclass="link__icon"></span></a></section>
Un objeto de la vida cotidiana donde se podría aplicar muy bien la metodóloga BEM es en un cubo de rubik.
El bloque seria el cubo, cada cara seria un elemento tipo div y tendría un modificador de color en cada lado:
Mi ejemplo de una card aplicando la metodología BEM
<divclass="card card--variant1"><divclass="card__body"><h2class="card__title">Lorem ipsum dolor sit amet.</h2><pclass="card__text">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas dapibus.</p></div><divclass="card__footer"><buttonclass="card__btn">Lorem Ipsum</button></div></div>
Un caso práctico real que me parece que es de uso común dentro de las páginas web son las cartas de productos. Es común verlas en catálogos de tiendas web y suelen tener: Nombre, descripción y un precio, tal que así:
<divclass="card"><imgsrc=""alt=""class="card__img"><pclass="card__title">PC gamer</p><pclass="card__text">Una poderosa PC Gamer intel core i9 12th, de 32 GB de RAM y 2 TB SSD M2</p><pclass="card__price">$ 1200</p></div>
Ya con esa estructura hecha en HTML, se pueden aplicar los estilos CSS a las clases que ya nombramos haciendo uso de BEM convenientemente: