Я хочу, щоб це слово було намальовано анімацією, щоб сторінка "записувала" це слово так само, як і ми
Полотна версія
Це дозволить намалювати поодинокі символи, подібні до того, як писали б від руки. Він використовує довгу схему тире, де замовлення на вмикання / вимкнення змінюється з часом за графік. Він також має параметр швидкості.
Приклад анімації (див. Демонстрацію нижче)
Для посилення реалізму та органічного почуття я додав випадкові інтервали між літерами, зсув дельти y, прозорість, дуже тонке обертання і, нарешті, використовуючи вже "рукописний" шрифт. Вони можуть бути завершені як динамічні параметри, щоб забезпечити широкий спектр "стилів написання".
Для ще більш реалістичного вигляду потрібні будуть дані про шлях, які за замовчуванням не є. Але це короткий та ефективний фрагмент коду, який наближає рукописну поведінку та простий у виконанні.
Як це працює
Визначаючи малюнок тире, ми можемо створити маршові мурашки, пунктирні лінії тощо. Скориставшись цим, визначивши дуже довгу точку для "вимкненої" точки та поступово збільшуючи крапку "ввімкнено", це створить ілюзію промальовування лінії при погладжуванні під час анімації довжини точки.
Оскільки точка відключення настільки довга, повторюваний візерунок не буде видно (довжина буде змінюватися залежно від розміру та характеристик використовуваного шрифту). Шлях листа буде мати довжину, тому нам потрібно переконатися, що у нас є кожна крапка, щонайменше покриває цю довжину.
Для літер, які складаються з декількох контурів (f.ex. O, R, P тощо), як один для контуру, один для порожнистої частини, лінії, здається, малюються одночасно. З цим методом ми не можемо багато чого зробити, оскільки це вимагатиме окремого проходження доступу до кожного сегменту шляху.
Сумісність
Для веб-переглядачів, які не підтримують елемент канви, альтернативний спосіб відображення тексту може бути розміщений між тегами, наприклад стильовий текст:
<canvas ...>
<div class="txtStyle">STROKE-ON CANVAS</div>
</canvas>
Демо
Це створює анімований інсульт ( без залежностей ) -
var ctx = document.querySelector("canvas").getContext("2d"),
dashLen = 220, dashOffset = dashLen, speed = 5,
txt = "STROKE-ON CANVAS", x = 30, i = 0;
ctx.font = "50px Comic Sans MS, cursive, TSCu_Comic, sans-serif";
ctx.lineWidth = 5; ctx.lineJoin = "round"; ctx.globalAlpha = 2/3;
ctx.strokeStyle = ctx.fillStyle = "#1f2f90";
(function loop() {
ctx.clearRect(x, 0, 60, 150);
ctx.setLineDash([dashLen - dashOffset, dashOffset - speed]); // create a long dash mask
dashOffset -= speed; // reduce dash length
ctx.strokeText(txt[i], x, 90); // stroke letter
if (dashOffset > 0) requestAnimationFrame(loop); // animate
else {
ctx.fillText(txt[i], x, 90); // fill final letter
dashOffset = dashLen; // prep next char
x += ctx.measureText(txt[i++]).width + ctx.lineWidth * Math.random();
ctx.setTransform(1, 0, 0, 1, 0, 3 * Math.random()); // random y-delta
ctx.rotate(Math.random() * 0.005); // random rotation
if (i < txt.length) requestAnimationFrame(loop);
}
})();
canvas {background:url(http://i.imgur.com/5RIXWIE.png)}
<canvas width=630></canvas>