Bootstrap 5: Основы верстки

Теория: Адаптивность

Адаптивность — неотъемлемая часть любого современного сайта. Разберемся как она работает в Bootstrap.

В своей основе Bootstrap использует подход Mobile First. Это означает, что вначале указывается код для мобильных устройств, а потом код для десктопа. Возникает вопрос: «А причем тут Mobile First, если необходимо только использовать нужные классы?». Ответ на данный вопрос кроется в том, с какими разрешениями экрана работает Bootstrap. Таких разрешений в последней версии пять:

  • Extra small. Ширина viewport меньше 576px. Внутри Bootstrap такое разрешение никак не маркируется. Данный тип является значением по умолчанию. Ширина .container: 100%
  • Small. Ширина viewport больше или равна 576px. Внутри Bootstrap такое разрешение маркируется как -sm-. Ширина .container: 540px
  • Medium. Ширина viewport больше или равна 768px. Внутри Bootstrap такое разрешение маркируется как -md-. Ширина .container: 720px
  • Large. Ширина viewport больше или равна 992px. Внутри Bootstrap такое разрешение маркируется как -lg-. Ширина .container: 960px
  • Extra large. Ширина viewport больше или равна 1200px. Внутри Bootstrap такое разрешение маркируется как -xl-. Ширина .container: 1140px
ПрефиксШирина viewportШирина container
-sm->=576px540px
-md->=768px720px
-lg->=992px960px
-xl->=1200px1140px

Эти префиксы, которые есть у разрешений, используются внутри сеток и утилит. Утилиты будут изучены в одном из следующих уроков.

Важно: используя данные префиксы важно помнить о подходе Mobile First. В этом подходе префиксы влияют на стили только для определенных ширин viewport’а и более. Например, классы с префиксом -md- не будут использоваться при разрешении менее 768px.

Используем изученные префиксы на колонках. К каждой из них можно добавить нужный префикс, тем самым добиваясь различного отображения на разных разрешениях экрана.

<div class="container">
  <div class="row">
    <aside class="col-12 col-md-3 col-lg-2">
      <!-- Боковая панель -->
    </aside>
    <main class="col">
      <!-- Основной контент -->
    </main>
  </div>
</div>

В этом примере боковая панель работает по следующему алгоритму:

  • При ширине менее 768px панель занимает всю доступную ширину viewport. За это отвечает класс .col-12
  • При ширине от 768px до 992px панель занимает 3 из 12 колонок в сетке. За это отвечает класс .col-md-3
  • При ширине от 992px панель занимает 2 из 12 колонок в сетке. За это отвечает класс .col-lg-2
<div class="container">
  <div class="row">
    <aside class="col-12 col-md-3 col-lg-2">
      <p>Боковая панель проекта. При разрешении менее 768px она начинает занимать всё доступное пространство</p></aside>
    <main class="col">
      <h1>Область с основным контентом</h1>
      <p>При использовании класса col колонка всегда будет растягиваться на всю доступную ширину в пределах контейнера</p>
    </main>
  </div>
</div>

Codepen

Перейдите на сайт Codepen, чтобы полноценно увидеть результат. Измените колонки так, как хочется.

row-cols-*

Начиная с версии Bootstrap 4.4 появились новые классы для создания колонок. Такими классами стали .row-cols-*, где * — значение от 1 до 6. Что же в них такого интересного? Они позволяют на уровне row задать количество колонок при использовании класса .col у дочерних элементов. Это полезно для создания секции однотипных элементов, которые имеют одинаковую ширину. Такими элементами могут являться карточки товара.

Как и у классов .col-*, классы вида .row-cols-* имеют префиксы, изученные в этом уроке. Их назначение и принцип работы ничем не отличается. Для примера создадим небольшой каталог, который:

  • При ширине больше 992px расставляет по 6 карточек в ряд
  • При ширине от 768px до 992px расставляет по 4 карточки в ряд
  • При ширине от 576px до 768px расставляет по 2 карточки в ряд
  • При ширине меньше 576px расставляет по 1 карточке в ряд

При таком количестве условий решение задачи сводится всего к добавлению пары классов на уровень row.

<div class="container">
  <div class="row row-cols-1 row-cols-sm-2 row-cols-md-4 row-cols-lg-6">
    <article class="col"><!-- Верстка карточки --></article>
    <article class="col"><!-- Верстка карточки --></article>
    <article class="col"><!-- Верстка карточки --></article>
    <article class="col"><!-- Верстка карточки --></article>
    <article class="col"><!-- Верстка карточки --></article>
    <article class="col"><!-- Верстка карточки --></article>
    <article class="col"><!-- Верстка карточки --></article>
    <article class="col"><!-- Верстка карточки --></article>
    <article class="col"><!-- Верстка карточки --></article>
    <article class="col"><!-- Верстка карточки --></article>
    <article class="col"><!-- Верстка карточки --></article>
    <article class="col"><!-- Верстка карточки --></article>
  </div>
</div>

Codepen

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

Важно: при использовании классов вида .row-cols-* значения .col-* у элементов игнорируется. Управление по размещению карточек есть только на уровне row