Как создать индикатор выполнения в форме круга или кольца для загрузки экранов или инфографики с помощью холста HTML и JavaScript

Концептуальные чертежи для предстоящего внештатного проекта требуют круглого индикатора выполнения для визуализации некоторых данных. Рассмотрев несколько различных решений, я выбрал холст HTML и JavaScript, потому что они очень полезны для такого типа интерактивных и анимированных элементов. Для базовой реализации требуется всего несколько строк JavaScript, и ее можно легко превратить в очень настраиваемый класс для многих случаев использования.

Как создать круговой индикатор выполнения

Функции рисования холста очень удобны для создания индикатора выполнения в форме круга или кольца. Наиболее важной функцией является context.arc( xCenter , yCenter , radius , startAngle , endAngle ), которую можно использовать для рисования кругов или участков круга. Если вы объедините его со свойством context.lineWidth, вы можете нарисовать более толстую линию, и это почти все, что нам нужно для круглого индикатора выполнения.

В приведенном выше примере рисуется полный круг (от 0 до 2π) с радиусом 50 пикселей при 100|100. Мы также можем нарисовать второй чуть менее толстый круг поверх него, чтобы создать индикатор выполнения с фоном и рамкой.

Стоит отметить, что 0 градусов в функции дуги соответствуют левой стороне круга, а не вершине. Если мы хотим, чтобы наш индикатор выполнения начинался и заканчивался вверху, нам просто нужно добавить 3/2π к обоим углам.

Создание класса JavaScript

Как вы можете видеть из приведенного выше примера, очень просто создать базовый круговой индикатор выполнения. Однако я хотел добавить еще несколько функций и инкапсулировать все в класс JavaScript. Помимо ссылки на контекст рисования холста, конструктор также имеет необязательный аргумент параметров, который можно использовать для настройки внешнего вида индикатора выполнения.

Основная причина, по которой я хотел создать класс JavaScript для индикатора выполнения, заключалась в том, чтобы иметь простой способ его анимировать. Поэтому я добавил функцию animateTo( percent , time ), которая автоматически изменяет значение индикатора выполнения в течение time секунд на новое значение percent. Под капотом он просто использует функцию setTimeout() для обновления индикатора выполнения 50 раз в секунду, пока не будет достигнуто новое значение.

Причина, по которой функции animateTo() и setPercent() вызывают обратный вызов onchange() класса вместо непосредственного обновления холста, заключается в экономии ресурсов. Если бы на одном холсте было несколько индикаторов выполнения, и все они запускали бы анимацию, каждый отдельный индикатор выполнения вызывал бы перерисовку холста, что потенциально может происходить сотни раз в секунду. В этом случае гораздо лучше обновлять холст только в соответствии с частотой обновления монитора (requestAnimationFrame()) и рисовать все индикаторы выполнения в одной функции.

Применение

Ниже приведен пример использования класса индикатора выполнения круга. Поскольку в этом простом примере холст используется только для рисования индикатора выполнения, холст перерисовывается только при изменении значения индикатора выполнения, что делается путем установки и реализации обратного вызова onchange() класса.

Живой пример

Я загрузил простой пример на свой сайт, если хотите увидеть его в действии.

Круглые индикаторы выполнения очень полезны и удивительно просты в реализации. Помимо его собственного использования в качестве фактического индикатора выполнения, есть много других ситуаций и дизайнов, где они пригодятся. В моем предстоящем проекте я собираюсь использовать его в интерактивной инфографике для визуализации и анимации между различными значениями. С некоторыми изменениями ту же идею реализации можно использовать для создания круговой или кольцевой диаграммы. Элемент холста HTML в целом чрезвычайно универсален и часто работает лучше, чем сложные конструкции HTML и CSS для тех же случаев использования.

Ресурсы