...

Кастомный глобальный индикатор загрузки (лоадер)

Тема в разделе "Примеры решений и дополнительных модулей", создана пользователем ksannikov, 2 мар 2026 в 15:17.

  1. ksannikov

    ksannikov Активный участник

    Я покажу, как реализовать глобальный индикатор загрузки с помощью корневого виджета. Это позволит использовать его в любом месте системы без дублирования кода.

    Все подробности в видео, а ниже используемый код.

    Код из скриптов корневого виджета:

    Код:
    
    declare const windowany;

    const 
    spinnerWrapperClassName 'loader-wrapper';
    const 
    spinnerClassName 'custom-loader';

    /** Отобразить лоадер */
    function show(): void {
        const 
    loaderWrapper window.document.createElement("div");
        
    loaderWrapper.className spinnerWrapperClassName;
        
    loaderWrapper.innerHTML = `<div class="${spinnerClassName}"></div>`;
        
    window.document.body.appendChild(loaderWrapper);
    }

    /** Скрыть лоадер */
    function hide(): void {
        const 
    loader window.document.body.querySelector(`.${spinnerWrapperClassName}`);
        if (
    loader) {
            
    loader.remove();
        }
    }

    window.CustomLoader = {
        
    show,
        
    hide
    }

    Код для отображения и скрытия индикатора загрузки:

    Код:
    
    declare const windowany;

    asyn function action() {
        
    window.CustomLoader.show() //показать лоадер
        //логика скрипта
        
    window.CustomLoader.hide() //скрыть лоадер
    }
    Стили для индикатора загрузки:

    HTML:
    <style>
      .loader-wrapper {
        position: absolute;
        top: 0;
        left: 0;
        width: 100%;
        height: 100%;
        background: rgba(0, 0, 0, 0.2);
        display: flex;
        justify-content: center;
        align-items: center;
        z-index: 9999;
      }
    
      .custom-loader {
        width: 32px;
        height: 32px;
        border-radius: 50%;
        display: inline-block;
        position: relative;
        border: 3px solid #606060;
        border-bottom-color: #000000ff;
        box-sizing: border-box;
        animation: rotation 1s linear infinite;
        opacity: 0.75;
      }
      @keyframes rotation {
        0% {
          transform: rotate(0deg);
        }
        100% {
          transform: rotate(360deg);
        }
      }
    </style>
    
    Еще больше полезной информации в ТГ канале WhatDaELMA365
    Последнее редактирование: 2 мар 2026 в 17:08