Canvas. Анимация текста

Canvas. Анимация текста

Front-end 04.11.2018

В этой статье я Вам покажу как можно создать анимацию текста при помощи Canvas.

Sorry, your browser don’t support canvas.

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

Методы ctx canvas для работы с текстом

Рассмотрим некоторые полезные методы ctx canvas, которые я использовала в  функции рисования текста:

ctx.font - задает стиль текста. С его помощью можно задать font-family, font-style, font-weight, и т.д.

ctx.font="30px Arial";

ctx.strokeStyle - задает или возвращает цвет, градиент или шаблон, используемый для элемента.

ctx.strokeStyle="#FF0000";

// Demo with gradient
let gradient=ctx.createLinearGradient(0,0,170,0);

gradient.addColorStop("0","magenta");
gradient.addColorStop("0.5","blue");
gradient.addColorStop("1.0","red");

ctx.strokeStyle=gradient;

ctx.fillStyle - задает заливку элементу - цвет, градиент или шаблон. Использование аналогично ctx.strokeStyle.

ctx.setLineDash - устанавливает штриховой шаблон линии, используемый при создании строк, используя массив значений, который задает чередующиеся длины элементов и промежутков.

В примере ниже мы рисуем штриховую линию и задаем отступы при помощи setLineDash

ctx.beginPath();
ctx.setLineDash([5, 15]);
ctx.moveTo(0, 50);
ctx.lineTo(400, 50);
ctx.stroke();

ctx.strokeText - метод нарисовать текст (без заливки). Цвет текста по умолчанию - черный. Принимает такие параметр: text (строка значений), x, y (начальные координаты), maxWidth (optional).

ctx.strokeText("Hello World!",10,50);

ctx.fillText - метод рисует заполненный текст на холсте. Цвет текста по умолчанию черный.
Использование аналогично ctx.strokeText.

ctx.measureText - возвращает объект, который содержит ширину указанного текста, в пикселях.

Canvas Animation

Мы рассмотрели нужные нам методы для работы с текстом при помощи canvas. Теперь разберемся, что такое requestAnimationFrame и как оно работает.

Функция RequestAnimationFrame была предложена Mozilla (создатели Firefox), которая впоследствии усовершенствовалась командой WebKit (Chrome и Safari). Она обеспечивает встроенный API для запуска любых типов анимации в браузере (DOM элементов, canvas, WebGL и т.д.).

Принцип работы приблизительно такой - мы обьявляем функцию, в которой описан 1 шаг анимации, после передаем ее обработчику requestAnimationFrame.

function run() {
  requestAnimationFrame(run);
  // код одного шага анимации
}
run();

Анимация текста - функция реализации

Теперь, я думаю, код представленный ниже будет понятен. Для удобства значения шрифта, текста и т.д. я помещала в константы, а так же использовала функцию getValue, что бы получать пикстельное значение из % относительно какой-то величины, а в posStartText я устанавливала начальные значения с которого будет рисоваться текст.

const BASE_COLOR = '#212121';
const TEXT = 'Demo Animation';
const FONT_FAMILY = 'Arial';
const FONT_SIZE_BIG = '50px';
const FONT_SIZE_MEDIUM = '50px';
const SPEED = 10;
let dashLen = 220;
let dashOffset = dashLen;
let k = 0;

window.onload = function() {
  const wW = window.innerWidth;
  let contentBox = document.getElementById('canvasElement');
  let canvas = document.getElementById('animation');
  let ctx = canvas.getContext('2d');
  
  canvas.width = wW;
  canvas.height = 100;

  let getValue = (val, num) => {
    return (val * num) / 100
  }

  let posStartText = {
    x: getValue(wW, 2),
    y: 50
  };

  let drawText = () => {
    ctx.font =  (wW > 800) ? `${FONT_SIZE_BIG} ${FONT_FAMILY}` : `${FONT_SIZE_MEDIUM} ${FONT_FAMILY}`;
    ctx.strokeStyle = ctx.fillStyle = BASE_COLOR;
    ctx.setLineDash([dashLen - dashOffset, dashOffset - SPEED]);
    dashOffset -= SPEED;
    ctx.strokeText(TEXT[k], posStartText.x, posStartText.y);

    if (dashOffset > 0) {
      requestAnimationFrame(drawText);
    } else {
      ctx.fillText(TEXT[k], posStartText.x, posStartText.y);
      dashOffset = dashLen;
      posStartText.x += ctx.measureText(TEXT[k++]).width + 5 * Math.random();
      
      ctx.setTransform(1, 0, 0, 1, 0, 3 * Math.random());
      ctx.rotate(Math.random() * 0.005);
      
      if (k < TEXT.length) {
        requestAnimationFrame(drawText);
      }
    }
    
  }
  drawText();
}

Enjoy 🙂

Поделиться

Отправить ответ

avatar
  Subscribe  
Notify of