Индикатор Canvas — Альтернатива Ajaxload.gif

Многие, вероятно, используют индикаторы процесса , например, при передаче/получении каких-либо данных через AJAX. Однажды я был озадачен тем, что когда я нажимал на кнопку, отправляющую данные формы на сервер, внутри нее появлялся этот самый индикатор.

Изначально фон был однотонным, но в любой момент дизайнеры могли заменить его другим или даже создать градиент. Делать специальную гифку для каждой ситуации — довольно глупо.

Поэтому правильное решение — использовать Canvas. В первые минуты я наткнулся этот модуль JavaScript , с помощью которого можно как минимум генерировать подобные индикаторы:

Индикатор Canvas — альтернатива AjaxLoad.gif

Но проблему это не решило, не с технической стороны, конечно, а с конструктивной.

Человек, занимающийся этими вопросами, утверждал, что это не круги, а палки бегают по кругу, вот так:

Индикатор Canvas — альтернатива AjaxLoad.gif

Я изначально наткнулся эта библиотека , но в нем есть много функций, которые я даже не планировал использовать.

Поиски пришлось продолжить.

В конце концов я наткнулся одна запись , что почти решило мою проблему.

Удалив лишнее и добавив необходимое, я с удовольствием поделюсь с вами решением.

Пример использования.

В нужном месте поместите тег Canvas:

  
  
   

<canvas id="loader"></canvas>

И создайте экземпляр класса CanvasIndicator:

new CanvasIndicator(document.getElementById("loader"),{ bars:11, innerRadius:4, size:[2,5], rgb:[255,255,255], fps:10 });

Как видите, конструктор CanvasIndicator принимает два параметра: первый — это обязательно холст, на котором собственно и будет происходить действие.

Второй параметр необязательный — это объект, свойствами которого является конфигурация индикатора.

Более подробная информация о недвижимости: бары — количество блоков внутреннийРадиус - внутренний радиус размер — массив, где первый элемент — ширина блока, а второй — его высота RGB — цвет индикатора, задается массивом из трех элементов, где Red, Green, Blue соответственно кадр/с — количество кадров в секунду, чем выше значение, тем быстрее вращается индикатор Ну и непосредственно код библиотеки CanvasIndicator.js

function CanvasIndicator(el, opt) { this.ctx = el.getContext("2d"); this.currentOffset = 0; var defaults = { bars: 11, innerRadius: 4, size: [2, 5], rgb: [255, 255, 255], fps: 10 } if (typeof(opt) == 'object') { defaults.bars = opt.bars ? opt.bars : defaults.bars; defaults.innerRadius = opt.innerRadius ? opt.innerRadius : defaults.innerRadius; defaults.size = opt.size ? opt.size : defaults.size; defaults.rgb = opt.rgb ? opt.rgb : defaults.rgb; defaults.fps = opt.fps ? opt.fps : defaults.fps; } this.opt = defaults; this.w = this.opt.size[1] + this.opt.innerRadius; el.setAttribute("width", this.w * 2); el.setAttribute("height", this.w * 2); (function nextAnimation(obj) { obj.currentOffset = (obj.currentOffset + 1) % obj.opt.bars; obj.draw(obj.currentOffset); setTimeout(function () { nextAnimation(obj); }, 1000 / obj.opt.fps); })(this); } CanvasIndicator.prototype.makeRGBA = function () { return "rgba(" + [].

slice.call(arguments, 0).

join(",") + ")"; } CanvasIndicator.prototype.drawBlock = function (barNo) { this.ctx.fillStyle = this.makeRGBA(this.opt.rgb[0], this.opt.rgb[1], this.opt.rgb[2], (this.opt.bars + 1 - barNo) / (this.opt.bars + 1)); this.ctx.fillRect(-this.opt.size[0] / 2, 0, this.opt.size[0], this.opt.size[1]); } CanvasIndicator.prototype.calculatePosition = function (barNo) { angle = 2 * barNo * Math.PI / this.opt.bars; return { y: (this.opt.innerRadius * Math.cos(-angle)), x: (this.opt.innerRadius * Math.sin(-angle)), angle: angle }; } CanvasIndicator.prototype.draw = function (offset) { this.clearFrame(); this.ctx.save(); this.ctx.translate(this.w, this.w); for (var i = 0; i < this.opt.bars; i++) { var curbar = (offset + i) % this.opt.bars, pos = this.calculatePosition(curbar); this.ctx.save(); this.ctx.translate(pos.x, pos.y); this.ctx.rotate(pos.angle); this.drawBlock(i); this.ctx.restore(); } this.ctx.restore(); } CanvasIndicator.prototype.clearFrame = function () { this.ctx.clearRect(0, 0, this.ctx.canvas.clientWidth, this.ctx.canvas.clientHeight); }

Вы можете увидеть пример Здесь .

Вы можете скачать библиотеку здесь Теги: #JavaScript #canvas #indicator #ajaxload #разработка сайтов #JavaScript #canvas

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.