Bạn có thể tạo ảnh động bằng CSS hoặc JavaScript. Bạn nên sử dụng loại nào và tại sao?
Có hai cách chính để tạo ảnh động trên web: bằng CSS và bằng JavaScript. Bạn nên chọn loại nào phụ thuộc vào các phần phụ thuộc khác của dự án và loại hiệu ứng mà bạn đang cố gắng đạt được.
Tóm tắt
- Sử dụng ảnh động CSS cho các hiệu ứng chuyển đổi "một lần" đơn giản hơn, chẳng hạn như bật/tắt trạng thái thành phần trên giao diện người dùng.
- Sử dụng ảnh động JavaScript khi bạn muốn có các hiệu ứng nâng cao như bật nảy, dừng, tạm dừng, tua lại hoặc làm chậm.
- Nếu bạn chọn tạo ảnh động bằng JavaScript, hãy sử dụng API Ảnh động trên web hoặc một khung hiện đại mà bạn cảm thấy thoải mái.
Bạn có thể tạo hầu hết ảnh động cơ bản bằng CSS hoặc JavaScript, nhưng mức độ nỗ lực và thời gian sẽ khác nhau (xem thêm phần Hiệu suất của CSS so với JavaScript). Mỗi phương thức đều có ưu và nhược điểm, nhưng sau đây là những nguyên tắc hay:
- Sử dụng CSS khi bạn có các trạng thái nhỏ hơn, độc lập cho các thành phần trên giao diện người dùng. Hiệu ứng chuyển đổi và ảnh động CSS rất phù hợp để đưa trình đơn điều hướng vào từ bên cạnh hoặc hiển thị chú giải công cụ. Bạn có thể sử dụng JavaScript để kiểm soát các trạng thái, nhưng bản thân ảnh động sẽ nằm trong CSS.
- Sử dụng JavaScript khi bạn cần kiểm soát đáng kể đối với ảnh động. Web Animations API là phương pháp dựa trên tiêu chuẩn, hiện có trong hầu hết các trình duyệt hiện đại. Điều này cung cấp các đối tượng thực, lý tưởng cho các ứng dụng hướng đối tượng phức tạp. JavaScript cũng hữu ích khi bạn cần dừng, tạm dừng, làm chậm hoặc đảo ngược ảnh động.
- Sử dụng trực tiếp
requestAnimationFrame
khi bạn muốn điều phối toàn bộ cảnh theo cách thủ công. Đây là một phương pháp JavaScript nâng cao, nhưng có thể hữu ích nếu bạn đang xây dựng trò chơi hoặc vẽ lên canvas HTML.
Ngoài ra, nếu đang sử dụng một khung JavaScript có chức năng ảnh động, chẳng hạn như thông qua phương thức .animate()
của jQuery hoặc TweenMax của GreenSock, thì bạn có thể thấy thuận tiện hơn khi sử dụng khung đó cho ảnh động.
Tạo ảnh động bằng CSS
Tạo ảnh động bằng CSS là cách đơn giản nhất để tạo chuyển động trên màn hình. Phương pháp này được mô tả là khai báo vì bạn chỉ định những gì bạn muốn xảy ra.
Dưới đây là một số CSS di chuyển phần tử 100px
theo cả trục X và Y. Bạn có thể thực hiện việc này bằng cách sử dụng hiệu ứng chuyển đổi CSS được đặt để lấy 500ms
. Khi lớp move
được thêm, giá trị transform
sẽ thay đổi và quá trình chuyển đổi bắt đầu.
.box {
transform: translate(0, 0);
transition: transform 500ms;
}
.box.move {
transform: translate(100px, 100px);
}
Ngoài thời lượng của hiệu ứng chuyển đổi, bạn có thể chọn easing (tốc độ chuyển đổi). Về cơ bản, đây là cảm giác mà ảnh động mang lại. Để biết thêm thông tin về hiệu ứng làm dịu, hãy xem hướng dẫn Kiến thức cơ bản về hiệu ứng làm dịu.
Nếu tạo các lớp CSS riêng biệt để quản lý ảnh động như trong đoạn mã trên, bạn có thể sử dụng JavaScript để bật và tắt từng ảnh động:
box.classList.add('move');
Việc này giúp ứng dụng của bạn cân bằng hơn. Bạn có thể tập trung vào việc quản lý trạng thái bằng JavaScript và chỉ cần đặt các lớp thích hợp trên các phần tử mục tiêu, để trình duyệt xử lý ảnh động. Nếu chọn cách này, bạn có thể nghe các sự kiện transitionend
trên phần tử, nhưng chỉ khi bạn có thể bỏ qua tính năng hỗ trợ cho các phiên bản Internet Explorer cũ; phiên bản 10 là phiên bản đầu tiên hỗ trợ các sự kiện này. Tất cả trình duyệt khác đã hỗ trợ sự kiện này trong một thời gian.
JavaScript cần thiết để nghe sự kiện kết thúc chuyển đổi sẽ có dạng như sau:
var box = document.querySelector('.box');
box.addEventListener('transitionend', onTransitionEnd, false);
function onTransitionEnd() {
// Handle the transition finishing.
}
Ngoài việc sử dụng hiệu ứng chuyển đổi CSS, bạn cũng có thể sử dụng ảnh động CSS để có nhiều quyền kiểm soát hơn đối với các khung hình chính, thời lượng và số lần lặp lại của ảnh động riêng lẻ.
Ví dụ: bạn có thể tạo ảnh động cho hộp theo cách tương tự với hiệu ứng chuyển đổi, nhưng tạo ảnh động mà không cần người dùng tương tác như nhấp chuột và lặp lại vô hạn. Bạn cũng có thể thay đổi nhiều tài sản cùng một lúc.
.box {
animation-name: movingBox;
animation-duration: 1300ms;
animation-iteration-count: infinite;
animation-direction: alternate;
}
@keyframes movingBox {
0% {
transform: translate(0, 0);
opacity: 0.3;
}
25% {
opacity: 0.9;
}
50% {
transform: translate(100px, 100px);
opacity: 0.2;
}
100% {
transform: translate(30px, 30px);
opacity: 0.8;
}
}
Với ảnh động CSS, bạn xác định chính ảnh động đó độc lập với phần tử mục tiêu và sử dụng thuộc tính animation-name
để chọn ảnh động bắt buộc.
Nếu muốn ảnh động CSS hoạt động trên các trình duyệt cũ, bạn cần thêm tiền tố của nhà cung cấp. Có nhiều công cụ có thể giúp bạn tạo các phiên bản CSS có tiền tố mà bạn cần, cho phép bạn viết phiên bản không có tiền tố trong tệp nguồn.
Tạo ảnh động bằng JavaScript và API Ảnh động trên web
So với việc viết hiệu ứng chuyển đổi hoặc ảnh động CSS, việc tạo ảnh động bằng JavaScript phức tạp hơn, nhưng thường mang lại cho nhà phát triển nhiều quyền hơn đáng kể. Bạn có thể sử dụng Web Animations API để tạo ảnh động cho các thuộc tính CSS cụ thể hoặc tạo các đối tượng hiệu ứng có thể kết hợp.
Ảnh động JavaScript là bắt buộc vì bạn viết ảnh động này cùng dòng với mã của mình. Bạn cũng có thể đóng gói các đối tượng này bên trong các đối tượng khác. Dưới đây là mã JavaScript mà bạn cần viết để tạo lại hiệu ứng chuyển đổi CSS được mô tả ở trên:
var target = document.querySelector('.box');
var player = target.animate([
{transform: 'translate(0)'},
{transform: 'translate(100px, 100px)'}
], 500);
player.addEventListener('finish', function() {
target.style.transform = 'translate(100px, 100px)';
});
Theo mặc định, Ảnh động trên web chỉ sửa đổi cách trình bày của một phần tử. Nếu muốn đối tượng của bạn vẫn ở vị trí đã di chuyển đến, bạn nên sửa đổi các kiểu cơ bản của đối tượng đó khi ảnh động kết thúc, theo mẫu của chúng tôi.
Web Animations API là một tiêu chuẩn tương đối mới của W3C. Tính năng này được hỗ trợ sẵn trong hầu hết các trình duyệt hiện đại. Đối với các trình duyệt hiện đại không hỗ trợ, có một polyfill.
Với ảnh động JavaScript, bạn có toàn quyền kiểm soát kiểu của một phần tử ở mọi bước. Điều này có nghĩa là bạn có thể làm chậm, tạm dừng, dừng, đảo ngược và thao tác với các phần tử khi thấy phù hợp. Điều này đặc biệt hữu ích nếu bạn đang xây dựng các ứng dụng phức tạp, hướng đối tượng, vì bạn có thể đóng gói hành vi của mình một cách thích hợp.