- vừa được xem lúc

Vanilla JS Project: Animated sticker

0 0 70

Người đăng: kentrung

Theo Viblo Asia

1. Yêu cầu

Yêu cầu bài toán là cho sẵn một ảnh lớn bên trong có 20 khung hình, mỗi khung hình mô tả chuyển động của nhân vật. Nhiệm vụ của bạn là lặp các khung hình liên tục từ đầu tới cuối để tạo thành một sticker chuyển động giống như ảnh gif bên dưới. Đây là một trong những bài tập vanilla Javascript ở mức cơ bản giúp các bạn làm quen, chủ yếu giải thích về Javascript nên phần giao diện sẽ không phân tích nhiều. Hi vọng với bài tập này các bạn sẽ thấy thích thú khi học Javascript.

2. Chuẩn bị file

Trước khi bắt tay vào làm ta cùng xem ảnh lớn như thế nào để các bạn dễ hình dung.

3. Giao diện HTML - CSS

<!DOCTYPE html>
<html lang="en">
<head> <meta charset="UTF-8"> <title>Animated sticker</title> <style type="text/css"> .sticker { width: 130px; height: 130px; background: url(Usagyuuun.png) no-repeat 0 0; } </style>
</head>
<body> <h1>Animated sticker</h1> <div class="sticker"></div> <script type="text/javascript"> // code Javascript </script>
</body>
</html>

4. Hướng giải quyết chính

Bước 1: Biết về CSS Image Sprites

Bạn có thể vào đường link bên dưới để tìm hiểu: https://kentrung256.blogspot.com/2019/10/tim-hieu-ky-thuat-css-image-sprites.html

Bước 2: Đánh số ảnh

Bước này nhằm giúp các bạn dễ theo dõi các hình ảnh chuyển động thôi, mình đã clone ảnh gốc và đánh số cho từng hình như bên dưới.

Bước 3: Xác định kích thước của mỗi khung hình nhỏ

  • Ta có ảnh lớn kích thước đo được là: 2600x130
  • Ảnh lớn được chia theo kiểu 1 hàng ngang 20 ảnh
  • Như vậy mỗi hình nhỏ sẽ có kích thước: 130x130 = (2600 / 20)

Bước 4: Xác định chuyển động cho từng khung hình

  • Về lí thuyết cứ 24 hình di chuyển trong 1 giây thì mắt người coi đấy là một chuyển động liên tục, tuy nhiên với chuyển động sticker ta không cần phải đủ yêu cầu trên, có khi 19-20 hình di chuyển cũng ok rồi không cần phải mượt mà quá.
  • Thời gian chuyển động mỗi khung hình ta dùng setInterval với thời gian là: 1000/20 = 50(ms)
  • Đặt một biến để biết ảnh tiếp theo sẽ cách bao nhiêu px: step = 130
  • Đặt một biến đếm giá trị ban đầu count = 1, mỗi lần có bước nhảy thì count + 1, khi count tăng lên và lớn hơn 20 thì ta reset nó về 1 (vì ta chỉ có 20 hình thôi)
  • Để thay đổi ảnh thì ta cần biết thông tin của vị trí postionX trong css, tọa độ này lại phụ thuộc vào vị trí từng ảnh. Để dễ theo dõi và fix bug mình khuyên các bạn nên dùng ảnh đã đánh số để nhìn rõ thứ tự, giảm thời gian chuyển động xuống cho chậm lại dễ nhìn, cái khó hiểu có lẽ sẽ là tại sao step lại mang giá trị âm và việc tính toán giá trị positionX mà thôi.

5. Javascript

const layoutWidth = 2600
const layoutHeight = 130
const totalImages = 20
const imageWidth = layoutWidth / totalImages
const imageHeight = layoutHeight
let count = 1
let positionX = 0
const stickerElement = document.querySelector('.sticker') setInterval(function() { positionX = -(imageWidth * count) stickerElement.style.backgroundPosition = `${positionX}px 0` count++ count = (count >= totalImages) ? 0 : count
}, 1000 / totalImages)

Kết quả đã được tua chậm và dùng bản đánh số cho dễ nhìn

6. Yêu cầu nâng cao

  • Yêu cầu 1: Hình ở bài tập trên được sắp xếp theo kiểu dàn thành hàng ngang hết nhưng giờ hãy thử độ khó hơn với kiểu sắp xếp bên dưới, code chắc chắn sẽ khiến bạn tiền đình hơn nhiều.

  • Yêu cầu 2: Nếu bạn hay chat facebook - zalo thì ở phần stickers các sticker đều đứng im, nó chỉ chuyển động khi chúng ta di chuột vào nó, sau khi nó chuyển động xong thì lại đứng im. Bạn nào làm được có thể gửi link cho mình và các bạn khác tham khảo cách làm nhé.


Bài viết đến đây là hết, hi vọng với bài viết này các bạn đã thêm được nhiều kiến thức bổ ích. Hẹn gặp lại các bạn ở bài viết tiếp theo!

Demo online: https://animated-sticker.kentrung.repl.co/

Code online: https://repl.it/@kentrung/Animated-sticker

Series vanilla Javascript projects: https://viblo.asia/s/vanilla-javascript-projects-P0lPmryg5ox

Bình luận

Bài viết tương tự

- vừa được xem lúc

Giới thiệu Typescript - Sự khác nhau giữa Typescript và Javascript

Typescript là gì. TypeScript là một ngôn ngữ giúp cung cấp quy mô lớn hơn so với JavaScript.

0 0 525

- vừa được xem lúc

Bạn đã biết các tips này khi làm việc với chuỗi trong JavaScript chưa ?

Hi xin chào các bạn, tiếp tục chuỗi chủ đề về cái thằng JavaScript này, hôm nay mình sẽ giới thiệu cho các bạn một số thủ thuật hay ho khi làm việc với chuỗi trong JavaScript có thể bạn đã hoặc chưa từng dùng. Cụ thể như nào thì hãy cùng mình tìm hiểu trong bài viết này nhé (go).

0 0 433

- vừa được xem lúc

Một số phương thức với object trong Javascript

Trong Javascript có hỗ trợ các loại dữ liệu cơ bản là giống với hầu hết những ngôn ngữ lập trình khác. Bài viết này mình sẽ giới thiệu về Object và một số phương thức thường dùng với nó.

0 0 153

- vừa được xem lúc

Tìm hiểu về thư viện axios

Giới thiệu. Axios là gì? Axios là một thư viện HTTP Client dựa trên Promise.

0 0 145

- vừa được xem lúc

Imports và Exports trong JavaScript ES6

. Giới thiệu. ES6 cung cấp cho chúng ta import (nhập), export (xuất) các functions, biến từ module này sang module khác và sử dụng nó trong các file khác.

0 0 110

- vừa được xem lúc

Bài toán đọc số thành chữ (phần 2) - Hoàn chỉnh chương trình dưới 100 dòng code

Tiếp tục bài viết còn dang dở ở phần trước Phân tích bài toán đọc số thành chữ (phần 1) - Phân tích đề và những mảnh ghép đầu tiên. Bạn nào chưa đọc thì có thể xem ở link trên trước nhé.

0 0 245