# Bootstrap 5

# Разметка

# Минимальный шаблон

```html
<!doctype html> 
<html lang="ru">
<head>
    <title>Minimal HTML5 page</title>
    <meta  charset="utf-8">
    <meta  name="viewport" content="width=device-width, initial-scale=1">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet" crossorigin="anonymous">
</head>
<body>

  <!-- Вариант 1: Набор Bootstrap с Popper -->
  <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js" crossorigin="anonymous"></script>
  <!-- Вариант 2: Отдельные Popper и Bootstrap -->
  <!--
  <script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.11.8/dist/umd/popper.min.js" crossorigin="anonymous"></script>
  <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.min.js" crossorigin="anonymous"></script>
  -->
</body>
</html>
```

</body></html>

# Контейнеры

**Общая информация**

- необходимы при использовании сеточной системы
- используются для содержания, заполнения и (иногда) центрирования содержимого
- могут быть вложенными, но для большинства макетов это не требуется.

**Контрольные точки**

<table border="1" class="align-center" id="bkmrk-extra-small-extra-sm" style="border-collapse: collapse; width: 44.6429%;"><colgroup><col style="width: 35.0267%;"></col><col style="width: 33.374%;"></col><col style="width: 31.5993%;"></col></colgroup><tbody><tr><td>Extra small</td><td>  
</td><td class="align-right">&lt;576px</td></tr><tr><td>Small</td><td>-sm</td><td class="align-right">≥576px</td></tr><tr><td>Medium</td><td>-md</td><td class="align-right">≥768px</td></tr><tr><td>Large</td><td>-lg</td><td class="align-right">≥992px</td></tr><tr><td>Extra large</td><td>-xl</td><td class="align-right">≥1200px</td></tr><tr><td>Extra Extra large</td><td>-xxl</td><td class="align-right">≥1400px</td></tr></tbody></table>

**Типы контейнеров**

- .container - адаптивный контейнер фиксированной ширины. При изменении размеров браузера его ширина изменяется до новой ширины контрольной точки. При extra small выставляется 100% ширины.
- .container-{breakpoint}, который равен width: 100% до указанной контрольной точки
- .container-fluid, который равен width: 100% во всех контрольных точках

<table border="1" id="bkmrk-%3C576px-%E2%89%A5576px-%E2%89%A5768px" style="border-collapse: collapse; width: 100%; height: 238.375px;"><colgroup><col style="width: 14.3027%;"></col><col style="width: 14.3027%;"></col><col style="width: 14.3027%;"></col><col style="width: 14.3027%;"></col><col style="width: 14.3027%;"></col><col style="width: 14.3027%;"></col><col style="width: 14.3027%;"></col></colgroup><thead><tr style="height: 29.7969px;"><td style="height: 29.7969px;">  
</td><td style="height: 29.7969px;">&lt;576px</td><td style="height: 29.7969px;">≥576px</td><td style="height: 29.7969px;">≥768px</td><td style="height: 29.7969px;">≥992px</td><td style="height: 29.7969px;">≥1200px</td><td style="height: 29.7969px;">≥1400px</td></tr></thead><tbody><tr style="height: 29.7969px;"><td style="height: 29.7969px;">.container</td><td style="height: 29.7969px;">100%</td><td style="height: 29.7969px;">540px</td><td style="height: 29.7969px;">720px</td><td style="height: 29.7969px;">960px</td><td style="height: 29.7969px;">1140px</td><td style="height: 29.7969px;">1320px</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">.container-sm</td><td style="height: 29.7969px;">100%</td><td style="height: 29.7969px;">540px</td><td style="height: 29.7969px;">720px</td><td style="height: 29.7969px;">960px</td><td style="height: 29.7969px;">1140px</td><td style="height: 29.7969px;">1320px</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">.container-md</td><td style="height: 29.7969px;">100%</td><td style="height: 29.7969px;">100%</td><td style="height: 29.7969px;">720px</td><td style="height: 29.7969px;">960px</td><td style="height: 29.7969px;">1140px</td><td style="height: 29.7969px;">1320px</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">.container-lg</td><td style="height: 29.7969px;">100%</td><td style="height: 29.7969px;">100%</td><td style="height: 29.7969px;">100%</td><td style="height: 29.7969px;">960px</td><td style="height: 29.7969px;">1140px</td><td style="height: 29.7969px;">1320px</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">.container-xl</td><td style="height: 29.7969px;">100%</td><td style="height: 29.7969px;">100%</td><td style="height: 29.7969px;">100%</td><td style="height: 29.7969px;">100%</td><td style="height: 29.7969px;">1140px</td><td style="height: 29.7969px;">1320px</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">.container-xxl</td><td style="height: 29.7969px;">100%</td><td style="height: 29.7969px;">100%</td><td style="height: 29.7969px;">100%</td><td style="height: 29.7969px;">100%</td><td style="height: 29.7969px;">100%</td><td style="height: 29.7969px;">1320px</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">.container-fluid</td><td style="height: 29.7969px;">100%</td><td style="height: 29.7969px;">100%</td><td style="height: 29.7969px;">100%</td><td style="height: 29.7969px;">100%</td><td style="height: 29.7969px;">100%</td><td style="height: 29.7969px;">100%</td></tr></tbody></table>

# Сетки

- Сетка внутри контейнера, относительно ширины которого рассчитываются размеры колонок.
- Для строки - класс row, для столбца - класс col.
- По документации в строке может быть до 12 ячеек, но если их больше, и текст внутри короткий - визуально в строку помещается больше столбцов.
- Визуально внутри row может быть несколько строк при превышении 12.
- Одна строка всегда находится под другой.

**Минимальный пример сетки:**

```html
<div class="container">
  <div class="row">
    <div class="col">
      Колонка
    </div>
    <div class="col">
      Колонка
    </div>
    <div class="col">
      Колонка
    </div>
  </div>
</div>
```

- Модификаторы относительно размера окна, контрольные точки аналогичные контрольным точкам для сетки.
- Для контрольной точки может быть дополнительный параметр - кол-во занимаемых ячеек. Например col-md-6.
- Поведение: до размера окна, указанного в контрольной точке ширина 12, после - в соответствии с цифрой. Но за счет комбинации классов можно сделать, чтобы например на большом было 4 столбца один за одним, меньше - 2 и 2, еще меньше - 1,1,1,1

```html
<div class="row">
   <div class="col-md-6 col-xl-3">one</div>
   <div class="col-md-6 col-xl-3">two</div>
   <div class="col-md-6 col-xl-3">three</div>
   <div class="col-md-6 col-xl-3">four</div>
</div>
```

- Вместо цифры может быть -auto в этом случае ширина зависит от контента
- Может быть без контрольной точки

```html
<div class="row">
    <div class="col-8">col-8</div>
    <div class="col-4">col-4</div>
</div>
```

- Может быть без доп. параметра, но тогда должен быть предшествующий с полным набором параметров

```html
<div class="container text-center">
  <div class="row">
    <div class="col-sm-8">col-sm-8</div>
    <div class="col-sm-4">col-sm-4</div>
  </div>
  <div class="row">
    <div class="col-sm">col-sm</div>
    <div class="col-sm">col-sm</div>
    <div class="col-sm">col-sm</div>
  </div>
</div>
```

- В этом случае берется предыдущее распределение и применяется к неуказанному

За счет применения класса row-cols-\* у div row фиксируется визуальное количество столбцов в одной строке (по-моему это повтор функционала). Хотя поведение данного класса несколько неясно: для такой настройки

```html
<div class="row row-cols-4">
    <div class="col">Колонка</div>
    <div class="col">Колонка</div>
    <div class="col-6">Колонка</div>
    <div class="col">Колонка</div>
  </div>
```

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

Строки могут быть вложенными.

# Колонки

**Вертикальное выравнивание**

**Единый класс для строки**

Единый класс для строки с фиксированной высотой строки настраивается общее выравнивание

<table border="1" id="bkmrk-align-items-start-%D0%B2%D0%B2" style="border-collapse: collapse; width: 73.9286%;"><colgroup><col style="width: 21.9337%;"></col><col style="width: 78.0692%;"></col></colgroup><tbody><tr><td>align-items-start</td><td>вверху</td></tr><tr><td>align-items-center</td><td>посередине</td></tr><tr><td>align-items-end</td><td>снизу</td></tr></tbody></table>

Например, устанавливается высота в 100px и выравнивание посередине для всех колонок

```html
<style>
  .middle-row{
    height: 100px;
    }
</style>
<div class="container">
  <div class="row align-items-center middle-row">
    <div class="col-sm-8">col-sm-8</div>
    <div class="col-sm-4">col-sm-4</div>
  </div>
</div>
```

**Индивидуальное выравнивание каждого столбца**

Класс align-self-\* который применяется для класса столбца

```html
<style>
  .middle-row{
    height: 100px;
    }
</style>
<div class="container">
  <div class="row align-items-center middle-row">
    <div class="col-sm-8">col-sm-8</div>
    <div class="col-sm-4 align-self-end">col-sm-4</div>
  </div>
</div>
```

**Горизонтальное выравнивание**

justify-content-\* для выравнивания всех столбцов в классе row

<table border="1" id="bkmrk-justify-content-star" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 26.2501%;"></col><col style="width: 73.8691%;"></col></colgroup><tbody><tr><td>justify-content-start</td><td>Колонки смещены в начало, между колонками нет промежутка</td></tr><tr><td>justify-content-center</td><td>Колонки в центре, между колонками нет промежутка</td></tr><tr><td>justify-content-end</td><td>Колонки смещены в конец, между колонками нет промежутка</td></tr><tr><td>justify-content-around</td><td>Последующие три класса с промежутками (считая промежуток как колонку) и выравниванием относительно этого. +/- для использования.</td></tr><tr><td>justify-content-between</td><td>  
</td></tr><tr><td>justify-content-evenly</td><td>  
</td></tr></tbody></table>

**Порядок отображения**

Классы order- , поддерживают контрольные точки. Элементы без порядка имеют приоритет выше.

```html
<div class="row">
    <div class="col">
      Первый в DOM, первый в отображении
    </div>
    <div class="col order-5">
      Второй в DOM, последний в отображении
    </div>
    <div class="col order-1">
      Третий в DOM, третий в отображении
    </div>
    <div class="col">
      Последний в DOM, второй в отображении
    </div>
  </div>
```

Однако классы order-first и order-last имеют наивысший приоритет.

**Смещение колонок**

Классы offset-контр\_точка-\* смещают колонку влево на указанную ширину.

```html
<div class="row">
    <div class="col-md-4">.col-md-4</div>
    <div class="col-md-4 offset-md-4">.col-md-4 .offset-md-4</div>
</div>
```

Класс offset-контр\_точка-0 сбрасывает смещение в контрольной точке.

**Автономное использование колонок**

Классы `.col-*` также могут использоваться вне `.row`, чтобы дать элементу определенную ширину. Когда классы колонок используются как непрямые дочерние элементы строки, отступы опускаются. Могут использоваться контрольные точки.

```html
<div class="col-3 p-3 mb-2">
  .col-3: ширина 25%
</div>

<div class="col-sm-9 p-3">
  .col-sm-9: ширина 75% выше контрольной точки sm
</div>
```

Плавающее изображение

```html
<div class="clearfix">
  <img src="..." class="col-md-6 float-md-end mb-3 ms-md-3" alt="...">
  <p>
    Абзац текста-заполнителя. Мы используем его здесь, чтобы показать использование класса clearfix. Мы добавляем здесь довольно много бессмысленных фраз, чтобы продемонстрировать, как столбцы здесь взаимодействуют с плавающим изображением.
  </p>
  <p>
    Как видите, абзацы изящно обтекают плавающее изображение. А теперь представьте, как это будет выглядеть с фактическим содержанием здесь, а не просто с этим скучным текстом-заполнителем, который продолжается и продолжается, но на самом деле не передает никакой осязаемой информации. Он просто занимает место, и его не стоит читать.
  </p>
  <p>
    И тем не менее, здесь вы, по-прежнему настойчив в чтении этот текст-заполнитель, в надежде еще несколько прозрений, или некоторые скрытые пасхальные яйца содержания. Возможно, шутка. К сожалению, здесь ничего этого нет.
  </p>
</div>
```

# Утилиты (доп. классы)

# Интервалы

**Поля и отступы**

Устанавливает margin (внешние границы) или padding (внутренние границы) элементу по умолчанию в диапазоне от .25rem до 3rem.

**Форматы классов:**

- xs: {property}{sides}-{size}
- sm, md, lg, xl и xxl {property}{sides}-{breakpoint}-{size}

**Значения составляющих:**

property

- m - для классов, которые устанавливают margin
- p - для классов, которые устанавливают padding

sides

- t - margin-top или padding-top
- b - margin-bottom или padding-bottom
- s - margin-left или padding-left в LTR, margin-right или padding-right в RTL
- e - margin-right или padding-right в LTR, margin-left или padding-left в RTL
- x - \*-left и \*-right
- y - \*-top и \*-bottom
- blank - margin или padding со всех 4 сторон элемента

size

- 0 - устраняет margin или padding, установив его на 0
- 1 - margin или padding = $spacer \* .25
- 2 - margin или padding = $spacer \* .5
- 3 - margin или padding = $spacer
- 4 - margin или padding = $spacer \* 1.5
- 5 - margin или padding = $spacer \* 3
- auto - margin = авто

**Пример:**

```html
.mt-0 {
  margin-top: 0 !important;
}

.ms-1 {
  margin-left: ($spacer * .25) !important;
}

.px-2 {
  padding-left: ($spacer * .5) !important;
  padding-right: ($spacer * .5) !important;
}

.p-3 {
  padding: $spacer !important;
}
```

**Отрицательные отступы**

Margin могут использовать отрицательные значения (padding не может). Эти отрицательные поля отключены по умолчанию, но могут быть включены в Sass, установив $enable-negative-margins: true. Синтаксис почти такой же, как у утилит с положительным значением поля по умолчанию, но с добавлением n перед запрошенным размером.

**Пример**

Класс, противоположный .mt-1:

```html
.mt-n1 {
  margin-top: -0.25rem !important;
}
```