maintainable CSS methodologies

How to Write Clean, Maintainable CSS with the BEM Methodology

Writing Clean, Maintainable CSS with BEM

by Matrix219

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