Cách tạo ảnh động CSS hiệu suất cao

Hướng dẫn này chỉ cho bạn cách tạo ảnh động CSS hiệu suất cao.

Hãy xem phần Tại sao một số ảnh động bị chậm? để tìm hiểu lý thuyết đằng sau những đề xuất này.

Khả năng tương thích với trình duyệt

Tất cả các tài sản CSS mà hướng dẫn này đề xuất đều có khả năng hỗ trợ tốt trên nhiều trình duyệt.

transform

Hỗ trợ trình duyệt

  • 36
  • 12
  • 16
  • 9

Nguồn

opacity

Hỗ trợ trình duyệt

  • 1
  • 12
  • 1
  • 2

Nguồn

will-change

Hỗ trợ trình duyệt

  • 36
  • 79
  • 36
  • 9.1

Nguồn

Di chuyển phần tử

Để di chuyển một phần tử, hãy sử dụng giá trị từ khoá translate hoặc rotation của thuộc tính transform.

Ví dụ: để trượt một mục vào khung hiển thị, hãy sử dụng translate.

.animate {
  animation: slide-in 0.7s both;
}

@keyframes slide-in {
  0% {
    transform: translateY(-1000px);
  }
  100% {
    transform: translateY(0);
  }
}

Sử dụng rotate để xoay các phần tử. Ví dụ sau đây xoay 360 độ.

.animate {
  animation: rotate 0.7s ease-in-out both;
}

@keyframes rotate {
  0% {
    transform: rotate(0);
  }
  100% {
    transform: rotate(360deg);
  }
}

Đổi kích thước một phần tử

Để đổi kích thước một phần tử, hãy sử dụng giá trị từ khoá scale của thuộc tính transform.

.animate {
  animation: scale 1.5s both;
}

@keyframes scale {
  50% {
    transform: scale(0.5);
  }
  100% {
    transform: scale(1);
  }
}

Thay đổi chế độ hiển thị của một phần tử

Để hiện hoặc ẩn một phần tử, hãy dùng opacity.

.animate {
  animation: opacity 2.5s both;
}

@keyframes opacity {
  0% {
    opacity: 1;
  }
  50% {
    opacity: 0;
  }
  100% {
    opacity: 1;
  }
}

Tránh các thuộc tính kích hoạt bố cục hoặc tô màu

Trước khi sử dụng bất kỳ thuộc tính CSS nào cho ảnh động (ngoài transformopacity), hãy xác định tác động của thuộc tính đó đối với quy trình hiển thị. Tránh bất kỳ thuộc tính nào kích hoạt bố cục hoặc tô màu trừ khi thực sự cần thiết.

Buộc tạo lớp

Như đã giải thích trong phần Tại sao một số ảnh động bị chậm?, việc đặt các phần tử trên một lớp mới sẽ cho phép trình duyệt vẽ lại các phần tử đó mà không cần vẽ lại phần còn lại của bố cục.

Các trình duyệt thường có thể đưa ra quyết định sáng suốt về việc nên đặt các mục nào trên một lớp mới, nhưng bạn có thể buộc tạo lớp theo cách thủ công bằng thuộc tính will-change. Đúng như tên gọi, thuộc tính này cho trình duyệt biết rằng phần tử này sẽ được thay đổi theo một cách nào đó.

Trong CSS, bạn có thể áp dụng will-change cho bất kỳ bộ chọn nào:

body > .sidebar {
  will-change: transform;
}

Tuy nhiên, quy cách kỹ thuật cho thấy bạn chỉ nên làm việc này đối với các phần tử luôn sắp thay đổi. Ví dụ: điều này có thể đúng cho một thanh bên mà người dùng có thể trượt vào và trượt ra. Đối với các phần tử không thay đổi thường xuyên, bạn nên áp dụng will-change bằng cách sử dụng JavaScript khi có khả năng xảy ra thay đổi. Hãy đảm bảo trình duyệt có đủ thời gian để thực hiện các hoạt động tối ưu hoá cần thiết và xoá thuộc tính này khi thay đổi đã dừng.

Nếu buộc tạo lớp trong trình duyệt không hỗ trợ will-change (nhiều khả năng là Internet Explorer), thì bạn có thể đặt transform: translateZ(0).

Gỡ lỗi ảnh động chậm hoặc nhiễu

Công cụ của Chrome cho nhà phát triển và Công cụ của Firefox cho nhà phát triển có rất nhiều công cụ giúp bạn tìm ra lý do ảnh động của bạn bị chậm hoặc gặp sự cố.

Kiểm tra xem ảnh động có kích hoạt bố cục hay không

Ảnh động di chuyển một phần tử bằng cách sử dụng yếu tố khác không phải transform có thể bị chậm. Ví dụ sau đây so sánh ảnh động sử dụng transform với một ảnh động sử dụng topleft.

Không nên
.box {
  position: absolute;
  top: 10px;
  left: 10px;
  animation: move 3s ease infinite;
}

@keyframes move {
  50% {
     top: calc(90vh - 160px);
     left: calc(90vw - 200px);
  }
}
Nên
.box {
  position: absolute;
  top: 10px;
  left: 10px;
  animation: move 3s ease infinite;
}

@keyframes move {
  50% {
     transform: translate(calc(90vw - 200px), calc(90vh - 160px));
  }
}

Bạn có thể kiểm thử vấn đề này trong 2 ví dụ về sự cố sau đây và tìm hiểu hiệu suất bằng Công cụ cho nhà phát triển.

Công cụ của Chrome cho nhà phát triển

  1. Mở bảng điều khiển Hiệu suất.
  2. Ghi lại hiệu suất thời gian chạy trong khi ảnh động của bạn đang diễn ra.
  3. Kiểm tra thẻ Tóm tắt.

Nếu bạn thấy một giá trị khác 0 cho Rendering (Hiển thị) trong thẻ Summary (Tóm tắt), thì có thể tức là ảnh động của bạn đang khiến trình duyệt thực hiện công việc bố cục.

Bảng điều khiển Tóm tắt cho thấy 37 mili giây đối với kết xuất và 79 mili giây để vẽ.
Ví dụ về animation-with-top-left gây ra quá trình kết xuất.
Bảng điều khiển Summary (Tóm tắt) cho thấy 0 giá trị để kết xuất và tô màu.
Ví dụ về ảnh động có biến đổi không gây ra tác vụ kết xuất.

Công cụ của Firefox cho nhà phát triển

Trong Công cụ của Firefox cho nhà phát triển, Thác nước có thể giúp bạn biết được trình duyệt đang dành thời gian vào đâu.

  1. Mở bảng điều khiển Hiệu suất.
  2. Bắt đầu ghi hiệu suất trong khi ảnh động của bạn đang diễn ra.
  3. Dừng ghi hình rồi kiểm tra thẻ Thác nước.

Nếu bạn thấy các mục nhập cho Recalculate Style (Tính toán lại kiểu), điều đó có nghĩa là trình duyệt phải quay lại phần đầu của thác nước kết xuất để kết xuất ảnh động.

Kiểm tra xem có khung hình bị rớt không

  1. Mở thẻ Kết xuất trong Công cụ của Chrome cho nhà phát triển.
  2. Bật hộp đánh dấu FPS meter.
  3. Xem các giá trị trong khi ảnh động của bạn chạy.

Chú ý đến nhãn Khung ở đầu giao diện người dùng đồng hồ FPS. Cột này cho thấy các giá trị như 50% 1 (938 m) dropped of 1878. Ảnh động có hiệu suất cao có tỷ lệ phần trăm cao, chẳng hạn như 99%, nghĩa là có một vài khung hình bị giảm và ảnh động trông mượt mà.

Máy đo khung hình/giây cho thấy 50% số khung hình bị bỏ
Ví dụ animation-with-top-left khiến 50% số khung hình bị rớt
Máy đo khung hình/giây chỉ cho thấy 1% số khung hình bị bỏ
Ví dụ về ảnh động có biến đổi chỉ khiến 1% số khung hình bị rớt.

Kiểm tra xem ảnh động có kích hoạt việc hiển thị hay không

Một số thuộc tính đắt hơn cho trình duyệt để vẽ các thuộc tính khác. Ví dụ: bất kỳ thứ gì có liên quan đến việc làm mờ (chẳng hạn như bóng) sẽ vẽ lâu hơn so với vẽ một hộp màu đỏ. Những khác biệt này không phải lúc nào cũng rõ ràng trong CSS, nhưng Công cụ của trình duyệt có thể giúp bạn xác định những khu vực cần vẽ lại, cũng như các vấn đề khác về hiệu suất liên quan đến việc sơn.

Công cụ của Chrome cho nhà phát triển

  1. Mở thẻ Kết xuất trong Công cụ của Chrome cho nhà phát triển.
  2. Chọn Paint Flashing.
  3. Di chuyển con trỏ xung quanh màn hình.
Một thành phần trên giao diện người dùng được làm nổi bật bằng màu xanh lục để minh hoạ thành phần đó sẽ được vẽ lại
Trong ví dụ này trên Google Maps, bạn có thể thấy các thành phần được sơn lại.

Nếu bạn thấy toàn bộ màn hình nhấp nháy hoặc các vùng được đánh dấu mà bạn cho rằng không nên thay đổi, hãy kiểm tra thêm.

Nếu bạn cần xác định xem một thuộc tính cụ thể có gây ra các vấn đề về hiệu suất liên quan đến tính năng vẽ hay không, thì trình phân tích màu vẽ trong Công cụ của Chrome cho nhà phát triển có thể giúp ích cho bạn.

Công cụ của Firefox cho nhà phát triển

  1. Mở phần Cài đặt và thêm nút Hộp công cụ để Bật/tắt màu sơn nhấp nháy.
  2. Trên trang bạn muốn kiểm tra, hãy bật nút này rồi di chuột hoặc cuộn để xem các vùng được đánh dấu.

Kết luận

Nếu có thể, hãy hạn chế ảnh động trong opacitytransform để giữ ảnh động trên giai đoạn kết hợp của đường dẫn kết xuất. Sử dụng Công cụ cho nhà phát triển để kiểm tra xem giai đoạn nào của đường dẫn đang bị ảnh động của bạn ảnh hưởng.

Sử dụng trình phân tích sơn để xem có thao tác sơn nào đặc biệt tốn kém hay không. Nếu bạn tìm thấy bất cứ điều gì, hãy kiểm tra xem một thuộc tính CSS khác có mang lại giao diện tương tự và mang lại hiệu suất tốt hơn hay không.

Hãy dùng thuộc tính will-change một cách hạn chế và chỉ khi bạn gặp vấn đề về hiệu suất.