Bu kelimenin bir animasyonla çizilmesini istiyorum, böylece sayfa kelimeyi yaptığımız gibi "yazıyor"
Tuval versiyonu
Bu, tek tek karakterleri daha çok elle yazmak gibi çizer. Açma / kapama sırasının karakter başına zamanla değiştiği uzun bir çizgi deseni kullanır. Ayrıca bir hız parametresi vardır.
Örnek animasyon (aşağıdaki demoya bakın)
Gerçekçiliği ve organik hissi arttırmak için, rastgele harf aralığı, bir y delta ofseti, saydamlık, çok ince bir dönüş ve son olarak zaten "el yazısı" bir yazı tipi kullanarak ekledim. Bunlar, çok çeşitli "yazma stilleri" sağlamak için dinamik parametreler olarak sarılabilir.
Daha gerçekçi bir görünüm için, yol verisi varsayılan olarak gerekli değildir. Ancak bu, elle yazılmış davranışa yaklaşan ve uygulanması kolay kısa ve etkili bir kod parçasıdır.
Nasıl çalışır
Bir çizgi deseni tanımlayarak yürüyen karıncalar, noktalı çizgiler vb. Oluşturabiliriz. Bundan "kapalı" nokta için çok uzun bir nokta tanımlayarak ve "açık" nokta kademeli olarak artırarak bundan yararlanarak, nokta uzunluğunu canlandırırken kontur verildiğinde çizgi çizme yanılsaması verecektir.
Kapalı nokta çok uzun olduğu için yinelenen desen görünmez (uzunluk, kullanılan yazı tipinin boyutuna ve özelliklerine göre değişir). Mektubun yolu bir uzunluğa sahip olacak, bu yüzden her noktanın en azından bu uzunluğu kapladığından emin olmalıyız.
Anahat için olduğu gibi birden fazla yoldan (örn. O, R, P vb.) Oluşan harfler için, biri içi boş kısım içindir, çizgiler aynı anda çizilmiş gibi görünecektir. Bu teknikle bu konuda fazla bir şey yapamayız, çünkü her bir yol segmentine ayrı ayrı konulmasını gerektirir.
uygunluk
Tuval öğesini desteklemeyen tarayıcılar için metni göstermenin alternatif bir yolu, örneğin stilize bir metin yerleştirilebilir:
<canvas ...>
<div class="txtStyle">STROKE-ON CANVAS</div>
</canvas>
gösteri
Bu canlı animasyonlu inme üretir ( bağımlılık yok ) -
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>