Конфетти На Холсте

Привет Хабр! Недавно я наткнулась на интересную вещицу, создающую на странице эффект конфетти.

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

Подробности под катом.



Введение

Повествование будет вестись с точки зрения человека, впервые в жизни увидевшего холст (ладно, второй, первый был вот эта статья с Хабра о фрактальных снежинках ) и хочет почерпнуть различные полезные моменты, которые он, возможно, захочет использовать в будущем.

Началось с исходный код библиотеки холст-конфетти .



Настройки

Удобно представить себе некую пушку, расположенную в определенной точке.

источник , наклоненный под углом угол и выпускает заряд в виде конуса, который отклоняется от направления выстрела влево и вправо под углом распространение со скоростью startVelocity .

Затем частицы начинают терять скорость в зависимости от сопротивления воздуха.

разлагаться и упасть под действием силы тяжести сила тяжести .

Также есть параметры количества частиц, цвета, формы, размера (particleCount, Colors, Shapes, Scalar).

Достаточно добавить только интересующие вас опции, остальные будут добавлены по умолчанию.

  
  
  
  
  
   

confetti({ particleCount: 100, startVelocity: 30, spread: 360, origin: { x: Math.random(), y: Math.random() - 0.2 } }



Полезные моменты внутри

То, что обеспечивает 60 кадров в секунду, используя запросАнимацияFrame , если есть или откатывается на setTimeout

var raf = (function () { var TIME = Math.floor(1000 / 60); var frame, cancel; var frames = {}; var lastFrameTime = 0; if (typeof requestAnimationFrame === 'function' && typeof cancelAnimationFrame === 'function') { frame = function (cb) { var id = Math.random(); frames[id] = requestAnimationFrame(function onFrame(time) { if (lastFrameTime === time || lastFrameTime + TIME - 1 < time) { lastFrameTime = time; delete frames[id]; cb(); } else { frames[id] = requestAnimationFrame(onFrame); } }); return id; }; cancel = function (id) { if (frames[id]) { cancelAnimationFrame(frames[id]); } }; } else { frame = function (cb) { return setTimeout(cb, TIME); }; cancel = function (timer) { return clearTimeout(timer); }; } return { frame: frame, cancel: cancel }; }());

Заполнение всей видимой области страницы холстом с помощью создатьЭлемент , AppChild , ширина клиента , высота клиента

function getCanvas(zIndex) { var canvas = document.createElement('canvas'); canvas.style.position = 'fixed'; canvas.style.top = '0px'; canvas.style.left = '0px'; canvas.style.pointerEvents = 'none'; canvas.style.zIndex = zIndex; return canvas; } // .

document.body.appendChild(canvas); // .

function setCanvasWindowSize(canvas) { canvas.width = document.documentElement.clientWidth; canvas.height = document.documentElement.clientHeight; }

Получение двумерного контекста холста с помощью getContext

var context = canvas.getContext('2d');

Очистка, которая происходит перед отрисовкой каждого кадра с помощью ClearRect в методе обновлять

context.clearRect(0, 0, size.width, size.height);

Для создания каждого кадра вызывается update, внутри которого для каждой «конфетки» вызывается код, вычисляющий ее геометрические координаты и рисующий ее с помощью контекстных методов.

начало пути , переместитьTo , линияTo , closePath И наполнять .

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



function updateFetti(context, fetti) {

Теги: #разработка #Процесс обучения в IT #JavaScript #html5 #canvas #confetti

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