Как верстать компонентами

Как при вёрстке, так и при дизайне, большую роль играют компоненты. Компонент — это элемент дизайна, который можно использовать отдельно от других. Например, каждая кнопка плеера — это отдельный компонент. Её можно поместить в любое место плеера и она от этого не перестанет быть кнопкой:

Несколько компонентов можно объединить в один большой. В этом плеере можно выделить несколько вот таких составных компонентов:

Кнопки слева | Панель просмотра | Кнопки справа

Объединяются компоненты именно так, потому что:

Кнопки слева выровнены относительно друг друга. Нельзя просто взять и подвинуть одну из них по вертикали или горизонтали, не нарушив визуальную целостность композиции.

Внутри панели просмотра время и полоска с прогрессом также выровнены по вертикали. Кроме того, они связаны по смыслу. Если сильно отодвинуть цифры от полоски прогресса, то не ясно будет, что эти числа означают. Полоска прогресса и цифры композиционно сильно связаны и образуют единый составной компонент.

Чтобы двигать составной компонент было проще, его помещают в отдельный <div>.

Каждому составному компоненту — свой <div>.

Компонент Панель просмотра состоит из трёх компонентов по-меньше. Каждый из них тоже достоин своего отдельного <div>:

Время просмотра | Полоска просмотра | Длительность фильма

Компоненты и вёрстка

Компоненты и вёрстка тесно связаны друг с другом. Прежде чем верстать определитесь со структурой компонентов. Так она выглядит для плеера:

Плеер
├── Экран
└── Нижняя панель управления
    ├── Кнопки слева
    |   ├── Кнопка Play
    |   └── Кнопка Volume
    ├── Панель просмотра
    |   ├── Время просмотра
    |   ├── Полоска просмотра
    |   └── Длительность фильма
    └── Кнопки справа
        └── Кнопка fullscreen

Теперь переводим на английский название каждого компонента и объединяем слова в kebab-case. Получим названия будущих CSS-классов:

player
├── screen
└── bottom-controls
    ├── left-buttons
    |   ├── play-button
    |   └── volume-button
    ├── viewing-panel
    |   ├── viewing-time
    |   ├── viewing-progressbar
    |   └── video-duration
    └── right-buttons
        └── fullscreen-button

Следующий шаг — каждому компоненту даём свой <div> и получаем скелет вёрстки:

<div class="player">
  <div class="screen"></div>
  <div class="bottom-controls">
    <div class="left-buttons">
      <div class="play-button"></div>
      <div class="volume-button"></div>
    </div>
    <div class="viewing-panel">
      <div class="viewing-time"></div>
      <div class="viewing-progressbar"></div>
      <div class="video-duration"></div>
    </div>
    <div class="right-buttons">
      <div class="fullscreen-button"></div>
    </div>
  </div>
</div>

Взглянув на макет можно заметить, что три кнопки play, volume и fullscreen выглядят похоже. Все они белого цвета и одного размера. Чтобы не стилизовать каждую кнопку отдельно объединим их общим классом, а старое названием сделаем модификатором:

    <div class="left-buttons">
      <div class="player-button play"></div>
      <div class="player-button volume"></div>
    </div>
    ...
    <div class="right-buttons">
      <div class="player-button fullscreen"></div>
    </div>

Теперь осталось добавить немного стилей. Каждый тег уже получил свой класс, а значит не составит труда добраться до любого из них через CSS-селектор:

.player {
  …
}
.player .bottom-controls {
  …
}
.player .player-button{
  …
}
.player .player-button.play{
  …
}

Здесь все селекторы начинаются с класса .player. Сделано это намеренно, чтобы избежать конфликта с другими тегами/компонентами на странице.

Получается, что верстать можно пользуясь одним и тем же простым алгоритмом:

Макет → Иерархия компонентов → HTML-теги с классами → CSS правила

Алгоритм действий прост и стабильно даёт хороший результат. В такой вёрстке легко ориентироваться, её легко стилизовать, в неё просто добавлять компоненты. Секрет здесь кроется в особой структуре, основанной на визуальных компонентах и связях между ними.

Начинай вёрстку с иерархии компонентов

PS. В статье намеренно не используется методология БЭМ.

Для крупных порталов БЭМ действительно нужен, полезен и оправдан. Но на обычных сайтах БЭМ часто приводит к переусложнённой вёрстке с километровыми названиями классов. В вёрстке становится трудно ориентироваться, её довольно сложно править. Не всегда оно того стоит.


Попробуйте бесплатные уроки по Python

Получите крутое код-ревью от практикующих программистов с разбором ошибок и рекомендациями, на что обратить внимание — бесплатно.

Переходите на страницу учебных модулей «Девмана» и выбирайте тему.