...

Отображение на странице компонента Loader

Тема в разделе "Скрипты и разработка", создана пользователем vyimova, 31 авг 2023.

  1. vyimova

    vyimova Участник

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

    Создадим страницу в разделе или страницу портала. Перейдем в ее конструктор. Создадим виджет-код на странице. В нем пропишем HTML-код с классом для вывода элемента, стили для него, а также JS-код с вызовом функции loadWidget() из клиентского сценария.

    Loader можно задать любой с любым дизайном, например пусть это будет элемент в цветах ELMA. Обязательно пропишем класс loader-wrapper_active и укажем в стилях этого класса opacity и visibility для того, чтобы управлять отображением элемента Loader.
    Код:
    
    <div class="loader-wrapper loader-wrapper_active">
        <
    div class="loader"></div>
    </
    div>

    <
    style>
    .
    loader-wrapper {
      
    position: fixed;
      
    top: 0;
      
    left: 0;
      
    width: 100vw;
      
    height: 100vh;
      
    background: rgba(0, 0, 0, 0.5);
      
    display: -webkit-box;
      
    display: -ms-flexbox;
      
    display: flex;
      
    opacity: 0;
      
    visibility: hidden;
      -
    webkit-box-pack: center;
          -
    ms-flex-pack: center;
              
    justify-content: center;
      -
    webkit-box-align: center;
          -
    ms-flex-align: center;
              
    align-items: center;
      -
    webkit-transition: 0.5s;
      -
    o-transition: 0.5s;
      
    transition: 0.5s;
    }

    .
    loader  {
      
    animation: rotate 1s infinite;
      
    height: 50px;
      
    width: 50px;
    }

    .
    loader:before,
    .
    loader:after {
      
    border-radius: 50%;
      
    content: '';
      
    display: block;
      
    height: 20px;
      
    width: 20px;
    }
    .
    loader:before {
      
    animation: ball1 1s infinite;
      
    background-color: #E62D32;
      
    box-shadow: 30px 0 0 #FABE00;
      
    margin-bottom: 10px;
    }
    .
    loader:after {
      
    animation: ball2 1s infinite;
      
    background-color: #5082E6;
      
    box-shadow: 30px 0 0 #5AD2FF;
    }

    .
    loader-wrapper_active{
      
    opacity: 1;
      
    visibility: visible;
    }

    @
    keyframes rotate {
      
    0% {
        -
    webkit-transform: rotate(0deg) scale(0.8);
        -
    moz-transform: rotate(0deg) scale(0.8);
      }
      
    50% {
        -
    webkit-transform: rotate(360deg) scale(1.2);
        -
    moz-transform: rotate(360deg) scale(1.2);
      }
      
    100% {
        -
    webkit-transform: rotate(720deg) scale(0.8);
        -
    moz-transform: rotate(720deg) scale(0.8);
      }
    }

    @
    keyframes ball1 {
      
    0% {
        
    box-shadow: 30px 0 0 #FABE00;
      
    }
      
    50% {
        
    box-shadow: 0 0 0 #FABE00;
        
    margin-bottom: 0;
        -
    webkit-transform: translate(15px,15px);
        -
    moz-transform: translate(15px, 15px);
      }
      
    100% {
        
    box-shadow: 30px 0 0 #FABE00;
        
    margin-bottom: 10px;
      }
    }

    @
    keyframes ball2 {
      
    0% {
        
    box-shadow: 30px 0 0 #5AD2FF;
      
    }
      
    50% {
        
    box-shadow: 0 0 0 #5AD2FF;
        
    margin-top: -20px;
        -
    webkit-transform: translate(15px,15px);
        -
    moz-transform: translate(15px, 15px);
      }
      
    100% {
        
    box-shadow: 30px 0 0 #5AD2FF;
        
    margin-top: 0;
      }
    }
    </
    style>

    <
    script>
        $(
    document).ready(function(){
            <%= 
    Scripts%>.renderPage();
        });
    </script>
    Для иллюстрации примера был взят Loader из данного источника.


    В конструкторе страницы перейдем на вкладку «Сценарии». Создадим клиентский сценарий:
    Код:
    
    // объявление необходимых констант и переменных
    declare const console: any;
    declare const 
    window: any;
    declare const 
    document: any;

    let loaderEl: any;

    // функция для отображения Loader
    function showLoader(){
        
    loaderEl.classList.add("loader-wrapper_active");
    }
    // функция для скрытия Loader
    function hideLoader(){
        
    loaderEl.classList.remove("loader-wrapper_active");
    }

    // проверка загрузки элемента для вывода данных
    async function renderPage(){
        
    let myInterval = window.setInterval(async() => {
            
    loaderEl = document.querySelector('.loader-wrapper');
            if (
    loaderEl) {
                
    window.clearInterval(myInterval);
                
    // вызов скрытия элемента Loader через 5 секунд
                
    window.setTimeout(hideLoader, 5000);
            }
        }, 
    200);
    }
    В этом коде мы сперва проверяем, что все нужные элементы на странице загружены, а далее скрываем Loader после пяти секунд, управляя его отображением через ранее упомянутый класс loader-wrapper_active. При его наличии элемент отображен, при его отсутствии – скрыт.

    Если все настроено правильно, то на странице у нас отобразится Loader, который исчезнет через пять секунд:

    [​IMG]

    Таким образом, можно настроить на странице стенда или портала элемент загрузки.
    Последнее редактирование: 31 авг 2023