BEM Naming convention

Wat zijn componenten?

Wat is een component?

Componenten zijn zelf-gedefinieerde delen van een webpagina, die volledig op zich staan.

Wat is een component?

Wat is een component?

Wat is een component?

Wat is een component?

Wat is een component?

Een component kan herbruikt worden visueel naast andere componenten, op andere pagina's en er bestaan ook variaties van.

 

Van zodra iets herbruikbaar wordt, kan je het een "component" gaan noemen. Hoe klein een component ook is.

Wat is een component?

Component classes herbruiken

Componenten benoemen

Componenten kunnen we gaan benoemen in HTML met logische classes.

<article class="card">
  <h3>Card title</h3>
  <h4>Secondary title</h4>
  <p>Greyhound divisively hello coldly wonderfully marginally far upon excluding.</p>
  <a href="...">Action 1</a><a href="...">Action 2</a>
</article>
.card {
  border: 1px solid #333;
  padding: 1rem;
  background: #FFF;
}

.card h3 {
  font-size: 2rem;
}

.card a {
  color: blue;
  text-transform: uppercase;
}

Componenten benoemen

Met dezelfde CSS kunnen we dan componenten gaan hergebruiken.

<article class="card">
  <h3>Card title</h3>
  <h4>Secondary title</h4>
  <p>Greyhound divisively hello coldly wonderfully marginally far upon excluding.</p>
  <a href="...">Action 1</a><a href="...">Action 2</a>
</article>

<article class="card-2">
  <h3>Card title</h3>
  <h4>Secondary title</h4>
  <p>Greyhound divisively hello coldly wonderfully marginally far upon excluding.</p>
  <a href="...">Action 1</a><a href="...">Action 2</a>
</article>

Componenten benoemen

Met dezelfde CSS kunnen we dan componenten gaan hergebruiken.

<article class="card">
  <h3>Card title</h3>
  <h4>Secondary title</h4>
  <p>Greyhound divisively hello coldly wonderfully marginally far upon excluding.</p>
  <a href="...">Action 1</a><a href="...">Action 2</a>
</article>

<article class="card">
  <h3>Card title</h3>
  <h4>Secondary title</h4>
  <p>Greyhound divisively hello coldly wonderfully marginally far upon excluding.</p>
  <a href="...">Action 1</a><a href="...">Action 2</a>
</article>

Wat is BEM?

Wat is BEM?

Een naamgevings conventie wanneer we onze classes schrijven.

  1. Maakt je selectors meer verstaanbaar door gewoon de naam te lezen.
  2. Maakt duidelijk op welke plaats je classes kunt hergebruiken in HTML
  3. Het maakt de relaties duidelijk tussen classes.

Wat is BEM?

Wij gaan kiezen voor de Block - Element - Modifier methodologie, kortweg de BEM methodologie.

 

Wat is BEM?

Let op: Wil je een component benoemen met 2 woorden, gebruik dan "-". 

.navbar {}
.nav-bar {}
.nav_bar {}

Onderdelen van componenten

In BEM kan je met "__" een onderdeel van een component benoemen in een class.

Onderdelen van componenten

.component__onderdeel {
  ...
}

Toegepast op onze card-component:

 

Onderdelen van componenten

<article class="card">
  <h3 class="card__title">Card title</h3>
  <h4 class="card__subtitle">Secondary title</h4>
  <p class="card__text">Greyhound divisively hello coldly wonderfully marginally far upon excluding.</p>
  <a class="card__button" href="...">Action 1</a><a href="...">Action 2</a>
</article>

<article class="card">
  <h3 class="card__title">Card title</h3>
  <h4 class="card__subtitle">Secondary title</h4>
  <p class="card__text">Greyhound divisively hello coldly wonderfully marginally far upon excluding.</p>
  <a class="card__button" href="...">Action 1</a><a href="...">Action 2</a>
</article>

4 extra BEM classes

Voordeel: een lagere CSS-specificiteit!

Onderdelen van componenten

.card {
  border: 1px solid #333;
  padding: 1rem;
  background: #FFF;
}

.card h3 {
  font-size: 2rem;
}

.card a {
  color: blue;
  text-transform: uppercase;
}
.card {
  border: 1px solid #333;
  padding: 1rem;
  background: #FFF;
}

.card__title {
  font-size: 2rem;
}

.card__button {
  color: blue;
  text-transform: uppercase;
}

0 - 1 - 1

0 - 1 - 1

0 - 1 - 0

0 - 1 - 0

BEM

Geen BEM

Voordeel: meer leesbare CSS

Onderdelen van componenten

.card {
  border: 1px solid #333;
  padding: 1rem;
  background: #FFF;
}

.card h3 {
  font-size: 2rem;
}

.card a {
  color: blue;
  text-transform: uppercase;
}
.card {
  border: 1px solid #333;
  padding: 1rem;
  background: #FFF;
}

.card__title {
  font-size: 2rem;
}

.card__button {
  color: blue;
  text-transform: uppercase;
}

Een link in een kaart?

Een knop in een kaart!

BEM

Geen BEM

Voordeel: Element-onafhankelijke classes

Onderdelen van componenten

.card {
  border: 1px solid #333;
  padding: 1rem;
  background: #FFF;
}

.card h3 {
  font-size: 2rem;
}

.card button,
.card a {
  color: blue;
  text-transform: uppercase;
}
.card {
  border: 1px solid #333;
  padding: 1rem;
  background: #FFF;
}

.card__title {
  font-size: 2rem;
}

.card__button {
  color: blue;
  text-transform: uppercase;
}

2 elementen die er hetzelfde uitzien

element-onafhankelijk

BEM

Geen BEM

element-onafhankelijk

Let op: Wees pragmatisch!

BEM-classes hebben maximaal 2 onderdelen

 

Onderdelen van componenten

.card {}
.card__title {}
.title__icon {}
.card__title__icon {}

Variaties van componenten

Variaties van componenten

In BEM kan je met "--" een variatie van een component benoemen met een class.

.component--variatie {
  ...
}

Een variatie wordt dan geïdentificeerd door een extra class.

<article class="green-card">
  <h3>Card title</h3>
  <h4>Secondary title</h4>
  <p>Greyhound divisively hello coldly wonderfully marginally far upon excluding.</p>
  <a href="...">Action 1</a><a href="...">Action 2</a>
</article>

<article class="card">
  <h3>Card title</h3>
  <h4>Secondary title</h4>
  <p>Greyhound divisively hello coldly wonderfully marginally far upon excluding.</p>
  <a href="...">Action 1</a><a href="...">Action 2</a>
</article>

<article class="card">
  <h3>Card title</h3>
  <h4>Secondary title</h4>
  <p>Greyhound divisively hello coldly wonderfully marginally far upon excluding.</p>
  <a href="...">Action 1</a><a href="...">Action 2</a>
</article>

<article class="card">
  <h3>Card title</h3>
  <h4>Secondary title</h4>
  <p>Greyhound divisively hello coldly wonderfully marginally far upon excluding.</p>
  <a href="...">Action 1</a><a href="...">Action 2</a>
</article>

Variaties van componenten

<article class="card card--green">
  <h3>Card title</h3>
  <h4>Secondary title</h4>
  <p>Greyhound divisively hello coldly wonderfully marginally far upon excluding.</p>
  <a href="...">Action 1</a><a href="...">Action 2</a>
</article>

<article class="card">
  <h3>Card title</h3>
  <h4>Secondary title</h4>
  <p>Greyhound divisively hello coldly wonderfully marginally far upon excluding.</p>
  <a href="...">Action 1</a><a href="...">Action 2</a>
</article>

<article class="card">
  <h3>Card title</h3>
  <h4>Secondary title</h4>
  <p>Greyhound divisively hello coldly wonderfully marginally far upon excluding.</p>
  <a href="...">Action 1</a><a href="...">Action 2</a>
</article>

<article class="card">
  <h3>Card title</h3>
  <h4>Secondary title</h4>
  <p>Greyhound divisively hello coldly wonderfully marginally far upon excluding.</p>
  <a href="...">Action 1</a><a href="...">Action 2</a>
</article>

Een class variatie toevoegen is slechts 1 class toevoegen: "card--green"

Variaties van componenten

<article class="card card--green">
  <h3>Card title</h3>
  <h4>Secondary title</h4>
  <p>Greyhound divisively hello coldly wonderfully marginally far upon excluding.</p>
  <a href="...">Action 1</a><a href="...">Action 2</a>
</article>

<article class="card">
  <h3>Card title</h3>
  <h4>Secondary title</h4>
  <p>Greyhound divisively hello coldly wonderfully marginally far upon excluding.</p>
  <a href="...">Action 1</a><a href="...">Action 2</a>
</article>

<article class="card">
  <h3>Card title</h3>
  <h4>Secondary title</h4>
  <p>Greyhound divisively hello coldly wonderfully marginally far upon excluding.</p>
  <a href="...">Action 1</a><a href="...">Action 2</a>
</article>

<article class="card">
  <h3>Card title</h3>
  <h4>Secondary title</h4>
  <p>Greyhound divisively hello coldly wonderfully marginally far upon excluding.</p>
  <a href="...">Action 1</a><a href="...">Action 2</a>
</article>
.card {
  border: 1px solid #333;
  padding: 1rem;
  background: #FFF;
}

.card h3 {
  font-size: 2rem;
}

.card a {
  color: blue;
  text-transform: uppercase;
}

.card--green {
  background: green;
  color: #FFF;
}

.card--green a {
  color: green;
}
.card--green {
  background: green;
  color: #FFF;
}

.card--green a {
  color: green;
}

Variaties van componenten

Let op: Laat de class "card" staan in de HTML, zo hoef je enkel de CSS te schrijven voor die de variatie vereist.

<article class="card card--green">
  <h3 class="card__title">Card title</h3>
  <h4 class="card__subtitle">Secondary title</h4>
  <p class="card__text">Greyhound divisively hello coldly wonderfully marginally far upon excluding.</p>
  <a class="card__button" href="...">Action 1</a><a href="...">Action 2</a>
</article>

<article class="card">
  <h3 class="card__title">Card title</h3>
  <h4 class="card__subtitle">Secondary title</h4>
  <p class="card__text">Greyhound divisively hello coldly wonderfully marginally far upon excluding.</p>
  <a class="card__button" href="...">Action 1</a><a href="...">Action 2</a>
</article>

<article class="card">
  <h3 class="card__title">Card title</h3>
  <h4 class="card__subtitle">Secondary title</h4>
  <p class="card__text">Greyhound divisively hello coldly wonderfully marginally far upon excluding.</p>
  <a class="card__button" href="...">Action 1</a><a href="...">Action 2</a>
</article>

<article class="card">
  <h3 class="card__title">Card title</h3>
  <h4 class="card__subtitle">Secondary title</h4>
  <p class="card__text">Greyhound divisively hello coldly wonderfully marginally far upon excluding.</p>
  <a class="card__button" href="...">Action 1</a><a href="...">Action 2</a>
</article>
.card {
  border: 1px solid #333;
  padding: 1rem;
  background: #FFF;
}

.card h3 {
  font-size: 2rem;
}

.card a {
  color: blue;
  text-transform: uppercase;
}

.card--green {
  background: green;
  color: #FFF;
}

.card--green a {
  color: green;
}
.card--green {
  background: green;
  color: #FFF;
}

.card--green a {
  color: green;
}

Variaties van componenten

Of voeg meerdere variatie classes toe!

<article class="card card--green">
  <h3 class="card__title">Card title</h3>
  <h4 class="card__subtitle">Secondary title</h4>
  <p class="card__text">Greyhound divisively hello coldly wonderfully marginally far upon excluding.</p>
  <a class="card__button" href="...">Action 1</a><a href="...">Action 2</a>
</article>

<article class="card card--center">
  <h3 class="card__title">Card title</h3>
  <h4 class="card__subtitle">Secondary title</h4>
  <p class="card__text">Greyhound divisively hello coldly wonderfully marginally far upon excluding.</p>
  <a class="card__button" href="...">Action 1</a><a href="...">Action 2</a>
</article>

<article class="card">
  <h3 class="card__title">Card title</h3>
  <h4 class="card__subtitle">Secondary title</h4>
  <p class="card__text">Greyhound divisively hello coldly wonderfully marginally far upon excluding.</p>
  <a class="card__button" href="...">Action 1</a><a href="...">Action 2</a>
</article>

<article class="card">
  <h3 class="card__title">Card title</h3>
  <h4 class="card__subtitle">Secondary title</h4>
  <p class="card__text">Greyhound divisively hello coldly wonderfully marginally far upon excluding.</p>
  <a class="card__button" href="...">Action 1</a><a href="...">Action 2</a>
</article>

Variaties van componenten

Of voeg meerdere variatie classes toe!

<article class="card card--green">
  <h3 class="card__title">Card title</h3>
  <h4 class="card__subtitle">Secondary title</h4>
  <p class="card__text">Greyhound divisively hello coldly wonderfully marginally far upon excluding.</p>
  <a class="card__button" href="...">Action 1</a><a href="...">Action 2</a>
</article>

<article class="card card--center">
  <h3 class="card__title">Card title</h3>
  <h4 class="card__subtitle">Secondary title</h4>
  <p class="card__text">Greyhound divisively hello coldly wonderfully marginally far upon excluding.</p>
  <a class="card__button" href="...">Action 1</a><a href="...">Action 2</a>
</article>

<article class="card">
  <h3 class="card__title">Card title</h3>
  <h4 class="card__subtitle">Secondary title</h4>
  <p class="card__text">Greyhound divisively hello coldly wonderfully marginally far upon excluding.</p>
  <a class="card__button" href="...">Action 1</a><a href="...">Action 2</a>
</article>

<article class="card">
  <h3 class="card__title">Card title</h3>
  <h4 class="card__subtitle">Secondary title</h4>
  <p class="card__text">Greyhound divisively hello coldly wonderfully marginally far upon excluding.</p>
  <a class="card__button" href="...">Action 1</a><a href="...">Action 2</a>
</article>
.card {
  border: 1px solid #333;
  padding: 1rem;
  background: #FFF;
}
...
.card--green {
  background: green;
  color: #FFF;
}
...
.card--center {
  text-align: center;
}

Variaties van componenten

Welke variatie kan ik nog maken door de 2 variatie-classes te combineren?

<article class="card card--green card--center">
  <h3 class="card__title">Card title</h3>
  <h4 class="card__subtitle">Secondary title</h4>
  <p class="card__text">Greyhound divisively hello coldly wonderfully marginally far upon excluding.</p>
  <a class="card__button" href="...">Action 1</a><a href="...">Action 2</a>
</article>

Een groene card die ook gecentreerd is!

Variaties van componenten

Hoeveel variaties van de "card" zijn mogelijk als we deze CSS extra toevoegen?

.card--funky {
  border-radius: 80px 0px 80px 0;
  border: 6px solid black;
}
.card {
  border: 1px solid #333;
  padding: 1rem;
  background: #FFF;
}

.card__title {
  font-size: 2rem;
}

.card__button {
  color: blue;
  text-transform: uppercase;
}

.card--green {
  background: green;
  color: #FFF;
}

.card--green .card__button {
  color: green;
}

.card--center {
  text-align: center;
}

.card--funky {
  border-radius: 80px 0px 80px 0;
  border: 6px solid black;
}

Let op: Wees pragmatisch!

BEM-classes hebben nog steeds maximaal 2 onderdelen

 

.card {}
.card--green
.card__title {}
.card--green__title {}
.card__title__icon {}

Variaties van componenten

Wanneer BEM gebruiken?

  • "-" Lezen we als een spatie.
  • Met "__" gaan we een onderdeel van een component benoemen in een class.
  • Met "--" gaan we een variatie van een component benoemen

Wanneer BEM gebruiken?

Wanneer

  1. je selectors niet meer verstaanbaar zijn
  2. je duidelijk wilt zien op welke plaats je specifieke classes kunt hergebruiken in HTML
  3. je bepaalde relaties tussen elementen duidelijk wilt maken in CSS

Wanneer BEM gebruiken?

Bem is geen regel, maar een mogelijkheid

.card {
  border: 1px solid #333;
  padding: 1rem;
  background: #FFF;
}

.card h3 {
  font-size: 2rem;
}

.card a {
  color: blue;
  text-transform: uppercase;
}
.card {
  border: 1px solid #333;
  padding: 1rem;
  background: #FFF;
}

.card__title {
  font-size: 2rem;
}

.card__button {
  color: blue;
  text-transform: uppercase;
}

BEM

Geen BEM

Wanneer BEM gebruiken?

BEM is een mogelijkheid waar je wel voor moet kiezen als het de herbruikbaarheid van je CSS te bevorderen in jouw context

.cards .card .button .icon {
  width: 2rem;
}

Geen BEM

.button__icon {
  width: 2rem;
}

BEM

Wanneer BEM gebruiken?

Wat als hetzelfde component (bv: een button) er hetzelfde uitziet als onderdeel van zowel een card als een hero?

 .hero__button

 .form__button

Wanneer BEM gebruiken?

.hero {...}

.hero__button {
  font-size: 2rem;
  border-radius: 10px;
  padding: 0.5rem 2rem;
}

.form {...}

.form__button {
  font-size: 2rem;
  border-radius: 10px;
  padding: 0.5rem 2rem;
}

Onnodig gebruik BEM

.hero {...}

.form {...}

.button {
  font-size: 2rem;
  border-radius: 10px;
  padding: 0.5rem 2rem;
}

Vermijd BEM-classes

indien onnodig

Wanneer BEM gebruiken?

Hoe zou je het volgende onderdeel benoemen in HTML?

a) site__header

b) header

c) header--blue

 ?

Hoe zou je het volgende onderdeel benoemen in HTML?

a) menu

b) header__menu

c) main-menu

 ?

Hoe zou je het volgende onderdelen benoemen in HTML?

a) menu-link

b) header__menu-link

c) link

 ?

Hoe zou je het volgende onderdelen benoemen in HTML?

a) menu-link--active

b) menu-link + menu-link--active

c) menu-link + menu-link--white

 ?

 .button

Hoe zou je het volgende onderdeel benoemen in HTML?

a) button button--outlined

b) button button__outlined

?

Wanneer BEM gebruiken?

BEM naming convention

By Lecturer GDM

BEM naming convention

  • 194