Home » How to Write Clean, Maintainable CSS with the BEM Methodology

How to Write Clean, Maintainable CSS with the BEM Methodology

Writing Clean, Maintainable CSS with BEM

by Matrix219
Published: Updated:

To write clean and maintainable CSS, developers use methodologies like BEM (Block, Element, Modifier). BEM is a popular naming convention that provides a strict, logical structure for your CSS classes, making your code more readable, self-documenting, and less prone to style conflicts in large projects.


The Problem: CSS Chaos 🌪️

In a large project, CSS can quickly become a mess. Because styles are global, it’s easy to accidentally overwrite a style you didn’t mean to. This leads to “specificity wars” (using !important to force a style) and code that is terrifying to change because you don’t know what you might break.


The BEM Solution: A Simple Naming System

BEM solves this by treating your user interface as a collection of reusable components. It uses a simple naming pattern to make the relationship between your HTML and CSS incredibly clear.

Analogy: Thinking Like a Person 🧍

  • Block: This is the main, standalone component. Think of it as a person. (e.g., .card, .nav, .form)
  • Element: This is a part of the block that has no meaning on its own. It’s connected to the block with two underscores (__). Think of the person’s body parts. (e.g., .card__title, .nav__link, .form__input)
  • Modifier: This is a flag on a block or element that changes its appearance or state. It’s connected with two hyphens (--). Think of the person’s state. (e.g., .card--featured, .nav__link--active, .form--dark)

A Practical Example

Here’s how you’d structure a simple card component:

HTML:

<div class="card card--featured">
  <img class="card__image" src="img.png" alt="An image">
  <h2 class="card__title">Card Title</h2>
  <button class="card__button card__button--primary">Click Me</button>
</div>

CSS:

/* Block */
.card {
  border: 1px solid #ccc;
}
/* Element */
.card__title {
  font-size: 1.5rem;
}
/* Element */
.card__button {
  background-color: grey;
}
/* Modifier on Block */
.card--featured {
  border-color: gold;
}
/* Modifier on Element */
.card__button--primary {
  background-color: blue;
}

This structure is easy to read and completely avoids specificity issues.

You may also like