Solución de Problemas Comunes en BEM y Mejores Prácticas
Resumen
¿Cómo enfrentar los problemas comunes con BEM?
La metodología BEM (Bloque, Elemento, Modificador) ha revolucionado la forma en que estructuramos y nombramos nuestras clases CSS. No obstante, incluso esta eficaz metodología tiene sus retos. En este artículo, te guiaré a través de tres problemas comunes que podrías enfrentar al usar BEM y cómo puedes solucionarlos con confianza y efectividad.
¿Qué hago si tengo que combinar componentes con clases diferentes?
Imagina que has creado un componente A con sus propias clases y ahora necesitas integrarlo dentro de un nuevo componente B, también con sus propias clases. ¿Cuál es el paso a seguir? Es simple: ambos componentes pueden coexistir con sus respectivas clases sin ningún problema. Considera el siguiente ejemplo en HTML:
En este caso, el componente cart y el button tienen sus propias estructuras de clase. No necesitas modificar sus clases incluso cuando los integres juntos en un mismo elemento. Esta independencia evita romper la consistencia de cada componente individual.
¿Qué hacer con los niveles múltiples en HTML?
La estructura de tu HTML puede volverse compleja, con componentes anidados formando una jerarquía de padres, hijos y nietos. Sin embargo, BEM no se interesa por los niveles jerárquicos en tu código HTML. La solución reside en mantener nombres de clase que no reflejen esta jerarquía y simplifiquen la estructura. Trata de no duplicar las jerarquías HTML en tus nombres de clase:
<divclass="cart"><divclass="cart__footer"><spanclass="cart__footer-text">Texto del footer</span></div></div>
Es posible utilizar elementos y modificadores para distinguir diferencias en apariencia o comportamiento, sin necesidad de seguir la jerarquía HTML exactamente.
¿Es necesario crear clases específicas para ocultar contenido en BEM?
¿Estás usando JavaScript y quieres ocultar elementos como un componente cart y un button usando la propiedad display: none? En lugar de crear una clase específica para cada elemento visual, es recomendable emplear una clase genérica. Esto simplifica tu código y evita repetición innecesaria:
.hidden{display: none;}
Puedes aplicar esta clase a cualquier componente cuando necesites ocultarlo:
¿Cómo integrar BEM con Sass para mejorar tu flujo de trabajo?
El uso de un preprocesador como Sass puede mejorar considerablemente el flujo de trabajo al aplicar la metodología BEM. Sass te permite anidar clases, otorgando un nivel adicional de orden y claridad al CSS. Observa el siguiente ejemplo para entender la ventaja de combinar Sass con BEM:
El uso de la anidación en Sass, como se muestra arriba, mantiene el CSS limpio y organizado. Permite una estructura donde las relaciones entre bloques y elementos son claras, sin la necesidad de crear clases individuales para cada nivel jerárquico.
Recomendaciones finales para un uso eficiente de BEM
El método BEM no solo facilita la lectura y comprensión del CSS, sino que también fomenta la reutilización de clases y evita la sobrecarga de selectores anidados. Aquí tienes algunas recomendaciones para sacar el máximo provecho a BEM:
Lee y personaliza: BEM está diseñado para ser entendible y adaptable. Ajusta la metodología según los requerimientos de tu proyecto.
Evita complejidad innecesaria: No te sientas obligado a seguir la jerarquía HTML en la nomenclatura de BEM. Mantén las cosas simples.
Usa clases genéricas: Siempre que sea posible, utiliza clases genéricas para estilos o comportamientos comunes, como ocultar elementos con display: none.
Aplica BEM en proyectos futuros con estas estrategias y verás cómo mejora la gestión y escalabilidad de tu código CSS. ¡Continúa explorando y experimentando con BEM para encontrar la configuración que mejor funcione para ti!
Tengo un componente A que ya tiene sus propias clases y deseo añadirlo a un nuevo componente B. Debo agregar una nueva conveción para el componente A que está dentro de B?
Respuesta:
No necesariamente por que, lo que estoy tratando es de no repetir codigo y a mi parecer esto lo que haria es verme con la necesidad de escribir o extender el codigo de otra clase.
Problema dos
En mi estructura de html tengo padres, hijos, nietos, tataranietos, etc;
Pero BEM sólo deja usar 3 niveles. Que hago con los elementos nietos y sus descendientes?
Respuesta:
Simplemente los trataria a todos como si fueran hijos.
Problema tres
Quiero utilizar la propiedad display: none para ocultar desde js un componente de card y componente de botón. Debo crear una clase para cáda componente siguiendo su propia estructura de BEM (card—hidden y button—hidden).
Respuesta:
Idealmente no, si lo que hace es ocultar con que cree una clase que se llame hidden que contenga el display: none seria suficiente.
Recomendaciones
Los proyecto que usan BEM son:
Fáciles de leer
Muy intuitivos
Permiten evitar selectores anidados
BEM permite personalizar sus reglas y nomenclaturas.
Las anidaciones son una locura, dejan el código mas entendible, en CSS se implemento el nesting para las anidaciones y ya es soportado en un 72.89% Chrome lo maneja Firefox aun no.
ya subió a 75.49% según caniuse hoy 13 de agosto del 2023
jajaja este es uno de mis mas grandes errores que yo cometo
excelente curso anteriormente no entendia como funcionaba BEM y intentaba utilizarlo pero caia en el error de reprecentar los niveles de profundidad, ahora ya todo me queda mas claro
Me encantaron los ejemplos. Lo de la representación de niveles me quedo más claro con ello.
CSS Nesting (Abril / 2026):
Global: 88.83%+ 3%= 91.83%
Fuente:
Apenas me di cuenta que para este cursos ya hay que saber usar, Sass, bootstrap, css y basicamente ya saber usar css
Problema uno:
No, este problema plantea un caso en el que ya hay un bloque definido y queremos que ese bloque sea elemento de otro bloque, la metodología BEM permite esto y se le suele llamar "Mix", no hay que agregar nuevas convenciones. Lo que sí es util es evitar añadir estilos a bloques que puedan perjudicar su interacción al ser elementos de otros bloques, por ejemplo: añadir márgenes a un bloque, esto puede ocasionar conflictos de posicionamiento cuando querrámos que ese bloque sea elemento de otro bloque diferente.
Problema dos:
La metodología BEM no trabaja con niveles, BEM se puede utilizar asumiendo que todas las etiquetas son de primer nivel, así que no hay que cambiar la representación de objeto__elemento, se debe evitar hacer "Elementos de elementos" como bloque__elemento__elemento u otra mala práctica de ese estilo.
Problema tres:
Hacer una clase para cada componente no sería necesario, en todo caso, si se quiere hacer uso de una clase "utilitaria" para ocultar elementos, bastaría con tener una sola clase hidden.
PROBLEMAS BEM
Problema unoTengo un componente A que ya tiene sus propias clases y deseo añadirlo a un nuevo componente B. Debo agregar una nueva conveción para el componente A que está dentro de B?> Respuesta: No necesariamente por que, lo que estoy tratando es de no repetir codigo y a mi parecer esto lo que haria es verme con la necesidad de escribir o extender el codigo de otra clase.
Problema dosEn mi estructura de html tengo padres, hijos, nietos, tataranietos, etc; Pero BEM sólo deja usar 3 niveles. Que hago con los elementos nietos y sus descendientes?> Respuesta: Simplemente los trataria a todos como si fueran hijos.
Problema tresQuiero utilizar la propiedad display: none para ocultar desde js un componente de card y componente de botón. Debo crear una clase para cáda componente siguiendo su propia estructura de BEM (card—hidden y button—hidden).> Respuesta: Idealmente no, si lo que hace es ocultar con que cree una clase que se llame hidden que contenga el display: none seria suficiente.
Recomendaciones
Los proyecto que usan BEM son:
Fáciles de leer
Muy intuitivos
Permiten evitar selectores anidados
BEM permite personalizar sus reglas y nomenclaturas.
tailwind utiliza muy bien esos conceptos entonces. El problema es que utilizamos tailwind mal
hasta ahora se me ah echo muy aburrido!!
alguien me puede dar un cosejo para no aburrirme
Simplenente que el ultimo caso ense que no era necesario el modificador pero poner como una función por aparte el "hidden" es mejor
Con el tema de los nietos y subsiguientes, implicaría que son otros componentes, que viven independientes tanto dentro como fuera de sus contenedores. Esto los haría reutilizables
problema 1: dejar la clase igual
problema 2: solo poner el bloque y el elemento. Por ejemplo "card__footer__text" se convertiría en "card card__text" o quizás en "card footer card__text"
problema 3: tomar el principio de dry y mantener hidden como una clase aparte que se aplica donde se necesita.
Le atiné a todas!
Estas son las soluciones que estuve pensando sobre los tres problemas comunes al implementar BEM.
No, sería mejor usar la herencia.
Nombraría mi clases en base a mi contenido relevante como el titulo, texto e imágenes, serian “section__h1”, y los contenedores seria invisibles. Es decir “section__div” y luego “section__h1”, en lugar de “section__div” y “div__h1” o “section__div__h1”
Sí, de esta manera solo agregamos las clases de JS
REFLEXIÓN
Bueno yo diría que me equivoque en todas, pero digamos que fue un error a medias, porque en la primera pensaba que usar le herencia era más válido para no romper las reglas de BEM, en la segunda cometí el error de ignorar a mis contenedores y en la última me di cuenta que tengo que mejorar mi comprensión lectora 😅.
a mi me gusta mas la versión sin el pre procesador SAS
Me queda una duda dice que reducimos 2 lineas de codigo pero la &__image no reemplaza al elemento card o como se veria el html con este ejemplo si lo anidamos, no me quedo muy claro
Caso 1: Creo que no (necesariamente) se debería cambiar las clases.
Caso 2: No representar el nivel de profundidad con BEM
Caso 3: Sí, se debería crear las clases específicas para cada caso (?)