Tôi muốn từ này được vẽ bằng một hình ảnh động, sao cho trang "viết" từ đó giống như cách chúng ta sẽ
Phiên bản vải
Điều này sẽ vẽ các ký tự đơn giống như người ta sẽ viết bằng tay. Nó sử dụng mô hình dấu gạch ngang dài trong đó thứ tự bật / tắt được hoán đổi theo thời gian trên mỗi char. Nó cũng có một tham số tốc độ.
Ví dụ hoạt hình (xem bản demo bên dưới)
Để tăng tính chân thực và cảm giác hữu cơ, tôi đã thêm khoảng cách chữ ngẫu nhiên, độ lệch y delta, độ trong suốt, góc xoay rất tinh tế và cuối cùng sử dụng phông chữ "viết tay". Chúng có thể được gói thành các tham số động để cung cấp một loạt các "kiểu viết".
Đối với một cái nhìn thực tế hơn nữa, dữ liệu đường dẫn sẽ được yêu cầu theo mặc định. Nhưng đây là một đoạn mã ngắn và hiệu quả, xấp xỉ hành vi viết tay và dễ thực hiện.
Làm thế nào nó hoạt động
Bằng cách xác định một mẫu gạch ngang, chúng ta có thể tạo ra những con kiến diễu hành, những đường chấm chấm v.v. Tận dụng lợi thế này bằng cách xác định một chấm rất dài cho dấu chấm "tắt" và tăng dần dấu chấm "bật", nó sẽ tạo ảo giác vẽ đường thẳng khi được vuốt trong khi tạo hiệu ứng cho chiều dài của chấm.
Vì dấu chấm quá dài nên mẫu lặp lại sẽ không hiển thị (độ dài sẽ thay đổi theo kích thước và đặc điểm của kiểu chữ được sử dụng). Đường dẫn của chữ cái sẽ có độ dài, vì vậy chúng tôi cần đảm bảo rằng chúng tôi có mỗi dấu chấm ít nhất bao phủ chiều dài này.
Đối với các chữ cái bao gồm nhiều hơn một đường dẫn (ví dụ: O, R, P, v.v.) như một dành cho phác thảo, một là cho phần rỗng, các dòng sẽ xuất hiện để được vẽ đồng thời. Chúng ta không thể làm gì nhiều với điều đó với kỹ thuật này vì nó sẽ yêu cầu quyền truy cập vào từng đoạn đường dẫn được vuốt riêng.
Khả năng tương thích
Đối với các trình duyệt không hỗ trợ phần tử canvas, một cách khác để hiển thị văn bản có thể được đặt giữa các thẻ, ví dụ: văn bản được tạo kiểu:
<canvas ...>
<div class="txtStyle">STROKE-ON CANVAS</div>
</canvas>
Bản giới thiệu
Điều này tạo ra đột quỵ hoạt hình trực tiếp ( không phụ thuộc ) -
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>