Die BEM-Methode: Schluss mit dem CSS-Chaos!
True Story: Ich übernehme ein WordPress-Projekt. Öffne die CSS-Datei. Scrolle runter. Und sehe das 😱:
.red { color: blue; }
.button-green { background: orange; }
.main-box-wrapper-container-inner { padding: 20px; }
Der vorherige Dev hatte .red ursprünglich für roten Text verwendet. Dann kam ein Redesign, alles sollte blau werden. Aber anstatt die Klasse umzubenennen, hat er einfach color: blue reingeschrieben. Logik? Fehlanzeige.
Und .main-box-wrapper-container-inner? Das waren 7 verschachtelte Divs. Für. Einen. Verdammten. Button.
Willkommen in der Realität von CSS ohne Konvention.
TL;DR: BEM ist eine simple Namenskonvention für CSS-Klassen, die dein Stylesheet endlich wieder wartbar macht. Kein Magic, keine komplexen Tools – nur eine clevere Art, Klassen zu benennen, damit sowas nie wieder passiert.
Warum BEM lernen im KI-Zeitalter?
“Moment mal – warum soll ich überhaupt noch CSS-Methoden lernen, wenn ChatGPT mir doch eh das ganze CSS schreiben?”
Gute Frage:
KI macht CSS lernen und BEM nicht überflüssig –> BEM macht KI besser.
Stell dir vor:
- Du sagst einer KI: “Mach mir eine Produktkarte”
- Sie spuckt dir 200 Zeilen CSS aus mit
div.container > div > span.price-wrapper .discount - Drei Tage später willst du die Karte anpassen
- Viel Glück beim Verstehen, was da eigentlich passiert
Jetzt mit BEM:
- Du sagst: “Mach mir eine Produktkarte mit BEM-Konvention”
- Die KI gibt dir saubere
.product-card__titleund.product-card--featuredKlassen - Du verstehst sofort die Struktur
- Anpassungen? Easy. Du weißt, wo welche Klasse hingehört
BEM ist dein Prompt-Engineering für CSS
Wenn du BEM verstehst, kannst du KI-Tools präziser steuern:
❌ "Style meinen Button"
→ KI ballert dir inline-styles oder random Klassen rein
✅ "Erstelle einen Button-Block mit BEM.
Modifier: --primary, --secondary, --disabled"
→ KI liefert saubere, wiederverwendbare Komponenten
KI-gestützter Workflow mit BEM
So arbeite ich heute:
-
Ich definiere die BEM-Struktur:
.product-card .product-card__image .product-card__title .product-card__price .product-card--featured -
KI schreibt das CSS:
- “Erstelle CSS für diese BEM-Struktur mit modernem Nesting”
- KI kennt BEM und generiert konsistenten Code
-
Ich bleibe in Kontrolle:
- Ich verstehe die Struktur
- Kann gezielt nachbessern
- Weiß, wo ich ansetzen muss
Das Problem mit “KI macht alles”
Ohne Grundlagen wie BEM bist du der KI ausgeliefert:
- Du verstehst nicht, was sie generiert
- Du kannst Fehler nicht erkennen
- Du hast keine Kontrolle über die Code-Qualität
- Dein Projekt wird zur Black Box
Mit BEM hast du einen Standard, den sowohl du als auch die KI versteht. Das ist wie eine gemeinsame Sprache.
Was ist BEM eigentlich?
Kennst du das? Du öffnest eine CSS-Datei und siehst sowas:
#header nav ul li a.active { }
Drei Monate später hast du keine Ahnung mehr, was das macht. So ein Chaos entsteht, wenn jeder macht, was er will. BEM verhindert genau das.
BEM steht für Block Element Modifier und ist im Grunde nur eine Vereinbarung, wie du deine CSS-Klassen benennst. Von Yandex entwickelt (ja, die russische Google-Alternative), hilft es dir:
- Zu verstehen, was dein CSS macht (auch nach 3 Monaten)
- Konflikte zu vermeiden (keine
!importantOrgien mehr) - Komponenten wiederzuverwenden (Copy & Paste, aber elegant)
- Mit anderen im Team zu arbeiten (ohne dich gegenseitig zu hassen)
Und das Beste: Seit 2023 unterstützen alle modernen Browser CSS-Nesting nativ. Das heißt, du kannst BEM mit verschachtelter Syntax schreiben – ohne SASS oder Build-Tools. Endlich macht BEM so richtig Spaß!
Die drei Zutaten
1. Block (.block)
Das ist deine Hauptkomponente. Ein Block kann für sich alleine stehen und macht auch alleine Sinn.
.navigation { }
.search-form { }
.product-card { }
Think: “Könnte ich das auch woanders verwenden?” → Dann ist es ein Block.
2. Element (.block__element)
Ein Element gehört zu einem Block und macht ohne ihn keinen Sinn. Du erkennst es an den zwei Underscores __.
.navigation__item { }
.search-form__input { }
.product-card__title { }
Think: “Braucht das seinen Eltern-Block?” → Dann ist es ein Element.
3. Modifier (.block--modifier, .block__element--modifier)
Ein Modifier ist eine Variante oder ein Zustand. Erkennbar an den zwei Bindestrichen --.
.navigation--dark { }
.search-form__input--error { }
.product-card--featured { }
Think: “Das ist wie ein Block, nur… anders?” → Dann ist es ein Modifier.
Vorher vs. Nachher (oder: Der Horror und die Erlösung)
Das Problem: Klassisches CSS
#header nav ul li a.active {
color: #ff6b35;
font-weight: bold;
}
#header nav ul li a:hover {
text-decoration: underline;
}
Was hier schiefgeht:
- ID-Selektoren = Spezifitäts-Hölle
- Kannst du nur in genau dieser HTML-Struktur verwenden
- Viel Spaß beim Überschreiben (hello
!important) - In 3 Monaten weißt du nicht mehr, was das soll
Die Lösung: Mit BEM
.navigation__link {
color: inherit;
text-decoration: none;
}
.navigation__link--active {
color: #ff6b35;
font-weight: bold;
}
.navigation__link:hover {
text-decoration: underline;
}
Warum das besser ist:
- Flache Spezifität (alles auf einer Ebene)
- Funktioniert überall, egal wie dein HTML aussieht
- Selbsterklärend – du siehst sofort, was zusammengehört
- In 3 Monaten verstehst du’s immer noch
Praktisches Beispiel: Eine Product Card (die nicht scheiße aussieht)
Lass uns eine vollständige Produktkarte bauen. So eine, die du tatsächlich in einem echten Projekt verwenden würdest:
<article class="product-card product-card--featured">
<img class="product-card__image" src="product.jpg" alt="Produkt">
<div class="product-card__content">
<h3 class="product-card__title">Premium Produkt</h3>
<p class="product-card__price product-card__price--sale">
<span class="product-card__price-old">99€</span>
<span class="product-card__price-current">79€</span>
</p>
<button class="product-card__button product-card__button--primary">
In den Warenkorb
</button>
</div>
<span class="product-card__badge product-card__badge--new">Neu</span>
</article>
.product-card {
position: relative;
background: white;
border-radius: 8px;
padding: 1.5rem;
}
.product-card--featured {
border: 2px solid #ff6b35;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
}
.product-card__image {
width: 100%;
height: auto;
border-radius: 4px;
}
.product-card__content {
margin-top: 1rem;
}
.product-card__title {
font-size: 1.25rem;
font-weight: 600;
margin-bottom: 0.5rem;
}
.product-card__price {
display: flex;
gap: 0.5rem;
align-items: center;
margin-bottom: 1rem;
}
.product-card__price--sale .product-card__price-old {
text-decoration: line-through;
color: #999;
}
.product-card__price-current {
font-size: 1.5rem;
font-weight: bold;
color: #ff6b35;
}
.product-card__button {
width: 100%;
padding: 0.75rem;
border: none;
border-radius: 4px;
cursor: pointer;
}
.product-card__button--primary {
background: #ff6b35;
color: white;
}
.product-card__badge {
position: absolute;
top: 1rem;
right: 1rem;
padding: 0.25rem 0.75rem;
border-radius: 20px;
font-size: 0.875rem;
font-weight: 600;
}
.product-card__badge--new {
background: #28a745;
color: white;
}
Best Practices (oder: So vermeidest du BEM-Fails)
1. Keine Inception-Level Verschachtelungen
.block__element__subelement { }
❌ Nope. Don’t do this.
Wenn du mehr als zwei Underscores brauchst, hast du entweder:
- Einen neuen Block gefunden
- Oder deine Komponente ist zu komplex
Mach stattdessen:
.block__element { }
.block__subelement { }
2. Modifier niemals alleine
<button class="button button--large">Klick mich</button>
✅ Yes! Immer Basis-Klasse + Modifier
<button class="button--large">Klick mich</button>
❌ Nope. Der Modifier braucht seine Basis
3. Namen, die Sinn machen
.product-card--featured { }
✅ Yes! Ich weiß, was das ist
.product-card--big { }
❌ Nope. Big ist relativ. Featured ist eindeutig
4. Ein Block = Eine Komponente
Jeder Block sollte in sich geschlossen sein. Wenn du ihn woanders hinkopierst, sollte er funktionieren. No dependencies, no bullshit.
BEM mit modernem CSS (ja, ohne Preprocessor!)
Plot Twist: Seit 2023 kannst du BEM mit nativem CSS-Nesting schreiben. Kein SASS, kein Build-Step nötig!
.product-card {
background: white;
padding: 1.5rem;
&--featured {
border: 2px solid #ff6b35;
}
& __image {
width: 100%;
border-radius: 4px;
}
& __title {
font-size: 1.25rem;
font-weight: 600;
}
& __button {
width: 100%;
padding: 0.75rem;
&--primary {
background: #ff6b35;
color: white;
}
}
}
Browser Support: Chrome 112+, Firefox 117+, Safari 16.5+. Alle modernen Browser können das jetzt.
Das & funktioniert genau wie in SASS. Erst jetzt macht BEM so richtig Spaß, weil du nicht mehr jeden Block-Namen 50-mal tippen musst.
SCSS? Immer noch cool
Natürlich kannst du auch weiterhin SCSS verwenden:
.product-card {
background: white;
padding: 1.5rem;
&--featured {
border: 2px solid #ff6b35;
}
&__image {
width: 100%;
border-radius: 4px;
}
&__title {
font-size: 1.25rem;
font-weight: 600;
}
&__button {
width: 100%;
padding: 0.75rem;
&--primary {
background: #ff6b35;
color: white;
}
}
}
SCSS bietet noch ein paar Extras (Variablen, Mixins, etc.), aber für reines BEM reicht mittlerweile natives CSS.
Wann macht BEM Sinn? (Ehrliche Antwort)
BEM ist perfekt für:
- Projekte, die länger als 2 Wochen leben
- Teams (damit ihr euch nicht gegenseitig die Styles kaputt macht)
- Component Libraries (React, Vue, whatever)
- Wenn du auch in 6 Monaten noch verstehen willst, was du gebaut hast
Skip BEM, wenn:
- Du einen Quick-Prototyp baust
- Das Projekt eh nächsten Monat in die Tonne kommt
- Du bereits Tailwind oder ähnliches verwendest (macht in Kombi wenig Sinn)
- Es nur 3 Seiten sind und du der einzige Entwickler bist
BEM vs. Tailwind (Fight!)
Okay, nicht wirklich ein Fight. Beide haben ihre Berechtigung:
BEM:
- Du schreibst semantische Klassennamen (“product-card” statt “flex p-4”)
- Du baust Komponenten, die wiederverwendbar sind
- Du schreibst dein eigenes CSS (mehr Kontrolle, mehr Arbeit)
Tailwind:
- Utility-First: Styling direkt im HTML
- Schneller für Prototypen
- Weniger CSS-Dateien zum Managen
Plot Twist: Du kannst beides kombinieren!
<article class="product-card flex flex-col p-4 rounded-lg">
<img class="product-card__image w-full h-auto" src="...">
<h3 class="product-card__title text-xl font-semibold">Titel</h3>
</article>
BEM für Komponenten-Logik, Tailwind für Quick-Styling. Funktioniert erstaunlich gut.
Fazit: Keep It Simple, Stupid
BEM ist keine Rocket Science. Es ist einfach eine verdammt gute Idee, deine CSS-Klassen konsistent zu benennen.
Was du gewinnst:
- Code, den du auch nach Monaten noch verstehst
- Weniger Merge-Konflikte im Team
- Komponenten, die du einfach wiederverwenden kannst
- Keine Spezifitäts-Battles mehr
- KI-generierter Code, den du tatsächlich kontrollierst
Was es kostet:
- 10 Minuten zum Lernen
- Etwas Disziplin beim Benennen
- Das wars. Seriously.
Die Lernkurve ist flach, der Nutzen enorm. Besonders wenn du nicht alleine arbeitest oder das Projekt länger als einen Hackathon überlebt.
BEM + KI: Mein Workflow in der Praxis
So nutze ich BEM mit KI-Tools täglich:
1. Komponenten-Struktur definieren
Ich: "Ich brauche eine Testimonial-Card mit BEM.
Elemente: Image, Quote, Author, Rating
Modifier: --highlighted, --compact"
2. KI generiert sauberen Code
Die KI kennt BEM und liefert:
.testimonial-card { }
.testimonial-card__image { }
.testimonial-card__quote { }
.testimonial-card__author { }
.testimonial-card--highlighted { }
3. Ich verfeinere gezielt
“Mach die highlighted-Variante mit orange border und shadow”
4. Konsistenz über alle Komponenten
Weil ich BEM als Standard nutze, passt alles zusammen – egal ob ich es selbst schreibe oder generieren lasse.
Der Unterschied: Ich nutze KI als Werkzeug, nicht als Zauberstab. BEM gibt mir die Kontrolle.
Ressourcen (die tatsächlich helfen)
- getbem.com – Die offizielle Seite (kurz & knackig)
- BEM 101 – CSS-Tricks Deep Dive
- MindBEMding – Harry Roberts erklärt’s noch besser
Und jetzt du: Nutzt du schon BEM? Oder schwörst du auf eine andere Methodik? Lass es mich wissen, ich bin gespannt!
Kommentare