COMPARTE ESTE ARTÍCULO Y MUESTRA LO QUE APRENDISTE
BEM es una convención o metodología para nombrar tus clases de CSS. Por sus siglas en inglés, BEM significa Bloque, Elemento y Modificador.
En esta guía aprenderemos:
Cómo funciona BEM
Cómo usar BEM en CSS
Por qué y para qué usar BEM
Ejemplo prácticos de BEM (incluyendo un cohete Falcon 9 de Space X) 🚀
3 casos con lo que debes y no debes hacer con BEM
3 problemas comunes en BEM y cómo solucionarlos
BEM + SASS
Recomendaciones finales
¿Cómo funciona BEM?
BEM funciona identificando el bloque, el elemento y el modificador de un componente.
Bloque es el contenedor principal del componente.
Elemento son las partes internas que conforman el componente.
Modificador son las variaciones del bloque o del elemento.
El cohete Falcon 9 de SpaceX está compuesto por varias partes que hacen posible el transporte confiable y seguro de personas o cargas útiles a la órbita terrestre (incluso más allá). Para cada una de las partes podemos crear una analogía.
Vamos a identificar quién sería el elemento bloque, quiénes serían los elementos y quiénes serían los modificadores, así:
Teniendo entonces:
Bloque: Falcon 9
Elementos: First stage, Interstage, Second stage.
Modificador: Fairing, Dragon.
Después de revisar la analogía con el cohete Falcon 9, revisemos algunos ejemplos que podemos encontrarnos en la vida real:
Bloque: card, button, form, menu, header…
Elemento: icon, text, item, image, input, button…
Modificador: active, big, right, secondary, red…
😍
Cómo se usar BEM en CSS
Los nombres de clases con convención BEM,pueden tener la siguiente sintaxis:
[bloque]
[bloque]__[elemento]
[bloque]--[modificador]
[elemento]--[modificador]
[bloque]__[elemento]--[modificador]
Teniendo en cuenta lo anterior, el CSS para nuestro Falcon 9 se escribiría así:
Los guiones bajos (__) se usan para separar el bloque del elemento,
Los guiones medios (--) se usan para separar el bloque o el elemento del modificador.
💡 Nota: BEM permite cambiar esta nomenclatura. También puedes encontrar nombres de clase así: [bloque]__[elemento]-[modificador], [bloque]__[elemento]_[modificador], entre otros. Lo más importante a la hora de usar una de estas nomenclaturas es ser consistente en todo el proyecto.
¿Por qué y para qué usar BEM?
Tal vez te preguntes, “Pero, ¿Teff, para qué seguir esta metodología si el resultado en CSS es el mismo? ¡Solo estamos haciendo más trabajo!”
Para tener un CSS más fácil de leer, entender, mantener y escalar.
Para organizar las clases de CSS en módulos independientes.
Para evitar selectores de CSS anidados.
Casos prácticos de BEM
Card:
Identifiquemos el bloque, los elementos y los modificadores (si los tiene) de la siguiente card:
De la imagen anterior, tenemos lo siguiente:
Bloque: card
Elementos: image, text
Modificadores: (no tiene)
Su estructura de HTML con la convención de clases BEM, sería:
La estructura de HTML con la convención de clases BEM para ambos bloques, sería:
<sectionclass="section"><div><h2class="section__text section__text--primary">FALCON 9h2><pclass="section__text section__text--secondary-semibold">Falcon 9, the world's first orbital class reusable rocket...p><pclass="section__text section__text--secondary-bold">Learn more about Falcon 9p><ulclass="list"><liclass="list__item"><spanclass="list__text">VEHICLE HEIGHTspan><div><spanclass="list__text">70mspan><spanclass="list__text list__text--gray">/229.6 ftspan>div>li><liclass="list__item"><spanclass="list__text">VEHICLE DIAMETERspan><div><spanclass="list__text">3.7mspan><spanclass="list__text list__text--gray">/12 ftspan>div>li><liclass="list__item"><spanclass="list__text">FAIRING HEIGHTspan><div><spanclass="list__text">13.1mspan><spanclass="list__text list__text--gray">/43 ftspan>div>li><liclass="list__item"><spanclass="list__text">FAIRING DIAMETERspan><div><spanclass="list__text">5.2mspan><spanclass="list__text list__text--gray">/17.1 ftspan>div>li>ul>div><div>div>section>
Casos con lo que debes y no debes hacer con BEM
1️⃣ Primer caso
Lo que sí: dejar la clase principal card y añadir otra clase con modificador.
class="card card--flat">div>
Lo que no: usar la clase con modificador como clase principal.
class="card--flat">div>
2️⃣ Segundo caso
Lo que sí: no representar los niveles de profundidad de HTML con BEM.
Problema: tengo un componente A que ya tiene sus propias clases y deseo añadirlo a un nuevo componente B. ¿Debo agregar una nueva convención para el componente A que estará dentro de B?
Problema: en mi estructura de HTML tengo padres, hijos, nietos, tataranietos, etc; pero BEM sólo me deja usar 3 niveles. ¿Qué hago con los elementos nietos y sus descendientes?
Problema: quiero utilizar la propiedad display: none para ocultar desde JavaScript un componente de Card y un componente de Botón. ¿Debo crear una clase para cada componente siguiendo su propia estructura de BEM (card--hidden y button--hidden)?
Solución: puedes crear una clase independiente a la estructura de BEM para aplicar propiedades generales, así, reducirás la cantidad de líneas de JavaScript ya que no tendrás que usar una clase específica para cada componente.
Dragon es la primera nave espacial privada en llevar humanos a la estación espacial. Pero, no lo hace sola. Dragon trabaja en conjunto con el cohete Falcon 9 para tener un lanzamiento perfecto.
Así como Dragon y Falcon 9 trabajan juntos, BEM y SASS también. SASS es un preprocesador de CSS que te permite anidar selectores, crear bucles, funciones, entre otras cosas. Y, adicionalmente, gracias a la sintaxis de SASS, podemos tener una combinación perfecta en nuestras hojas de estilos.
Por ejemplo, uno de nuestros ejercicios anteriores fue el siguiente:
Aquí sólo alcanzamos a reducir 2 líneas de código, pero, ¿te alcanzas a imaginar cuántas líneas de código podríamos ahorrarnos en un proyecto con mucho más HTML y CSS? Este es uno de los súper poderes de combinar BEM con SASS, aparte de que se ve mucho más lindo y limpio nuestro código.
Recomendaciones finales
Los proyectos que usan BEM son fáciles de leer, muy intuitivos y permiten evitar los selectores de CSS anidados. También, es una herramienta que permite personalizar las reglas y nomenclatura para tener un código mucho más limpio y escalable.
Si quieres aprender todo lo necesario para convertirte en Frontend Developer construyendo un proyecto profesional desde cero, te espero en el Curso de Frontend Developer en Platzi.