Przejdź do treści głównej
  • Strona główna
  • Blog
  • Kontakt

Co to jest BEM?

Data: 2021-10-24 | Autor: Admin | Kategoria: JavaScript

CSS BEM jak dobrze dopasowane książki

Czym jest ten BEM? BEM pochodzi od skrótu “Block Element Modifier” jest sposobem pisania klas w języku CSS, opisem architektury, a zarazem podejściem komponentowym do tworzonej strony lub aplikacji. Poprzez podział na bloki pisanie kodu staje o wiele prostsze, a kod jest bardziej czytelny, zrozumiały i łatwiejszy w zarządzaniu.

Główne składowe to bloki, elementy i modyfikatory, w języku CSS opisywane za pomocą klas.

Blok

Bloki są swego rodzaju modułami, są niezależne i mogą być używane ponownie w wielu miejscach, a nawet w wielu projektach. Część nazwy klasy odpowiadająca za blok powinna opisywać wykorzystanie, przeznaczenie modułu, a nie jego stan (czyli na przykład to jak wygląda). Nazwa bloku powinna być unikalna. Pomocna w nazywaniu bloku może być, odpowiedź na pytanie “Czym jest ten element?“. Na przykład odpowiadając sobie na postawione wcześniej pytanie: “To jest menu.”, “To jest button.”, “To jest formularz logowania …“. Możemy również umieszczać bloki w blokach, na przykład mieć w bloku “formularz” blok “button”. Najczęściej nie definiujemy jego marginesów oraz pozycji w innym bloku, to rodzic powinien o tym decydować, czyli inny blok lub element. W nazwie klasy do odsperowania wyrazów używa się najczęściej pojedynczego myślnika.

Przykład bloków:

<!--block o nazwie "loader"-->
<div class="loader">Loader...</div>

<!--blok o nazwie "button"-->
<button class="button">Dalej</button>

<!--zangieżdżony blok "company-logo" w bloku "menu"-->
<menu class="menu">
  <span class="company-logo" />
</menu>

Element

Elementy to integralne części bloku, które nie mogą istnieć bez niego, są natomiast opcjonalne. Tak jak ma to miejsce, w przypadku bloku określa przeznaczenie elementu, a nie jego stan. Elementy również mogą być zagnieżdżone w innych elementach, bez ograniczeń. W nazwie klasy element od bloku oddziela się najczęściej podwójnym podkreśleniem (__) i zapisuję się według schematu nazwa-bloku__nazwa-elementu

Przykład użycia elementów:

<article class="post">
  <h1 class="post__title">Post</h1>
  <p class="post__content">
    Treść posta
    <a href="/" class="post__link">Strona główna</a>
  </p>
</article>

W powyższym przykładzie mamy zagnieżdżone elementy w innych elementach, pomimo to struktura nazewnictwa jest płaska. I poprzez zmianę struktury w kodzie HTML nie musimy modyfikować zagnieżdżeń w CSS.

Przykład jak to wygląda w CSS:

.post {}
.post__title {}
.post__content {}
.post__link {}

Przykład jak to wygląda w SCSS:

.post {
    &__title {}
    &__content {}
    &__link {}
}

Modyfikator

Modyfikatory określają wygląd (rozmiar, kolor, szablon), stan (wczytuję, niedostępny) lub zachowanie (skierowane w dół). W nazwie klasy stosujemy podwójny myślnik (--) lub pojedyncze podkreślenie (_). Modyfikatory zawsze powinny występować w towarzystwie elementu lub bloku.

Podział modyfikatorów:

  • wartość jest zależna od umieszczenia modyfikatora, można to rozumieć w taki sposób, że gdy ktoś umieści modyfikator to nadaje wartość true na przykład
<button class="button button--disabled">Start</button>
  • wartość jest zależna od wartości w modyfikatorze, na przykład, gdy stosujemy różne szablony
<button class="button button--theme-dark">Start</button>

Czy powinien to być blok, czy element?

Jeżeli coś będzie używane w kilku miejscach, to powinniśmy użyć bloku. W innym przypadku śmiało możemy korzystać z elementów, nawet głęboko zagnieżdżonych.

Czy mogę łączyć blok i element innego bloku?

Można i czasami jest to wręcz wskazane, pomaga to uniknąć duplikacji oraz stworzyć zmodyfikowane wersje oparte na istniejących.

Poniżej przykład użycia bloku “button” oraz elementu login-form__button do potrzebnych modyfikacji. Blok “button” pozostaje uniwersalny i możemy go użyć gdzie indziej i na przykład jego położenie w bloku login-form możemy kontrolować za pomocą elementu login-form__button.

<form class="login-form">
  <input type="text" class="login-form__input">
  <button class="button login-form__button">Wyślij</button>
</form>

<!--inny przykład-->
<div class="products">
    <div class="products__product product">
        <h2 class="product__title"></h2>
        <h2 class="product__price"></h2>
    </div>
    <div class="products__product product">
        <h2 class="product__title"></h2>
        <h2 class="product__price"></h2>
    </div>
</div>

<!--Można do również oddzielić-->
<div class="products">
    <div class="products__product">
        <div class="product">
                <h2 class="product__title"></h2>
                <h2 class="product__price"></h2>
        </div>
    </div>
    <div class="products__product">
        <div class="product">
                <h2 class="product__title"></h2>
                <h2 class="product__price"></h2>
        </div>
    </div>
</div>

Jak nazywać elementy, gdy są głęboko zagnieżdżone i b są skomplikowane?

W przypadku gdy zawartość bloku nie jest zbyt skomplikowana, to każdy element możemy nazywać oddzielnie.

.header {}
.header__logo {}
.header__nav {}
.header__list {}
.header__item {}
.header__title {}

W innym przypadku możemy dodawać prefix do nazw elementów sugerujący, w których elementach się znajdują.

.header {}
.header__logo {}
.header__nav {}
.header__nav-list {}
.header__nav-item {}
.header__nav-item-title {}