Chcę, aby to słowo zostało narysowane za pomocą animacji, tak aby strona „zapisała” to słowo w taki sam sposób, jak my
Wersja na płótnie
Spowoduje to narysowanie pojedynczych znaków bardziej niż pisanie ręcznie. Wykorzystuje długi wzorzec myślowy, w którym kolejność włączania / wyłączania jest zmieniana w czasie na znak. Ma również parametr prędkości.
Przykładowa animacja (patrz demo poniżej)
Aby zwiększyć realizm i wrażenia organiczne, dodałem losowe odstępy między literami, przesunięcie delta y, przezroczystość, bardzo subtelny obrót i na koniec używając już „ręcznie napisanej” czcionki. Można je zawrzeć jako parametry dynamiczne, aby zapewnić szeroki zakres „stylów pisania”.
Aby uzyskać jeszcze bardziej realistyczny wygląd, wymagane byłyby dane ścieżki, które nie są domyślnie. Jest to jednak krótki i wydajny fragment kodu, który aproksymuje zachowanie napisane odręcznie i jest łatwy do wdrożenia.
Jak to działa
Definiując wzór kreski, możemy tworzyć marszowe mrówki, linie kropkowane i tak dalej. Wykorzystując to, definiując bardzo długą kropkę dla „wyłączonej” kropki i stopniowo zwiększając „włączoną” kropkę, da to złudzenie rysowania linii podczas głaskania podczas animacji długości kropki.
Ponieważ kropka wyłączona jest tak długa, powtarzający się wzór nie będzie widoczny (długość będzie się różnić w zależności od rozmiaru i właściwości używanego kroju pisma). Ścieżka litery będzie miała długość, więc musimy upewnić się, że każda kropka pokrywa przynajmniej tę długość.
W przypadku liter, które składają się z więcej niż jednej ścieżki (np. O, R, P itd.), Tak jak jedna dla konturu, jedna dla pustej części, linie będą wyglądały na narysowane jednocześnie. Dzięki tej technice nie możemy wiele na to poradzić, ponieważ wymagałoby to dostępu do każdego segmentu ścieżki, aby był głaskany osobno.
Zgodność
W przypadku przeglądarek, które nie obsługują elementu canvas, można umieścić alternatywny sposób wyświetlania tekstu między tagami, na przykład tekst w stylu:
<canvas ...>
<div class="txtStyle">STROKE-ON CANVAS</div>
</canvas>
Próbny
Powoduje to animowane uderzenie na żywo ( bez zależności ) -
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>