Bootstrap утилиты API

Служебный API - это инструмент на основе Sass для создания служебных классов.

Утилиты Bootstrap создаются с помощью нашего utility API и могут использоваться для изменения или расширения нашего набора служебных классов по умолчанию через Sass. Наш utility API основан на серии карт Sass и функциях для создания семейств классов с различными опциями. Если вы не знакомы с Sass maps, прочтите официальную документацию по Sass, чтобы начать.

Карта $utilities содержит все утилиты и позже будет объединена с вашей пользовательской картой $utilities, если таковая имеется. Карта утилит содержит список групп утилит с ключами, которые допускают следующие параметры:

Опция Тип Значение по умолчанию Описание
property Требуется Имя свойства, это может быть строка или массив строк (например, горизонтальные отступы или поля).
values Требуется Список значений или карта, если вы не хотите, чтобы имя класса совпадало со значением. Если null используется в качестве ключа карты, class не добавляется к имени класса.
class Необязательно null Имя сгенерированного класса. Если не указано и property представляет собой массив строк, class по умолчанию будет использоваться первый элемент property массива. Если не указан и property представляет собой строку, то для values имен используются class ключи.
css-var Необязательно false Логическое значение для генерации CSS-переменных вместо CSS-правил.
css-variable-name Необязательно null Пользовательское имя без префикса для переменной CSS внутри набора правил.
local-vars Необязательно null Карта локальных переменных CSS для генерации в дополнение к правилам CSS.
state Необязательно null Список вариантов псевдокласса (например, :hover или :focus) для генерации.
responsive Необязательно false Логическое значение, указывающее, следует ли создавать адаптивные классы.
rfs Необязательно false Логическое значение для включения плавного масштабирования с помощью RFS.
print Необязательно false Логическое значение, указывающее, нужно ли создавать классы печати.
rtl Необязательно true Логическое значение, указывающее, следует ли сохранять утилиту в RTL.

Объясненный API

Все переменные утилит добавляются к переменной $utilities в таблице стилей _utilities.scss. Каждая группа утилит выглядит примерно так:

$utilities: (
  "opacity": (
    property: opacity,
    values: (
      0: 0,
      25: .25,
      50: .5,
      75: .75,
      100: 1,
    )
  )
);

Которая выводит следующее:

.opacity-0 { opacity: 0; }
.opacity-25 { opacity: .25; }
.opacity-50 { opacity: .5; }
.opacity-75 { opacity: .75; }
.opacity-100 { opacity: 1; }

Свойство

Для любой утилиты должен быть установлен требуемый ключ property, и он должен содержать допустимое свойство CSS. Это свойство используется в наборе правил сгенерированной утилиты. Когда class ключ опущен, он также служит именем класса по умолчанию. Рассмотрим утилиту text-decoration:

$utilities: (
  "text-decoration": (
    property: text-decoration,
    values: none underline line-through
  )
);

Вывод:

.text-decoration-none { text-decoration: none !important; }
.text-decoration-underline { text-decoration: underline !important; }
.text-decoration-line-through { text-decoration: line-through !important; }

Значения

Используйте values ключ, чтобы указать, какие значения для указанного property следует использовать в сгенерированных именах классов и правилах. Может быть списком или картой (задается в утилитах или в переменной Sass).

В виде списка, как с text-decoration утилитами:

values: none underline line-through

В виде карты, как с утилитами opacity:

values: (
  0: 0,
  25: .25,
  50: .5,
  75: .75,
  100: 1,
)

В качестве переменной Sass, которая задает список или карту, как в утилитах position:

values: $position-values

Класс

Используйте class опцию, чтобы изменить префикс класса, используемый в скомпилированном CSS. Например, чтобы изменить с .opacity-* на .o-*:

$utilities: (
  "opacity": (
    property: opacity,
    class: o,
    values: (
      0: 0,
      25: .25,
      50: .5,
      75: .75,
      100: 1,
    )
  )
);

Вывод:

.o-0 { opacity: 0 !important; }
.o-25 { opacity: .25 !important; }
.o-50 { opacity: .5 !important; }
.o-75 { opacity: .75 !important; }
.o-100 { opacity: 1 !important; }

Если class: null, генерирует классы для каждого из values ключей:

$utilities: (
  "visibility": (
    property: visibility,
    class: null,
    values: (
      visible: visible,
      invisible: hidden,
    )
  )
);

Вывод:

.visible { visibility: visible !important; }
.invisible { visibility: hidden !important; }

Утилиты для переменных CSS

Установите для css-var параметра boolean значение true, и API будет генерировать локальные CSS-переменные для данного селектора вместо обычных property: value правил. Добавьте необязательный параметр, css-variable-name чтобы задать имя переменной CSS, отличное от имени класса.

Рассмотрим наши .text-opacity-* утилиты. Если мы добавим css-variable-name опцию, мы получим пользовательский вывод.

$utilities: (
  "text-opacity": (
    css-var: true,
    css-variable-name: text-alpha,
    class: text-opacity,
    values: (
      25: .25,
      50: .5,
      75: .75,
      100: 1
    )
  ),
);

Вывод:

.text-opacity-25 { --bs-text-alpha: .25; }
.text-opacity-50 { --bs-text-alpha: .5; }
.text-opacity-75 { --bs-text-alpha: .75; }
.text-opacity-100 { --bs-text-alpha: 1; }

Локальные переменные CSS

Используйте опцию local-vars, чтобы указать карту Sass, которая будет генерировать локальные CSS-переменные в наборе правил служебного класса. Пожалуйста, обратите внимание, что для использования этих локальных переменных CSS в сгенерированных правилах CSS может потребоваться дополнительная работа. Например, рассмотрим наши .bg-* утилиты:

$utilities: (
  "background-color": (
    property: background-color,
    class: bg,
    local-vars: (
      "bg-opacity": 1
    ),
    values: map-merge(
      $utilities-bg-colors,
      (
        "transparent": transparent
      )
    )
  )
);

Вывод:

.opacity-0-hover:hover { opacity: 0 !important; }
.opacity-25-hover:hover { opacity: .25 !important; }
.opacity-50-hover:hover { opacity: .5 !important; }
.opacity-75-hover:hover { opacity: .75 !important; }
.opacity-100-hover:hover { opacity: 1 !important; }

Состояния

Используйте опцию state для создания вариантов псевдоклассов. Примерами псевдоклассов являются :hover и :focus. Когда предоставляется список состояний, для этого псевдокласса создаются имена классов. Например, чтобы изменить прозрачность при наведении курсора мыши, добавьте state: hover и вы получите .opacity-hover:hover в вашем скомпилированном CSS.

$utilities: (
  "opacity": (
    property: opacity,
    class: opacity,
    state: hover,
    values: (
      0: 0,
      25: .25,
      50: .5,
      75: .75,
      100: 1,
    )
  )
);

Вывод:

.opacity-0-hover:hover { opacity: 0 !important; }
.opacity-25-hover:hover { opacity: .25 !important; }
.opacity-50-hover:hover { opacity: .5 !important; }
.opacity-75-hover:hover { opacity: .75 !important; }
.opacity-100-hover:hover { opacity: 1 !important; }

Требуется несколько псевдоклассов? Используйте список состояний, разделенных пробелом: state: hover focus.

Адаптивный

Добавьте responsive логическое значение для создания адаптивных утилит (например, .opacity-md-25) для всех контрольных точек.

$utilities: (
  "opacity": (
    property: opacity,
    responsive: true,
    values: (
      0: 0,
      25: .25,
      50: .5,
      75: .75,
      100: 1,
    )
  )
);

Вывод:

.opacity-0 { opacity: 0 !important; }
.opacity-25 { opacity: .25 !important; }
.opacity-50 { opacity: .5 !important; }
.opacity-75 { opacity: .75 !important; }
.opacity-100 { opacity: 1 !important; }

@media (min-width: 576px) {
  .opacity-sm-0 { opacity: 0 !important; }
  .opacity-sm-25 { opacity: .25 !important; }
  .opacity-sm-50 { opacity: .5 !important; }
  .opacity-sm-75 { opacity: .75 !important; }
  .opacity-sm-100 { opacity: 1 !important; }
}

@media (min-width: 768px) {
  .opacity-md-0 { opacity: 0 !important; }
  .opacity-md-25 { opacity: .25 !important; }
  .opacity-md-50 { opacity: .5 !important; }
  .opacity-md-75 { opacity: .75 !important; }
  .opacity-md-100 { opacity: 1 !important; }
}

@media (min-width: 992px) {
  .opacity-lg-0 { opacity: 0 !important; }
  .opacity-lg-25 { opacity: .25 !important; }
  .opacity-lg-50 { opacity: .5 !important; }
  .opacity-lg-75 { opacity: .75 !important; }
  .opacity-lg-100 { opacity: 1 !important; }
}

@media (min-width: 1200px) {
  .opacity-xl-0 { opacity: 0 !important; }
  .opacity-xl-25 { opacity: .25 !important; }
  .opacity-xl-50 { opacity: .5 !important; }
  .opacity-xl-75 { opacity: .75 !important; }
  .opacity-xl-100 { opacity: 1 !important; }
}

@media (min-width: 1400px) {
  .opacity-xxl-0 { opacity: 0 !important; }
  .opacity-xxl-25 { opacity: .25 !important; }
  .opacity-xxl-50 { opacity: .5 !important; }
  .opacity-xxl-75 { opacity: .75 !important; }
  .opacity-xxl-100 { opacity: 1 !important; }
}

С принтами

Включение этой print опции также приведет к созданию служебных классов для печати, которые применяются только в @media print { ... } запросе мультимедиа.

$utilities: (
  "opacity": (
    property: opacity,
    print: true,
    values: (
      0: 0,
      25: .25,
      50: .5,
      75: .75,
      100: 1,
    )
  )
);

Вывод:

.opacity-0 { opacity: 0 !important; }
.opacity-25 { opacity: .25 !important; }
.opacity-50 { opacity: .5 !important; }
.opacity-75 { opacity: .75 !important; }
.opacity-100 { opacity: 1 !important; }

@media print {
  .opacity-print-0 { opacity: 0 !important; }
  .opacity-print-25 { opacity: .25 !important; }
  .opacity-print-50 { opacity: .5 !important; }
  .opacity-print-75 { opacity: .75 !important; }
  .opacity-print-100 { opacity: 1 !important; }
}

Важность

Все утилиты, создаваемые API, включают в себя !important чтобы гарантировать, что они переопределяют компоненты и классы-модификаторы, как задумано. Вы можете переключать этот параметр глобально с помощью $enable-important-utilities переменной (по умолчанию это значение равно true).

Использование API

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

Переопределение утилит

Переопределите существующие утилиты, используя тот же ключ. Например, если вам нужны дополнительные адаптивные классы утилит переполнения, вы можете сделать это:

$utilities: (
  "overflow": (
    responsive: true,
    property: overflow,
    values: visible hidden scroll auto,
  ),
);

Добавление утилит

Новые утилиты могут быть добавлены к $utilities карте по умолчанию с помощью map-merge. Сначала убедитесь, что наши необходимые файлы Sass и _utilities.scss импортированы, затем используйте map-merge для добавления дополнительных утилит. Например, вот как добавить отзывчивую cursor утилиту с тремя значениями.

@import "bootstrap/scss/functions";
@import "bootstrap/scss/variables";
@import "bootstrap/scss/variables-dark";
@import "bootstrap/scss/maps";
@import "bootstrap/scss/mixins";
@import "bootstrap/scss/utilities";

$utilities: map-merge(
  $utilities,
  (
    "cursor": (
      property: cursor,
      class: cursor,
      responsive: true,
      values: auto pointer grab,
    )
  )
);

@import "bootstrap/scss/utilities/api";

Изменение утилит

Измените существующие утилиты на $utilities карте по умолчанию с помощью функций map-get и map-merge. В приведенном ниже примере мы добавляем дополнительное значение к width утилитам. Начните с начальной map-merge, а затем укажите, какую утилиту вы хотите изменить. Оттуда извлеките вложенную "width" карту с помощью map-get, чтобы получить доступ к параметрам и значениям утилиты и изменить их.

@import "bootstrap/scss/functions";
@import "bootstrap/scss/variables";
@import "bootstrap/scss/variables-dark";
@import "bootstrap/scss/maps";
@import "bootstrap/scss/mixins";
@import "bootstrap/scss/utilities";

$utilities: map-merge(
  $utilities,
  (
    "width": map-merge(
      map-get($utilities, "width"),
      (
        values: map-merge(
          map-get(map-get($utilities, "width"), "values"),
          (10: 10%),
        ),
      ),
    ),
  )
);

@import "bootstrap/scss/utilities/api";

Включить адаптив

Вы можете включить адаптивные классы для существующего набора утилит, которые в настоящее время не являются адаптивными по умолчанию. Например, чтобы сделать border классы адаптивными:

@import "bootstrap/scss/functions";
@import "bootstrap/scss/variables";
@import "bootstrap/scss/variables-dark";
@import "bootstrap/scss/maps";
@import "bootstrap/scss/mixins";
@import "bootstrap/scss/utilities";

$utilities: map-merge(
  $utilities, (
    "border": map-merge(
      map-get($utilities, "border"),
      ( responsive: true ),
    ),
  )
);

@import "bootstrap/scss/utilities/api";

Теперь это позволит генерировать адаптивные варианты .border и .border-0 для каждой точки останова. Сгенерированный вами CSS будет выглядеть следующим образом:

.border { ... }
.border-0 { ... }

@media (min-width: 576px) {
  .border-sm { ... }
  .border-sm-0 { ... }
}

@media (min-width: 768px) {
  .border-md { ... }
  .border-md-0 { ... }
}

@media (min-width: 992px) {
  .border-lg { ... }
  .border-lg-0 { ... }
}

@media (min-width: 1200px) {
  .border-xl { ... }
  .border-xl-0 { ... }
}

@media (min-width: 1400px) {
  .border-xxl { ... }
  .border-xxl-0 { ... }
}

Переименовать утилиты

Отсутствуют утилиты версии 4 или используется другое соглашение об именовании? Utilities API можно использовать для переопределения результирующих class данных утилит — например, для переименования .ms-* утилит в устаревшие .ml-*:

@import "bootstrap/scss/functions";
@import "bootstrap/scss/variables";
@import "bootstrap/scss/variables-dark";
@import "bootstrap/scss/maps";
@import "bootstrap/scss/mixins";
@import "bootstrap/scss/utilities";

$utilities: map-merge(
  $utilities, (
    "margin-start": map-merge(
      map-get($utilities, "margin-start"),
      ( class: ml ),
    ),
  )
);

@import "bootstrap/scss/utilities/api";

Удалить утилиты

Удалите все утилиты по умолчанию с помощью map-remove() функции Sass.

@import "bootstrap/scss/functions";
@import "bootstrap/scss/variables";
@import "bootstrap/scss/variables-dark";
@import "bootstrap/scss/maps";
@import "bootstrap/scss/mixins";
@import "bootstrap/scss/utilities";

// Remove multiple utilities with a comma-separated list
$utilities: map-remove($utilities, "width", "float");

@import "bootstrap/scss/utilities/api";

Вы также можете использовать map-merge() функцию Sass и установить для группового ключа значениеnull, чтобы удалить утилиту.

@import "bootstrap/scss/functions";
@import "bootstrap/scss/variables";
@import "bootstrap/scss/variables-dark";
@import "bootstrap/scss/maps";
@import "bootstrap/scss/mixins";
@import "bootstrap/scss/utilities";

$utilities: map-merge(
  $utilities,
  (
    "width": null
  )
);

@import "bootstrap/scss/utilities/api";

Добавлять, удалять, изменять

Вы можете добавлять, удалять и изменять множество утилит одновременно с помощью map-merge() функции Sass. Вот как вы можете объединить предыдущие примеры в одну карту большего размера.

@import "bootstrap/scss/functions";
@import "bootstrap/scss/variables";
@import "bootstrap/scss/variables-dark";
@import "bootstrap/scss/maps";
@import "bootstrap/scss/mixins";
@import "bootstrap/scss/utilities";

$utilities: map-merge(
  $utilities,
  (
    // Remove the `width` utility
    "width": null,

    // Make an existing utility responsive
    "border": map-merge(
      map-get($utilities, "border"),
      ( responsive: true ),
    ),

    // Add new utilities
    "cursor": (
      property: cursor,
      class: cursor,
      responsive: true,
      values: auto pointer grab,
    )
  )
);

@import "bootstrap/scss/utilities/api";

Удалить утилиту в RTL

Некоторые крайние случаи усложняют стиль RTL, например, разрывы строк в арабском. Таким образом, утилиты можно удалить из вывода RTL, установив для rtl параметра значение false:

$utilities: (
  "word-wrap": (
    property: word-wrap word-break,
    class: text,
    values: (break: break-word),
    rtl: false
  ),
);

Вывод:

/* rtl:begin:remove */
.text-break {
  word-wrap: break-word !important;
  word-break: break-word !important;
}
/* rtl:end:remove */

Это ничего не выводит в RTL, благодаря директиве управления remove.