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

Lỗi sai thường gặp khi làm việc với hình ảnh

0 0 2

Người đăng: Vũ Trần Lê Anh

Theo Viblo Asia

Mô tả hình ảnh

💥 Đừng Để Website Của Bạn "Nhảy Múa"! Bí Quyết Fix Lỗi SHAKING "Khó Chịu Với Hình Ảnh" 💥

Chào anh em FrontEnd Devs! 👋

Anh em có bao giờ gặp tình huống này chưa? Khi tạo hóa đơn và hiển thị mã QR lấy từ server, mọi thứ có vẻ smooth. Nhưng khi loading indicator biến mất, cái hình ảnh QR code "nhảy tưng tưng" trên màn hình một cái rồi mới ổn định? 😵💫

Đây chính là hiện tượng layout SHAKING hay Cumulative Layout Shift (CLS) – một nỗi ám ảnh thầm lặng của nhiều Dev. Và hôm nay, chúng ta sẽ mổ xẻ nguyên nhân và tìm ra giải pháp triệt để cho vấn đề "nhức nhối" này!

🧐 Vấn Đề Gốc Rễ: Loading & Rendering Hình Ảnh Không Đồng Bộ

Trong quy trình tạo hóa đơn, chúng ta thường:

  1. Bắt đầu gọi API để lấy đường dẫn QR code: Set loading = true (hiển thị skeleton).
  2. Khi API trả về đường dẫn ảnh: Set loading = false (ẩn skeleton), rồi gán đường dẫn vào thẻ <img>.

Nghe có vẻ hợp lý phải không? Nhưng đây chính là lúc vấn đề phát sinh!

Sau khi API trả về URL, trình duyệt cần thêm một khoảng thời gian nhất định để tải, giải mã và hiển thị hình ảnh. Trong khoảng thời gian "chết" này, nếu không có thông tin về kích thước ảnh, trình duyệt sẽ không thể "dự đoán" được chiều cao/chiều rộng của nó. Kết quả là gì? Màn hình co giãn đột ngột (SHAKING) khi ảnh cuối cùng xuất hiện!


🖼️ Trình Duyệt Sẽ Làm Gì Khi Có Thẻ <img>?

Để hiểu rõ hơn, hãy cùng xem lại "hành trình" một bức ảnh được hiển thị:

  1. Phân tích HTML: Trình duyệt đọc và nhận diện thẻ <img> trong DOM.
  2. Gửi Yêu Cầu Tải Ảnh: Gửi HTTP GET request tới src để lấy ảnh.
  3. Nhận Dữ Liệu Ảnh: Server phản hồi dữ liệu (có thể là từng phần).
  4. Giải Mã Ảnh: Khi nhận đủ dữ liệu, trình duyệt giải mã định dạng ảnh (JPEG, PNG, SVG...).
  5. Kích Hoạt onload: Toàn bộ dữ liệu được tải và giải mã xong, sự kiện onload trên <img> được bắn.
  6. Vẽ Ảnh Lên Giao Diện: Trình duyệt đưa ảnh vào cây render và hiển thị lên màn hình.

NHẬN RA CHƯA? Việc ảnh được hiển thị là bước CUỐI CÙNG trong cả một quy trình dài!


🚫 Quy Trình Sai Lầm: Kích Hoạt loading = false Quá Sớm

Đây là chuỗi sự kiện dễ gây ra lỗi SHAKING:

  1. loading = true (Hiển thị Skeleton)
  2. Gọi API
  3. Server trả về đường dẫn ảnh
  4. loading = false (Skeleton biến mất ngay lập tức!)
  5. Trình duyệt bắt đầu tải ảnh...
  6. ...Giải mã ảnh...
  7. ...Và cuối cùng mới hiển thị ảnh.

Trong khoảng thời gian từ bước 4 đến bước 7, không gian dành cho ảnh bị "trống", skeleton đã biến mất, và khi ảnh xuất hiện, nó "ép" các thành phần khác phải dịch chuyển, gây ra SHAKING.


✅ Quy Trình Chuẩn: Đợi Ảnh Tải Xong Mới Tắt Skeleton!

Để khắc phục, chúng ta cần đảm bảo rằng skeleton chỉ biến mất khi hình ảnh đã SẴN SÀNG để hiển thị, tức là sau khi sự kiện onload của ảnh được kích hoạt.

  1. loading = true (Hiển thị Skeleton)
  2. Gọi API
  3. Server trả về đường dẫn ảnh
  4. Gán đường dẫn vào thẻ <img>
  5. Trình duyệt bắt đầu tải ảnh...
  6. ...Giải mã ảnh...
  7. **...Kích hoạt sự kiện onload của <img>
  8. Trong sự kiện onload này: loading = false (Ẩn Skeleton)
  9. Trình duyệt vẽ ảnh lên giao diện

Bằng cách này, skeleton sẽ "chiếm" chỗ cho hình ảnh cho đến khi ảnh thực sự được tải và sẵn sàng hiển thị, loại bỏ hoàn toàn tình trạng SHAKING khó chịu! ✨


Chỉ một chút tinh chỉnh trong logic xử lý loading và lắng nghe sự kiện onload của <img> là chúng ta đã giải quyết được một vấn đề lớn về trải nghiệm người dùng!

Anh em còn gặp vấn đề gì về FrontEnd nữa không? Cùng chia sẻ với mình qua LinkedIn nhé! 👇

Bình luận

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

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

Một vài thủ thuật CSS mà chính Frontend có thể còn chưa biết (Phần 30)

. Hello xin chào mọi người, mình đã trở lại và tiếp tục với phần 30 của series về Một vài thủ thuật CSS mà chính Frontend có thể còn chưa biết. Bắt đầu thôi nào.

0 0 52

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

5 câu hỏi phỏng vấn Frontend giúp bạn tự tin hơn khi sử dụng bất đồng bộ trong Javascript

Một trong những điều khó khăn khi học Javascript là promises. Chúng không dễ hiểu và có thể cần một vài hướng dẫn và một thời gian kha khá để vận dụng chúng.

0 0 109

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

Một vài thủ thuật CSS mà chính Frontend có thể còn chưa biết (Phần 31)

Hello xin chào mọi người, mình đã trở lại và tiếp tục với phần 31 của series về Một vài thủ thuật CSS mà chính Frontend có thể còn chưa biết. Bắt đầu thôi nào.

0 0 50

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

Những lý do khiến mình thích CSS custom properties hơn SASS variables?

Halo các bạn,. Lại là mình với một bài post liên quan tới chủ đề Front-end đây Mình còn nhớ hồi mình bắt đầu tìm hiểu và bị SASS lôi cuốn, mình đã nghĩ rằng mình sẽ chẳng bao giờ cần dùng đụng tới CSS

0 0 92

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

Usability là gì? Những lưu ý khi thiết kế Usability

Usability là một yếu tố quan trọng trong sự thành bại của sản phẩm. Thật đáng tiếc khi sản phẩm làm ra ưu việt về tính năng, nhưng lại không được người dùng tiếp nhận, đơn giản chỉ vì khó sử dụng.

0 0 42

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

7 Repos cho Front-End mà chính bạn còn không biết là bạn cần nó

. Những repos chẳng mấy khi được nhắc đến nhưng lại giúp bạn build mọi thứ nhanh hơn và tốt hơn nhiều. Chúng ta đang sống trong một thời đại có sẵn các công cụ và tài nguyên hoàn hảo, chúng chỉ cách t

0 0 44