Индикатор загрузки main.loader
Расширение main.loader выводит вращающийся круговой индикатор загрузки. Индикатор показывают, пока выполняется запрос или загружается содержимое блока, например список документов, вкладка или превью файла.
За индикатор отвечает класс Loader. Он вставляет индикатор в указанный контейнер и плавно показывает и скрывает его.
Если на время загрузки нужно показать заготовку будущего содержимого, а не индикатор, используйте скелетон загрузки ui.system.skeleton. Если нужно показать долю выполненной работы, используйте индикаторы прогресса ui.progressbar и ui.progressround.
Подключить расширение
Если вы подключаете расширение из PHP, загрузите main.loader.
\Bitrix\Main\UI\Extension::load('main.loader');
В модульном JavaScript импортируйте класс Loader.
import { Loader } from 'main.loader';
Вне модульного JavaScript класс доступен как BX.Loader.
Показать индикатор
Создайте экземпляр Loader, передайте контейнер в параметре target и вызовите show(). Метод hide() скрывает индикатор. Вызывайте hide() и при ошибке запроса, иначе индикатор останется на странице.
Пример. Пока загружается список документов, в центре блока списка вращается индикатор. Код скрывает индикатор после ответа, в том числе после ошибки.
import { Loader } from 'main.loader';
// Контейнеру нужно позиционирование, например position: relative
const container = document.getElementById('documents');
const loader = new Loader({ target: container });
loader.show();
// loadDocuments() — функция вашего модуля, которая возвращает Promise с HTML списка
loadDocuments()
.then((html) => {
container.innerHTML = html;
})
.finally(() => {
loader.hide();
});
Индикатор с параметрами по умолчанию — серое вращающееся кольцо в центре контейнера.

По умолчанию индикатор размещается по центру контейнера с абсолютным позиционированием. Задайте контейнеру позиционирование, например position: relative, иначе индикатор встанет по центру ближайшего позиционированного предка.
Индикатор не перекрывает контейнер подложкой и не блокирует клики по его содержимому. Если на время загрузки действия нужно запретить, отключите элементы управления сами.
Вызывайте методы show() и hide() без ожидания. Методы возвращают Promise, который никогда не выполняется и не отклоняется, поэтому код после ожидания через await, then(), catch() или finally() не выполнится.
Класс Loader не вызывает событий, поэтому завершение анимации показа и скрытия отследить нельзя.
Передать параметры
Все параметры необязательны.
| Параметр | Тип | Описание |
|---|---|---|
target |
HTMLElement |
Контейнер, в который класс вставляет индикатор. Без контейнера в конструкторе или в show() индикатор не появится на странице, хотя isShown() вернет true |
size |
number |
Ширина и высота индикатора в пикселях. По умолчанию 110 |
color |
string |
CSS-цвет линии индикатора. По умолчанию #BFC3C8 |
strokeWidth |
number |
Толщина линии в единицах SVG, а не в пикселях. Линия масштабируется вместе с size. По умолчанию 1.5 |
mode |
string |
Режим размещения — inline или custom. Если не передан, индикатор стоит по центру контейнера |
offset |
object |
Сдвиг индикатора — строки CSS в полях top и left, например { top: '20px' }. Числа не применяются |
Режим размещения задает, как индикатор стоит в контейнере.
-
Без
mode— индикатор стоит по центру контейнера. Значенияoffsetсдвигают его через отступыmargin-topиmargin-left. -
inline— индикатор встает в поток содержимого, как обычный элемент, и не перекрывает соседние элементы. Значенияoffsetсдвигают его относительно места в потоке через свойстваtopиleft. -
custom— индикатор стоит в левом верхнем углу контейнера, аoffsetзадает свойстваtopиleft, то есть точное положение.
Пример. Небольшой индикатор встает в поток рядом с подписью «Сохраняем».
import { Loader } from 'main.loader';
const loader = new Loader({
target: document.getElementById('save-status'),
size: 20,
mode: 'inline',
color: '#2fc6f6',
});
loader.show();
В режиме inline индикатор стоит в строке рядом с текстом.

Управлять индикатором
Методы экземпляра:
-
show(target)— показывает индикатор. Если передан контейнер, переносит индикатор в него. Повторный вызов на показанном индикаторе ничего не меняет. -
hide()— скрывает индикатор. Элемент индикатора остается в контейнере, и повторныйshow()показывает его снова. -
isShown()— возвращаетtrue, если последним вызывалиshow(). Значениеtrueне гарантирует, что индикатор виден на странице. -
setOptions(options)— меняет размер, цвет, толщину линии, режим и сдвиг уже созданного индикатора. -
destroy()— удаляет элемент индикатора со страницы. Экземпляр остается рабочим, и следующийshow()вернет индикатор в прежний контейнер.
Если не передать контейнер ни в конструктор, ни в show(), индикатор не появится на странице, хотя isShown() вернет true.
Передавайте mode в каждом вызове setOptions(), иначе индикатор выходит из режима inline. Метод setOptions() не отменяет режим custom. Чтобы вернуть индикатор в центр контейнера, создайте новый экземпляр.
Свойство layout возвращает элемент индикатора. Используйте его, если индикатор нужно вставить в разметку самостоятельно.
Индикатор не задает атрибуты доступности. Если экранная читалка должна сообщить о загрузке, добавьте элементу layout атрибут role сами.