Tạm biệt giật lag! Hướng dẫn tối ưu hóa callback cho hoạt ảnh CSS với 3 dòng JavaScript

Tạm biệt giật lag! Hướng dẫn tối ưu hóa callback cho hoạt ảnh CSS với 3 dòng JavaScript

Bạn có bao giờ bối rối vì không thể thực thi một hàm gọi lại (callback) chính xác khi một hoạt ảnh CSS kết thúc không? Việc thiếu cơ chế này thường dẫn đến các vấn đề về đồng bộ hóa, làm trải nghiệm người dùng trở nên kém mượt mà. Bài viết này sẽ hướng dẫn bạn cách sử dụng JavaScript để lắng nghe chính xác sự kiện kết thúc của cả hoạt ảnh (animation) và hiệu ứng chuyển đổi (transition) CSS, giúp bạn kiểm soát hoàn toàn luồng hoạt động của giao diện.

Tại sao cần sử dụng callback cho hoạt ảnh?

Trong phát triển giao diện, chúng ta thường cần thực hiện các hành động cụ thể sau khi một hoạt ảnh hoàn tất:

  • Đóng một modal và reset nội dung bên trong.
  • Tải nội dung mới sau khi một hiệu ứng chuyển trang kết thúc.
  • Gửi form sau khi hiệu ứng nhấn nút hoàn tất.

Khi không có callback chính xác, các hành động này có thể được thực thi quá sớm (gây ra lỗi hiển thị) hoặc quá muộn (ảnh hưởng đến trải nghiệm người dùng).

Nguyên lý cốt lõi: Lắng nghe sự kiện

Các trình duyệt hiện đại hỗ trợ các sự kiện DOM để thông báo khi một hoạt ảnh hoặc hiệu ứng chuyển đổi kết thúc. Các sự kiện này bao gồm:

  • animationend: Kích hoạt khi một hoạt ảnh CSS kết thúc.
  • transitionend: Kích hoạt khi một hiệu ứng chuyển đổi CSS kết thúc.

Tuy nhiên, các phiên bản cũ hơn của trình duyệt (như Safari, Chrome, Firefox cũ) sử dụng các tiền tố (prefix) khác nhau, ví dụ webkitAnimationEnd hoặc oTransitionEnd. Do đó, chúng ta cần một cách để tự động xác định tên sự kiện đúng cho trình duyệt hiện tại.

Dưới đây là một hàm JavaScript giúp phát hiện tên sự kiện phù hợp:

// Hàm để lấy tên sự kiện hoạt ảnh/hiệu ứng chuyển đổi được hỗ trợ
function getSupportedAnimationEvent() {
  const el = document.createElement('div');
  const transitions = {
    'transition': 'transitionend',
    'OTransition': 'oTransitionEnd',
    'MozTransition': 'transitionend',
    'WebkitTransition': 'webkitTransitionEnd'
  };
  const animations = {
    'animation': 'animationend',
    'OAnimation': 'oAnimationEnd',
    'MozAnimation': 'animationend',
    'WebkitAnimation': 'webkitAnimationEnd'
  };

  for (const t in transitions) {
    if (el.style[t] !== undefined) {
      return transitions[t];
    }
  }
  for (const a in animations) {
    if (el.style[a] !== undefined) {
      return animations[a];
    }
  }
  return 'animationend'; // Giá trị mặc định
}

Thực thi callback chính xác với 3 dòng code

Bây giờ, với tên sự kiện đã được xác định, chúng ta có thể dễ dàng thêm một trình nghe sự kiện để thực thi callback. Quá trình này chỉ cần 3 bước đơn giản:

  1. Lấy phần tử HTML mà bạn muốn theo dõi.
  2. Sử dụng addEventListener để lắng nghe sự kiện kết thúc hoạt ảnh.
  3. Định nghĩa hàm callback sẽ được thực thi.

Dưới đây là ví dụ cụ thể:

// Lấy phần tử cần theo dõi
const targetElement = document.getElementById('animated-box');

// Đăng ký lắng nghe sự kiện kết thúc hoạt ảnh
targetElement.addEventListener(getSupportedAnimationEvent(), function handleCompletion() {
  console.log('Hoạt ảnh đã hoàn tất, thực thi logic tiếp theo.');
});

Ví dụ thực tế: Đóng một modal

Hãy xem xét một ví dụ phổ biến: đóng một modal sau khi hiệu ứng mờ dần (fade-out) kết thúc.

const myModal = document.querySelector('.custom-modal');

// Bắt đầu hiệu ứng đóng
myModal.classList.add('slide-out');

// Xử lý sau khi hiệu ứng kết thúc
myModal.addEventListener(getSupportedAnimationEvent(), function onModalHide() {
  myModal.style.visibility = 'hidden';
  myModal.style.opacity = '0';
  // Gỡ bỏ lắng nghe để tránh gọi lại không mong muốn
  myModal.removeEventListener(getSupportedAnimationEvent(), onModalHide);
});

Trong ví dụ này, chúng ta thêm lớp CSS slide-out để kích hoạt hiệu ứng. Sau đó, chúng ta lắng nghe sự kiện kết thúc và ẩn modal. Việc gỡ bỏ trình nghe sự kiện là một best practice quan trọng để tránh hàm callback được gọi nhiều lần nếu có các tương tác khác xảy ra.

Kết luận

Bằng cách sử dụng các sự kiện DOM native như animationendtransitionend, bạn có thể tạo ra các tương tác mượt mà và đáng tin cậy. Phương pháp này giúp giải quyết vấn đề tương thích trình duyệt một cách hiệu quả và cho phép bạn viết code rõ ràng, dễ bảo trì. Cho dù bạn đang phát triển một nút bấm đơn giản hay một hiệu ứng chuyển trang phức tạp, 3 dòng code cốt lõi này sẽ là chìa khóa để kiểm soát hoàn toàn hoạt ảnh CSS trong dự án của bạn.

Thẻ: css JavaScript hoạt ảnh callback DOM

Đăng vào ngày 18 tháng 6 lúc 16:04