6 min read
Understanding BEM Methodology
Table of Contents

Overview

The BEM (Block, Element, Modifier) methodology is a CSS naming convention designed to improve code structure, scalability, and reusability in web development. Created by the team at Yandex, BEM aims to help developers write modular and maintainable code, making it easier to build complex web interfaces. Whether you’re building a small project or managing a large codebase, BEM can help organize and future-proof your code.

This article explores the core concepts of BEM, how to use it effectively, and the benefits it brings to front-end development.

What is BEM?

BEM, short for Block, Element, Modifier, is a methodology that encourages developers to create reusable, modular components for websites. In BEM, CSS selectors are structured to follow a specific pattern that clearly defines the role of each element within a component. This approach helps to avoid conflicts, makes code easy to read, and promotes consistency across projects.

BEM is especially useful in projects where multiple developers work on the same codebase, as it provides a unified structure that everyone can follow.

Core Concepts of BEM

The BEM methodology is built around three core concepts:

  1. Block: An independent component that can be reused. A block represents a distinct part of the interface, like a navigation menu, button, or card.
  2. Element: A part of a block that serves a specific function. Elements depend on blocks and cannot exist independently.
  3. Modifier: A variation of a block or element that alters its appearance or behavior.

Example Overview

Consider a button component:

  • Block: button
  • Element: button__icon (an icon inside the button)
  • Modifier: button--large (a larger version of the button)

With BEM, we achieve a naming convention that specifies each component’s role and dependencies, making the code clear and predictable.

BEM Naming Conventions

In BEM, CSS class names are structured to reflect the Block, Element, and Modifier relationship. Let’s break down each part.

Block

A Block is the main parent component, representing a self-contained part of the UI.

  • Naming Convention: Use lowercase letters, with words separated by hyphens.
  • Example: button, card, nav-bar

Element

An Element is a component within a block that serves a specific purpose and relies on the block.

  • Naming Convention: Use two underscores (__) to connect the block and element name.
  • Example: button__icon, card__title, nav-bar__item

Modifier

A Modifier defines different states, appearances, or behaviors for blocks or elements.

  • Naming Convention: Use two hyphens (--) to connect the block or element name to the modifier.
  • Example: button--large, card__title--highlighted, nav-bar__item--active

Full Example

For a button component with an icon and a large variation, the classes would look like this:

<button class="button button--large">
    <span class="button__icon">Icon</span>
</button>

This structure keeps code modular and easy to understand, as each component’s role is evident from the naming.

Why Use BEM?

BEM offers several benefits that make it ideal for web development projects:

  • Readability: The naming conventions clearly describe each component’s role, making it easier for developers to understand the code.
  • Reusability: Blocks and elements are designed to be reusable, allowing you to use the same components across different parts of a project.
  • Scalability: With BEM, you can build complex UIs without worrying about CSS class conflicts. Blocks, elements, and modifiers can be extended easily.
  • Maintainability: BEM helps prevent style overrides and allows for clean, manageable code.

In short, BEM creates a predictable structure that reduces the likelihood of CSS conflicts and promotes consistency across large projects.

Best Practices for Implementing BEM

To make the most of BEM, consider the following best practices:

  1. Define Blocks Carefully: Blocks should represent independent components that don’t depend on other blocks. Avoid creating overly complex or nested blocks.
  2. Limit Element Depth: Try to keep element nesting shallow to avoid complex selector structures. This practice maintains readability and improves performance.
  3. Use Modifiers for Variations: If a block or element has different appearances or states, use modifiers to achieve those variations. Avoid creating entirely new classes for minor changes.
  4. Avoid Overuse of Modifiers: Modifiers should represent true variations, not completely different components. If a component changes drastically, it might be a different block.
  5. Separate Styles for Blocks and Elements: Avoid styling blocks within other blocks, as it breaks modularity. Each block should have its styles defined independently.

Following these guidelines helps ensure that your code remains organized and consistent with BEM methodology.

Examples of BEM in Action

Let’s explore more examples to see how BEM methodology can be applied to different components.

Example 1: Card Component

A card with a title, description, and button.

<div class="card card--featured">
    <h2 class="card__title">Card Title</h2>
    <p class="card__description">Card description text goes here.</p>
    <button class="card__button">Learn More</button>
</div>
  • Block: card
  • Element: card__title, card__description, card__button
  • Modifier: card--featured (a featured variation of the card)

Example 2: Navigation Bar

A navigation bar with items, including an active modifier for the currently selected item.

<nav class="nav-bar">
    <ul class="nav-bar__list">
        <li class="nav-bar__item nav-bar__item--active">Home</li>
        <li class="nav-bar__item">About</li>
        <li class="nav-bar__item">Contact</li>
    </ul>
</nav>
  • Block: nav-bar
  • Element: nav-bar__list, nav-bar__item
  • Modifier: nav-bar__item--active (indicating the active state of an item)

Conclusion

The BEM methodology provides a powerful way to organize CSS by breaking down complex UIs into modular, reusable, and maintainable components. By adhering to BEM conventions, developers can create clean and scalable CSS that simplifies collaboration and reduces the risk of style conflicts. Whether working solo or in a team, adopting BEM brings structure and clarity to CSS, making it a valuable methodology for any modern web development project.

BEM not only streamlines your CSS but also ensures that your codebase remains maintainable as it scales, ultimately leading to a smoother development experience and better-structured applications.