Реагувати - Показувати екран завантаження, коли DOM рендерує?


150

Це приклад зі сторінки додатків Google Adsense. Екран завантаження, що відображається до того, як головна сторінка з’явилася після.

введіть тут опис зображення

Я не знаю, як зробити те ж саме з React, оскільки якщо я зроблю екран завантаження, виконаний компонентом React, він не відображається, коли сторінка завантажується, тому що вона повинна чекати, коли DOM буде зроблений раніше.

Оновлено :

Я зробив приклад свого підходу, вставивши завантажувач екрана index.htmlі видаливши його componentDidMount()методом React lifecycle.

Приклад та екран реагування-завантаження .


Покажіть, що ви хочете показати у звичайному js, а потім прихойте його або видаліть з DOM, коли реакція активізується. Все, що вам потрібно зробити, це сховати його від коду реагування.
FurkanO

Це просто чудово! Дякую.
Арман Карімі

Відповіді:


100

Це можна зробити, розмістивши піктограму завантаження у вашому HTML-файлі (index.html для колишнього), щоб користувачі бачили піктограму відразу після завантаження файлу html.

Коли ваша програма закінчує завантаження, ви можете просто видалити цю піктограму завантаження в гачку життєвого циклу, я зазвичай це роблю в componentDidMount.


11
Якщо ви змонтуєте кореневий компонент до батьківського вузла цього значка, його навіть не потрібно видаляти вручну. React очистить дітей від вузла монтування і замість цього поставить власний щойно виведений DOM.
rishat

6
Я не ставлю піктограму всередині кореневого вузла програми React, мені це просто не підходить
kkkkkkk

172

Мета

Коли візуалізація html-сторінки відображається негайно (тоді React завантажується) і приховуйте її після того, як React буде готовий.

Оскільки спінер відображається в чистому HTML / CSS (за межами домену React), React не повинен безпосередньо контролювати процес показу / приховування, а реалізація повинна бути прозорою для React.

Рішення 1 - порожній псевдоклас

Оскільки ви надаєте реакцію на контейнер DOM - <div id="app"></div> , ви можете додати спінер до цього контейнера, і коли реакція завантажиться і візуалізується, спінер зникне.

Ви не можете додати елемент DOM (div, наприклад) всередині кореня реакції, оскільки React замінить вміст контейнера, як тільки ReactDOM.render()буде викликано. Навіть якщо ви візуалізуєте null, вміст все одно буде замінено коментарем - <!-- react-empty: 1 -->. Це означає, що якщо ви хочете відобразити завантажувач під час монтажу основного компонента, дані завантажуються, але насправді нічого не відображається, розмітка завантажувача розміщується всередині контейнера (<div id="app"><div class="loader"></div></div> наприклад), не буде працювати.

Вирішення завдання полягає в тому, щоб додати клас спінера до контейнера реагування та використовувати :emptyпсевдоклас . Відкрутка буде видно, доки в контейнер нічого не буде показано (коментарі не враховуються). Як тільки реакція видасть щось інше, ніж коментар, завантажувач зникне.

Приклад 1

У прикладі ви можете бачити компонент, який відображається nullдо готовності. Контейнер також є завантажувачем - <div id="app" class="app"></div>і клас завантажувача буде працювати лише в тому випадку, якщо він є :empty(див. Коментарі в коді):

Приклад 2

Варіантом використання :emptyкласу псевдо для показу / приховування селектора є встановлення спінера як елемента сибінгу для контейнера програми та показ його до тих пір, поки контейнер порожній за допомогою сусіднього комбінатора побратимів ( +):


Рішення 2 - передайте спінеру "обробники" як реквізит

Для того, щоб мати більш дрібнозернистий контроль над станом болісно дисплея, створити дві функції showSpinnerі hideSpinner, і передати їх в кореневий контейнер з допомогою реквізиту. Функції можуть управляти DOM або робити все необхідне для управління прядильником. Таким чином, React не знає про "зовнішній світ", і не потребує безпосереднього контролю над DOM. Ви можете легко замінити функції для тестування, або якщо вам потрібно змінити логіку, і ви можете передати їх іншим компонентам дерева реагування.

Приклад 1

Приклад 2 - гачки

У цьому прикладі використовується useEffectгачок, щоб приховати спінер після кріплення компонента.


Не могли б ви уточнити, де мають бути останні два розділи коду? Перший чітко міститься у файлі javascript src для компонента реагування, третій - я здогадуюсь, йде у html-шаблоні, який повинен бути наданий вказаним файлом js, але куди йде другий?
levraininjaneer

1
2-й - CSS. Я використовував глобальний CSS, але ви можете використовувати модулі CSS або CSS в JS. 3-й - HTML-файл, який може включати розмітку спінера за потреби (2-й приклад).
Ori Drori

Цей тайм-аут не є добрим, коли враховується продуктивність.
dryleaf

4
@dryleaf - setTimeout не є частиною рішення. Він імітує очікування дії асинхронізації до надання вмісту.
Ori Drori

Я використовую подібний підхід. Я не можу знайти нічого в webpack, що може допомогти мені перебрати кеш файлу CSS, необхідного для завантажувача. Ви можете допомогти?
хамза-ют

40

Вирішення цього питання:

У своїй функції візуалізації зробіть щось подібне:

constructor() {
    this.state = { isLoading: true }
}

componentDidMount() {
    this.setState({isLoading: false})
}

render() {
    return(
        this.state.isLoading ? *showLoadingScreen* : *yourPage()*
    )
}

Ініціалізувати isLoading як істинний у конструкторі та false на компонентDidMount


Коли ми закликали метод ajax для завантаження даних дочірніх компонентів. компонентDidMount викликається перед заповненням даних про дочірні компоненти Як ми подолали подібне питання?
dush88c

2
Для монтажу Life Cyle це добре, ви хочете додати щось для життєвого циклу оновлення?
закір

чи потрібно це робити на всіх сторінках або просто у записі програми
Pedro JR

16

Якщо хтось шукає бібліотеку для вбудованого, нульового конфігурації та нульової залежності для вищевказаного випадку використання, спробуйте pace.js ( http://github.hubspot.com/pace/docs/welcome/ ).

Він автоматично підключається до подій (ajax, ReadyState, історія pushstate, цикл подій js тощо) та показує налаштований завантажувач.

Добре працював з нашими реагуючими / ретрансляційними проектами (обробляє зміни навігації за допомогою реактора-маршрутизатора, запитів ретрансляції) (Не афіліровано; використовував pace.js для наших проектів, і він працював чудово)


Гей! Чи можете ви сказати мені, як використовувати його з реакцією?
uneet7

просто прикріпіть сценарій public/index.htmlі виберіть стиль. це мертвий простий, дивовижний плагін. спасибі.
PJ3

Я б не знайшов темпу без цієї відповіді. Це було так просто включити, і за допомогою невеликої кількості магії CSS та деяких вкладень подій я зміг заблокувати / відключити додаток під час переходів та налаштувати спінер.
перевернутаДослід

12

Коли ваша програма React є масовою, після її завантаження дійсно потрібен час для запуску та запуску сторінки. Скажімо, ви монтуєте свою частину програми React на #app. Зазвичай цей елемент у index.html - це просто порожній div:

<div id="app"></div>

Натомість ви можете вкласти трохи стилів та купу зображень для покращення між завантаженням сторінки та початковим відображенням програми React для DOM:

<div id="app">
  <div class="logo">
    <img src="/my/cool/examplelogo.svg" />
  </div>
  <div class="preload-title">
    Hold on, it's loading!
  </div>
</div>

Після завантаження сторінки користувач одразу побачить оригінальний вміст index.html. Незабаром, коли React буде готовий встановити всю ієрархію наданих компонентів до цього вузла DOM, користувач побачить власне додаток.

Зауважте class, ні className. Це тому, що вам потрібно помістити це у свій html-файл.


Якщо ви використовуєте SSR, все є менш складним, оскільки користувач насправді побачить реальну програму відразу після завантаження сторінки.


Це працює також у мене є два місця, де відбувається завантаження. Один - це масовий додаток. а далі - підготовка (встановлення різних компонентів.) Тому я отримую миготливий крок, тому що app.render бере на себе і анімація скидається ( замінюється справді.) Чи буде спосіб уникнути цього спалаху? Чи реагує Реактив порівняти DOM один з одним? Але з того, що я розумію, React додає всілякі приватні дані в теги ...
Alexis Wilke

12

Це станеться, перш ніж ReactDOM.render()взяти під контроль корінь <div> . Тобто ваша програма не буде встановлена ​​до цього моменту.

Таким чином, ви можете додати завантажувач у свій index.htmlфайл всередині кореня <div>. І це буде видно на екрані до тих пір, поки React не перейме його.

Ви можете використовувати будь-який елемент завантажувача, який найкраще підходить для вас (наприклад, svgз анімацією).

Видаляти його не потрібно жодним способом життєвого циклу. React замінить будь-які діти його кореня <div> на ваш наданий <App/>, як ми бачимо в GIF нижче.

Приклад на CodeSandbox

введіть тут опис зображення

index.html

<head>
  <style>
    .svgLoader {
      animation: spin 0.5s linear infinite;
      margin: auto;
    }
    .divLoader {
      width: 100vw;
      height: 100vh;
      display: flex;
      align-items: center;
      justify-content: center;
    }
    @keyframes spin {
      0% { transform: rotate(0deg); }
      100% { transform: rotate(360deg); }
    }
  </style>
</head>

<body>
  <div id="root">
    <div class="divLoader">
      <svg class="svgLoader" viewBox="0 0 1024 1024" width="10em" height="10em">
        <path fill="lightblue"
          d="PATH FOR THE LOADER ICON"
        />
      </svg>
    </div>
  </div>
</body>

index.js

Використовується debuggerдля огляду сторінки перед ReactDOM.render()запуском.

import React from "react";
import ReactDOM from "react-dom";
import "./styles.css";

function App() {
  return (
    <div className="App">
      <h1>Hello CodeSandbox</h1>
      <h2>Start editing to see some magic happen!</h2>
    </div>
  );
}

debugger; // TO INSPECT THE PAGE BEFORE 1ST RENDER

const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);

красиве та вишукане рішення
Гал Маргаліт

1
Я радий, що це допомагає!
cbdeveloper

9

Сьогодні ми можемо використовувати гачки також у React 16.8:

import React, { useState, useEffect } from 'react';

const App = () => {
  const [ spinner, setSpinner ] = useState(true);

  // It will be executed before rendering

  useEffect(() => {
    setTimeout(() => setSpinner(false), 1000)
  }, []);

  // [] means like componentDidMount

  return !spinner && <div>Your content</div>;
};

export default App;

5

Встановлення тайм-ауту в компонентDidMount працює, але в моєму додатку я отримав попередження про витоку пам'яті. Спробуйте щось подібне.

constructor(props) {
    super(props)
    this.state = { 
      loading: true,
    }
  }
  componentDidMount() {
    this.timerHandle = setTimeout(() => this.setState({ loading: false }), 3500); 
  }

  componentWillUnmount(){
    if (this.timerHandle) {
      clearTimeout(this.timerHandle);
      this.timerHandle = 0;
    }
  }

4

Нещодавно мені довелося зіткнутися з цією проблемою і придумав рішення, яке для мене працює чудово. Однак я спробував рішення @Ori Drori вище, і, на жаль, він не спрацював правильно (були деякі затримки + мені не подобається використанняsetTimeout функції там).

Ось що я придумав:

index.html файл

Всередині head тегу - стилі для індикатора:

<style media="screen" type="text/css">

.loading {
  -webkit-animation: sk-scaleout 1.0s infinite ease-in-out;
  animation: sk-scaleout 1.0s infinite ease-in-out;
  background-color: black;
  border-radius: 100%;
  height: 6em;
  width: 6em;
}

.container {
  align-items: center;
  background-color: white;
  display: flex;
  height: 100vh;
  justify-content: center;
  width: 100vw;
}

@keyframes sk-scaleout {
  0% {
    -webkit-transform: scale(0);
    transform: scale(0);
  }
  100% {
    -webkit-transform: scale(1.0);
    opacity: 0;
    transform: scale(1.0);
  }
}

</style>

Тепер в bodyтег:

<div id="spinner" class="container">
  <div class="loading"></div>
</div>

<div id="app"></div>

І тоді виходить дуже проста логіка всередині app.jsфайлу (у функції візуалізації):

const spinner = document.getElementById('spinner');

if (spinner && !spinner.hasAttribute('hidden')) {
  spinner.setAttribute('hidden', 'true');
}

Як це працює?

Коли перший компонент (в моєму додатку він app.jsтакож знаходиться в більшості випадків) правильно монтується, spinnerприховується при застосуванні hiddenатрибута до нього.

Що ще важливіше додати - !spinner.hasAttribute('hidden')умова заважає додавати hiddenатрибут у спінер із кожним компонентом кріплення, тому насправді він буде доданий лише один раз, коли завантажується ціла програма.


4

Я використовую пакет react -progress-2 npm, який є нульовою залежністю і чудово працює в ReactJS.

https://github.com/milworm/react-progress-2

Установка:

npm install react-progress-2

Включіть у свій проект react-progress-2 / main.css.

import "node_modules/react-progress-2/main.css";

Включіть react-progress-2і покладіть його десь у верхній компонент, наприклад:

import React from "react";
import Progress from "react-progress-2";

var Layout = React.createClass({
render: function() {
    return (
        <div className="layout">
            <Progress.Component/>
                {/* other components go here*/}
            </div>
        );
    }
});

Тепер, коли вам потрібно показати індикатор, просто телефонуйте Progress.show(), наприклад:

loadFeed: function() {
    Progress.show();
    // do your ajax thing.
},

onLoadFeedCallback: function() {
    Progress.hide();
    // render feed.
}

Будь ласка , зверніть увагу, що showі hideдзвінки укладені, так що після п-шоу підряду дзвінків, вам потрібно зробити , п приховати виклики , щоб приховати індикатор , або ви можете використовувати Progress.hideAll().


4

Я також використовую React у своєму додатку. Для запитів я використовую перехоплювачі axios, тому чудовим способом зробити екран завантажувача (повна сторінка, як ви показали на прикладі) є додавання класу або id, наприклад, до тіла всередині перехоплювачів (тут код з офіційної документації з деяким спеціальним кодом):

// Add a request interceptor
axios.interceptors.request.use(function (config) {
    // Do something before request is sent
     document.body.classList.add('custom-loader');
     return config;
  }, function (error) {
    // Do something with request error
    return Promise.reject(error);
  });

// Add a response interceptor
axios.interceptors.response.use(function (response) {
    // Do something with response data
       document.body.classList.remove('custom-loader');
       return response;
  }, function (error) {
    // Do something with response error
    return Promise.reject(error);
  }); 

А потім просто застосуйте у CSS свій завантажувач із псевдоелементами (або додайте клас чи id до іншого елемента, а не тіло, як вам подобається) - ви можете встановити колір фону на непрозорий чи прозорий тощо. Приклад:

custom-loader:before {
    background: #000000;
    content: "";
    position: fixed;
    ...
}

custom-loader:after {
    background: #000000;
    content: "Loading content...";
    position: fixed;
    color: white;
    ...
}

3

Відредагуйте своє місцезнаходження index.html у загальнодоступній папці. Скопіюйте своє зображення в те ж місце, що і index.html у загальнодоступній папці А потім замініть частину вмісту index.html <div id="root"> </div>тегів на наведений нижче код HTML.

<div id="root">  <img src="logo-dark300w.png" alt="Spideren" style="vertical-align: middle; position: absolute;
   top: 50%;
   left: 50%;
   margin-top: -100px; /* Half the height */
   margin-left: -250px; /* Half the width */" />  </div>

Логотип тепер з’явиться в середині сторінки під час завантаження. А потім буде замінено через кілька секунд React.


2

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

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="utf-8" />
  <link rel="shortcut icon" href="%PUBLIC_URL%/favicon.ico" />
  <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
  <meta name="theme-color" content="#000000" />
  <meta name="description" content="Web site created using create-react-app" />
  <link rel="apple-touch-icon" href="logo192.png" />
  <link rel="manifest" href="%PUBLIC_URL%/manifest.json" />
  <title>Title</title>
  <style>
    body {
      margin: 0;
    }

    .loader-container {
      width: 100vw;
      height: 100vh;
      display: flex;
      overflow: hidden;
    }

    .loader {
      margin: auto;
      border: 5px dotted #dadada;
      border-top: 5px solid #3498db;
      border-radius: 50%;
      width: 100px;
      height: 100px;
      -webkit-animation: spin 2s linear infinite;
      animation: spin 2s linear infinite;
    }

    @-webkit-keyframes spin {
      0% {
        -webkit-transform: rotate(0deg);
      }

      100% {
        -webkit-transform: rotate(360deg);
      }
    }

    @keyframes spin {
      0% {
        transform: rotate(0deg);
      }

      100% {
        transform: rotate(360deg);
      }
    }

  </style>
</head>

<body>
  <noscript>You need to enable JavaScript to run this app.</noscript>
  <div id="root">
    <div class="loader-container">
      <div class="loader"></div>
    </div>
  </div>
</body>

</html>

Ви можете пограти з ним HTMLі CSSзробити так, щоб він виглядав як ваш приклад.


1

Найголовніше питання: що ви маєте на увазі під "завантаженням"? Якщо ви говорите про фізичний елемент, який монтується, деякі перші відповіді тут чудові. Однак, якщо перше, що ваша програма робить, це перевірити справжність, то ви дійсно завантажуєте дані з бекенда, чи користувач передав файл cookie, який позначає їх авторизованим або несанкціонованим користувачем.

Це базується на скороченні, але ви можете легко змінити його на звичайну модель реагування.

Творець дії:

export const getTodos = () => {
  return async dispatch => {
    let res;
    try {
      res = await axios.get('/todos/get');

      dispatch({
        type: AUTH,
        auth: true
      });
      dispatch({
        type: GET_TODOS,
        todos: res.data.todos
      });
    } catch (e) {
    } finally {
      dispatch({
        type: LOADING,
        loading: false
      });
    }
  };
};

Нарешті частина означає, що користувач є автором чи ні, екран завантаження зникає після отримання відповіді.

Ось як може виглядати компонент, який його завантажує:

class App extends Component {
  renderLayout() {
    const {
      loading,
      auth,
      username,
      error,
      handleSidebarClick,
      handleCloseModal
    } = this.props;
    if (loading) {
      return <Loading />;
    }
    return (
      ...
    );
  }

  ...

  componentDidMount() {
    this.props.getTodos();
  }

...

  render() {
    return this.renderLayout();
 }

}

Якщо state.loading надійний, ми завжди побачимо екран завантаження. У компонентіDidMount ми називаємо нашу функцію getTodos, яка є творцем дій, який перетворює state.load завантаження помилкових, коли ми отримуємо відповідь (що може бути помилкою). Наш компонент оновлюється, дзвінки повторно відображаються, і цього разу екран не завантажений через оператор if.


1

Запуск програми реагування базується на завантаженні основного пакету. Додаток React запускається лише після завантаження основного пакета в браузер. Це навіть справедливо у випадку лінивої архітектури завантаження. Але факт полягає в тому, що ми не можемо точно вказати назву будь-яких пакетів. Оскільки webpack додасть значення хеша в кінці кожного пакету в момент запуску команди "npm run build". Звичайно, ми можемо цього уникнути, змінивши параметри хешу, але це серйозно вплине на проблему даних кешу в браузері. Можливо, браузери не приймуть нову версію через те саме ім'я пакету. . для вирішення цієї ситуації нам потрібен підхід webpack + js + CSS.

змінити public / index.html, як показано нижче

<!DOCTYPE html>
<html lang="en" xml:lang="en">

<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1,maximum-scale=3.0, shrink-to-fit=no">
  <meta name="theme-color" content="#000000">
  <!--
      manifest.json provides metadata used when your web app is added to the
      homescreen on Android. See https://developers.google.com/web/fundamentals/engage-and-retain/web-app-manifest/
    -->
  <link rel="manifest" href="%PUBLIC_URL%/manifest.json">
  <link rel="shortcut icon" href="%PUBLIC_URL%/favicon.ico">
  <style>
 .percentage {
      position: absolute;
      top: 50%;
      left: 50%;
      width: 150px;
      height: 150px;
      border: 1px solid #ccc;
      background-color: #f3f3f3;
      -webkit-transform: translate(-50%, -50%);
          -ms-transform: translate(-50%, -50%);
              transform: translate(-50%, -50%);
      border: 1.1em solid rgba(0, 0, 0, 0.2);
      border-radius: 50%;
      overflow: hidden;
      display: -webkit-box;
      display: -ms-flexbox;
      display: flex;
      -webkit-box-pack: center;
          -ms-flex-pack: center;
              justify-content: center;
      -webkit-box-align: center;
          -ms-flex-align: center;
              align-items: center;
    }

    .innerpercentage {
      font-size: 20px;
    }
  </style>
  <script>
    function showPercentage(value) {
      document.getElementById('percentage').innerHTML = (value * 100).toFixed() + "%";
    }
    var req = new XMLHttpRequest();
    req.addEventListener("progress", function (event) {
      if (event.lengthComputable) {
        var percentComplete = event.loaded / event.total;
        showPercentage(percentComplete)
        // ...
      } else {
        document.getElementById('percentage').innerHTML = "Loading..";
      }
    }, false);

    // load responseText into a new script element
    req.addEventListener("load", function (event) {
      var e = event.target;
      var s = document.createElement("script");
      s.innerHTML = e.responseText;
      document.documentElement.appendChild(s);
      document.getElementById('parentDiv').style.display = 'none';

    }, false);

    var bundleName = "<%= htmlWebpackPlugin.files.chunks.main.entry %>";
    req.open("GET", bundleName);
    req.send();

  </script>
  <!--
      Notice the use of %PUBLIC_URL% in the tags above.
      It will be replaced with the URL of the `public` folder during the build.
      Only files inside the `public` folder can be referenced from the HTML.

      Unlike "/favicon.ico" or "favicon.ico", "%PUBLIC_URL%/favicon.ico" will
      work correctly both with client-side routing and a non-root public URL.
      Learn how to configure a non-root public URL by running `npm run build`.
    -->

  <title>App Name</title>
  <link href="<%= htmlWebpackPlugin.files.chunks.main.css[0] %>" rel="stylesheet">
</head>

<body>
  <noscript>
    You need to enable JavaScript to run this app.
  </noscript>
  <div id="parentDiv" class="percentage">
    <div id="percentage" class="innerpercentage">loading</div>
  </div>
  <div id="root"></div>
  <!--
      This HTML file is a template.
      If you open it directly in the browser, you will see an empty page.

      You can add webfonts, meta tags, or analytics to this file.
      The build step will place the bundled scripts into the <body> tag.

      To begin the development, run `npm start` or `yarn start`.
      To create a production bundle, use `npm run build` or `yarn build`.
    -->
</body>

</html>

У налаштуваннях виробничого веб-пакета змініть параметр HtmlWebpackPlugin нижче

 new HtmlWebpackPlugin({
          inject: false,
...

Можливо, вам знадобиться скористатися командою 'eject', щоб отримати файл конфігурації. останній веб-пакет може мати можливість налаштувати модуль HtmlWebpackPlugin без викидання проекту. введіть тут опис зображення


1

Я також використав відповідь @Ori Drori і мені вдалося змусити її працювати. У міру зростання коду React збільшуватимуться пакети, які клієнтському браузеру доведеться завантажувати під час першого доступу. Це нав'язує проблему з користувачем, якщо ви не впораєтеся з цим добре.

Що я додав до відповіді @Ori, це додати та виконати функцію завантаження в атрибуті index.html on atload тегу body, щоб завантажувач зник, коли все було повністю завантажено в перегляд, див. Фрагмент нижче:

<html>
  <head>
     <style>
       .loader:empty {
          position: absolute;
          top: calc(50% - 4em);
          left: calc(50% - 4em);
          width: 6em;
          height: 6em;
          border: 1.1em solid rgba(0, 0, 0, 0.2);
          border-left: 1.1em solid #000000;
          border-radius: 50%;
          animation: load8 1.1s infinite linear;
        }
        @keyframes load8 {
          0% {
           transform: rotate(0deg);
          }
          100% {
           transform: rotate(360deg);
          }
        }
     </style>
     <script>
       function onLoad() {
         var loader = document.getElementById("cpay_loader");loader.className = "";}
     </script>
   </head>
   <body onload="onLoad();">
     more html here.....
   </body>
</html>

1

Як щодо використання Pace

Скористайтеся цією адресою посилання тут.

https://github.hubspot.com/pace/docs/welcome/

1.На їхньому веб-сайті виберіть потрібний стиль та вставте в index.css

2.go to cdnjs Скопіюйте посилання для Pace Js та додайте до своїх тегів скриптів у public / index.html

3. Він автоматично визначає завантаження веб-сторінок і відображає темп у верхній частині веб-переглядача.

Ви також можете змінити висоту та анімацію в css також.


Дивовижний та може бути інтегрований у найкоротші терміни.
UzumakiL
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.