Javascript có thể phát triển một số hiệu ứng hoạt hình không?

Đây là bài #13 của loạt bài chuyên khám phá JavaScript và các thành phần xây dựng của nó. Trong quá trình xác định và mô tả các yếu tố cốt lõi, chúng tôi cũng chia sẻ một số quy tắc chung mà chúng tôi sử dụng khi xây dựng SessionStack, một ứng dụng JavaScript cần phải mạnh mẽ và có hiệu suất cao để giúp người dùng xem và tái tạo các lỗi ứng dụng web của họ theo thời gian thực

Nếu bạn bỏ lỡ các chương trước, bạn có thể tìm thấy chúng ở đây

  • Tổng quan về công cụ, thời gian chạy và ngăn xếp cuộc gọi
  • Bên trong công cụ V8 của Google + 5 mẹo về cách viết mã được tối ưu hóa
  • Quản lý bộ nhớ + cách xử lý 4 lỗi rò rỉ bộ nhớ phổ biến
  • Vòng lặp sự kiện và sự phát triển của lập trình Async + 5 cách để mã hóa tốt hơn với async/await
  • Tìm hiểu sâu về WebSockets và HTTP/2 với SSE + cách chọn đúng đường dẫn
  • So sánh với WebAssugging + tại sao trong một số trường hợp nhất định, sử dụng nó tốt hơn JavaScript
  • Các khối xây dựng của Web Worker + 5 trường hợp bạn nên sử dụng chúng
  • Công nhân dịch vụ, vòng đời của họ và các trường hợp sử dụng
  • Cơ chế của Thông báo đẩy web
  • Theo dõi các thay đổi trong DOM bằng MutingObserver
  • Công cụ kết xuất và mẹo để tối ưu hóa hiệu suất của nó
  • Bên trong lớp mạng + Cách tối ưu hóa hiệu suất và bảo mật của nó
Tổng quan

Như bạn chắc chắn đã biết, hoạt ảnh đóng một vai trò thiết yếu trong việc tạo ra các ứng dụng web hấp dẫn. Khi người dùng ngày càng chuyển sự chú ý của họ sang UX và các doanh nghiệp bắt đầu nhận ra tầm quan trọng của hành trình người dùng thú vị, hoàn hảo, các ứng dụng web trở nên nặng hơn và có giao diện người dùng năng động hơn. Tất cả điều này yêu cầu hoạt ảnh phức tạp hơn để chuyển đổi trạng thái mượt mà hơn trong suốt hành trình của người dùng. Ngày nay, điều này thậm chí không được coi là một cái gì đó đặc biệt. Người dùng đang trở nên cao cấp hơn, theo mặc định mong đợi giao diện người dùng tương tác và phản hồi cao

Tuy nhiên, hoạt ảnh giao diện của bạn không nhất thiết phải đơn giản. Cái gì nên được làm hoạt hình và khi nào, và loại hoạt hình nào nên có, đều là những câu hỏi hóc búa

Hoạt hình JavaScript so với CSS

Hai cách chính để tạo hoạt ảnh trên web là sử dụng JavaScript và CSS. Không có lựa chọn đúng hay sai;

Sinh động với CSS

Tạo hoạt ảnh với CSS là cách đơn giản nhất để có thứ gì đó chuyển động trên màn hình

Chúng tôi sẽ bắt đầu với một ví dụ nhanh về cách di chuyển phần tử 50px theo cả hai trục X và Y. Nó được thực hiện bằng cách sử dụng quá trình chuyển đổi CSS được đặt thành 1000 mili giây

Khi lớp

transition: transform 500ms ease-in;
0 được thêm vào, giá trị
transition: transform 500ms ease-in;
1 được thay đổi và quá trình chuyển đổi bắt đầu

Bên cạnh thời lượng chuyển tiếp, còn có các tùy chọn để nới lỏng, về cơ bản là cảm giác của hoạt ảnh. Chúng tôi sẽ tiến hành nới lỏng chi tiết hơn ở phần sau của bài đăng này

Nếu, như trong đoạn mã trên, bạn tạo các lớp CSS riêng biệt để quản lý hoạt ảnh của mình, thì bạn có thể sử dụng JavaScript để bật và tắt từng hoạt ảnh

Nếu bạn có yếu tố sau

Sau đó, bạn có thể sử dụng JavaScript để bật và tắt từng hoạt ảnh

Đoạn mã trên lấy tất cả các phần tử có lớp

transition: transform 500ms ease-in;
2 và thêm lớp
transition: transform 500ms ease-in;
0 để kích hoạt hoạt ảnh

Làm điều này mang lại sự cân bằng tốt đẹp cho các ứng dụng của bạ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ử đích, để trình duyệt xử lý hoạt ảnh. Nếu bạn đi theo con đường này, bạn có thể nghe các sự kiện

transition: transform 500ms ease-in;
4 trên phần tử, nhưng chỉ khi bạn có thể từ bỏ hỗ trợ cho các phiên bản Internet Explorer cũ hơn

Lắng nghe sự kiện

transition: transform 500ms ease-in;
0 được kích hoạt khi kết thúc quá trình chuyển đổi, giống như thế này

Ngoài việc sử dụng chuyển tiếp CSS, bạn cũng có thể sử dụng hoạt ảnh CSS, cho phép bạn có nhiều quyền kiểm soát hơn đối với các khung hình chính hoạt ảnh riêng lẻ, thời lượng và số lần lặp lại

Các khung hình chính được sử dụng để hướng dẫn trình duyệt những giá trị mà các thuộc tính CSS cần phải có tại các điểm nhất định và nó sẽ lấp đầy các khoảng trống

Hãy xem một ví dụ

Đây là giao diện của nó (bản giới thiệu nhanh) — https. // ngăn xếp phiên. github. io/blog/bản trình diễn/khung hình chính/

Với hoạt ảnh CSS, bạn tự xác định hoạt ảnh độc lập với phần tử đích và sử dụng thuộc tính tên hoạt ảnh để chọn hoạt ảnh cần thiết

Hoạt ảnh CSS vẫn có phần tiền tố của nhà cung cấp, với

transition: transform 500ms ease-in;
1 được sử dụng trong Safari, Safari Mobile và Android. Chrome, Opera, Internet Explorer và Firefox đều không có tiền tố. 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 các tệp nguồn của mình

Sinh động với JavaScript

Tạo hoạt ảnh bằng JavaScript phức tạp hơn so với sử dụng hiệu ứng chuyển tiếp hoặc hoạt ảnh CSS, nhưng nó thường cung cấp cho nhà phát triển nhiều sức mạnh hơn đáng kể

Hoạt hình JavaScript được viết nội tuyến như một phần mã của bạn. Bạn cũng có thể đóng gói chúng bên trong các đối tượng khác. Dưới đây là đoạn mã JavaScript mà bạn cần viết để tạo lại quá trình chuyển đổi CSS được mô tả trước đó

Theo mặc định, Web Animations chỉ sửa đổi cách trình bày của một phần tử. Nếu bạn muốn giữ nguyên đối tượng của mình ở vị trí mà đối tượng đã được di chuyển đến, thì bạn nên sửa đổi các kiểu bên dưới của đối tượng đó khi hoạt ảnh kết thúc. Đây là lý do tại sao chúng tôi lắng nghe sự kiện

transition: transform 500ms ease-in;
2 trong ví dụ trên và đặt thuộc tính
transition: transform 500ms ease-in;
3 bằng
transition: transform 500ms ease-in;
4, giống như phép biến đổi thứ hai được thực hiện bởi hoạt ảnh của chúng tôi

Với hoạt ảnh JavaScript, bạn có toàn quyền kiểm soát các kiểu của phần tử ở mọi bước. Điều này có nghĩa là bạn có thể làm chậm hoạt ảnh, tạm dừng, dừng, đảo ngược và thao tác các yếu tố khi bạn 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ể gói gọn hành vi của mình một cách chính xác

Nới lỏng là gì?

Chuyển động tự nhiên giúp người dùng của bạn cảm thấy thoải mái hơn với các ứng dụng web của bạn, dẫn đến trải nghiệm người dùng tốt hơn

Đương nhiên, không có gì di chuyển tuyến tính từ điểm này sang điểm khác. Trên thực tế, mọi thứ có xu hướng tăng tốc hoặc giảm tốc khi chúng di chuyển trong thế giới vật chất xung quanh chúng ta vì chúng ta không ở trong chân không và có nhiều yếu tố khác nhau có xu hướng tác động đến điều này. Bộ não con người được kết nối để mong đợi loại chuyển động này, vì vậy khi tạo hoạt ảnh cho các ứng dụng web của mình, bạn nên sử dụng kiến ​​thức này để làm lợi thế cho mình

Có thuật ngữ mà bạn cần phải hiểu

  • "dễ dàng" - đây là khi một chuyển động bắt đầu chậm và sau đó tăng tốc
  • “dễ dàng thoát ra” - đây là khi một chuyển động bắt đầu nhanh và sau đó giảm tốc

Hai cái này có thể kết hợp với nhau, ví dụ “dễ dàng ra vào”

Tính năng nới lỏng cho phép bạn tạo hoạt ảnh tự nhiên hơn

Giảm từ khóa

Các hiệu ứng chuyển tiếp và hoạt ảnh CSS cho phép bạn chọn loại nới lỏng mà bạn muốn sử dụng. Có các từ khóa khác nhau ảnh hưởng đến việc nới lỏng hoạt ảnh. Bạn cũng có thể làm cho việc nới lỏng của mình hoàn toàn tùy chỉnh

Dưới đây là một số từ khóa mà bạn có thể sử dụng trong CSS để kiểm soát việc nới lỏng

  • transition: transform 500ms ease-in;
    5
  • transition: transform 500ms ease-in;
    6
  • transition: transform 500ms ease-in;
    7
  • transition: transform 500ms ease-in;
    8

Hãy xem qua tất cả chúng và xem chúng thực sự có ý nghĩa gì

hoạt hình tuyến tính

Hoạt hình mà không có bất kỳ loại nới lỏng nào được gọi là tuyến tính

Đây là cách biểu đồ của quá trình chuyển đổi tuyến tính trông như thế nào

Thời gian trôi qua, giá trị tăng lên với số lượng bằng nhau. Với chuyển động tuyến tính, mọi thứ có xu hướng không tự nhiên. Nói chung, bạn nên tránh chuyển động tuyến tính

Đây là cách có thể đạt được hoạt hình tuyến tính đơn giản

transition: transform 500ms ease-in;
9

Hoạt hình dễ dàng

Như đã đề cập trước đó, nới lỏng khiến hoạt ảnh bắt đầu nhanh hơn so với hoạt ảnh tuyến tính, trong khi hoạt ảnh chậm lại ở cuối. Đây là cách biểu đồ của nó trông giống như

Nói chung, nới lỏng được sử dụng tốt nhất cho công việc giao diện người dùng vì bắt đầu nhanh mang lại cho hoạt ảnh của bạn cảm giác phản hồi nhanh, trong khi giảm tốc độ ở cuối tạo cảm giác tự nhiên do chuyển động không nhất quán

Có nhiều cách để đạt được hiệu ứng giảm bớt, nhưng cách đơn giản nhất là từ khóa

transition: transform 500ms ease-in;
7 trong CSS

transition: transform 500ms ease-in;
1

Hoạt hình dễ sử dụng

Những hoạt ảnh này trái ngược với hoạt ảnh dễ hiểu — chúng bắt đầu chậm và kết thúc nhanh. Đây là cách biểu đồ của họ trông giống như

So với hoạt ảnh mở rộng, chuyển động mở rộng có thể cảm thấy khác thường vì chúng tạo ra cảm giác không phản hồi vì chúng bắt đầu chậm. Kết thúc nhanh cũng có thể tạo ra cảm giác kỳ lạ, vì toàn bộ hoạt ảnh đang tăng tốc trong khi các vật thể trong thế giới thực có xu hướng giảm tốc khi dừng đột ngột

Để sử dụng hoạt hình dễ vào, tương tự như hoạt hình dễ ra và hoạt hình tuyến tính, bạn có thể sử dụng từ khóa của nó

transition: transform 500ms ease-in;

Hình ảnh động dễ dàng vào ra

Hoạt hình này là sự kết hợp giữa dễ vào và dễ ra. Đây là cách biểu đồ của nó trông giống như

Không sử dụng thời lượng hoạt ảnh quá dài vì chúng tạo cảm giác như thể giao diện người dùng của bạn không phản hồi

Để có được một hình ảnh động dễ hiểu, bạn có thể sử dụng từ khóa CSS

transition: transform 500ms ease-in;
8

transition: transform 500ms ease-in;
4

Nới lỏng tùy chỉnh

Bạn có thể xác định các đường cong nới lỏng của riêng mình, điều này mang lại nhiều quyền kiểm soát hơn đối với cảm giác mà hoạt ảnh của dự án của bạn tạo ra

Trên thực tế, các từ khóa

transition: transform 500ms ease-in;
6,
transition: transform 500ms ease-in;
7,
transition: transform 500ms ease-in;
5,
transition: transform 500ms ease-in;
45 ánh xạ tới các đường cong Bézier được xác định trước, được trình bày chi tiết trong đặc tả chuyển tiếp CSS và đặc tả Hoạt hình web

đường cong bézier

Hãy xem đường cong Bézier hoạt động như thế nào. Một đường cong Bézier nhận bốn giá trị, hay chính xác hơn là nhận hai cặp số. Mỗi cặp mô tả tọa độ X và Y của điểm kiểm soát của đường cong Bézier bậc ba. Điểm đầu của đường cong Bézier có toạ độ (0, 0) và toạ độ cuối là (1, 1). Bạn có thể đặt cả hai số cặp. Giá trị X cho hai điểm kiểm soát phải nằm trong phạm vi [0, 1] và giá trị Y của mỗi điểm kiểm soát có thể vượt quá giới hạn [0, 1], mặc dù thông số kỹ thuật không rõ ràng là bao nhiêu

Ngay cả những thay đổi nhỏ trong giá trị X và Y của từng điểm kiểm soát cũng mang lại cho bạn một đường cong hoàn toàn khác. Hãy xem xét hai đồ thị của đường cong Bézier với các điểm có tọa độ gần nhau nhưng khác nhau

Như bạn thấy, các biểu đồ khá khác nhau. Điểm kiểm soát đầu tiên có
(0. 045, 0. 183) chênh lệch vectơ, trong khi các điểm kiểm soát thứ hai có (-0. 427, -0. 054) sự khác biệt.

Đây là cách CSS cho đường cong thứ hai trông như thế nào

transition: transform 500ms ease-in;
9

Hai số đầu tiên là tọa độ X và Y của điểm kiểm soát đầu tiên và hai số thứ hai là tọa độ X và Y của điểm kiểm soát thứ hai

tối ưu hóa hiệu suất

Bạn nên duy trì tốc độ 60 khung hình/giây bất cứ khi nào bạn tạo hoạt ảnh, nếu không nó sẽ tác động tiêu cực đến trải nghiệm người dùng của bạn

Như mọi thứ khác trên thế giới, hoạt ảnh không miễn phí. Hoạt ảnh một số thuộc tính rẻ hơn những thuộc tính khác. Ví dụ: hoạt ảnh

transition: transform 500ms ease-in;
46 và
transition: transform 500ms ease-in;
47 của một phần tử sẽ thay đổi hình học của nó và có thể khiến các phần tử khác trên trang di chuyển hoặc thay đổi kích thước. Quá trình này được gọi là bố trí. Chúng tôi đã thảo luận về bố cục và kết xuất chi tiết hơn trong một trong các bài viết trước của chúng tôi

Nói chung, bạn nên tránh các thuộc tính hoạt ảnh kích hoạt bố cục hoặc vẽ. Đối với hầu hết các trình duyệt hiện đại, điều này có nghĩa là giới hạn hoạt ảnh ở mức

transition: transform 500ms ease-in;
48 và
transition: transform 500ms ease-in;
49

Sẽ thay đổi

Bạn có thể sử dụng

transition: transform 500ms ease-in;
90 để thông báo cho trình duyệt rằng bạn định thay đổi thuộc tính của phần tử. Điều này cho phép trình duyệt đưa ra các tối ưu hóa phù hợp nhất trước khi bạn thực hiện thay đổi. Tuy nhiên, đừng lạm dụng
transition: transform 500ms ease-in;
91 vì làm như vậy có thể khiến trình duyệt lãng phí tài nguyên, từ đó gây ra nhiều vấn đề về hiệu suất hơn

Thêm

transition: transform 500ms ease-in;
91 cho các biến đổi và độ mờ trông như thế này

transition: transform 500ms ease-in;
7

Trình duyệt hỗ trợ Chrome, Firefox và Opera khá tốt

Lựa chọn giữa JavaScript và CSS

Bạn có thể đã thấy nó sắp xảy ra — không có câu trả lời đúng hay sai cho câu hỏi này. Bạn chỉ cần ghi nhớ những điều sau

  • Hoạt ảnh dựa trên CSS và Hoạt ảnh web được hỗ trợ nguyên bản, thường được xử lý trên một luồng được gọi là “luồng tổng hợp. ” Nó khác với “luồng chính” của trình duyệt, nơi thực thi kiểu dáng, bố cục, vẽ và JavaScript. Điều này có nghĩa là nếu trình duyệt đang chạy một số tác vụ tốn kém trên luồng chính, thì các hoạt ảnh này có thể tiếp tục mà không bị gián đoạn
  • Trong nhiều trường hợp, các thay đổi đối với
    transition: transform 500ms ease-in;
    93 và
    transition: transform 500ms ease-in;
    48 cũng có thể được xử lý bởi chuỗi tổng hợp
  • Nếu bất kỳ hoạt ảnh nào kích hoạt vẽ, bố cục hoặc cả hai, thì "luồng chính" sẽ được yêu cầu thực hiện công việc. Điều này đúng với cả hoạt ảnh dựa trên CSS và JavaScript và chi phí bố cục hoặc màu sơn có thể sẽ làm giảm bất kỳ công việc nào liên quan đến thực thi CSS hoặc JavaScript, khiến câu hỏi trở nên tranh luận

Chọn những thứ phù hợp để tạo hiệu ứng

Hoạt hình tuyệt vời thêm một lớp thích thú và tương tác vào các dự án của bạn cho người dùng của bạn. Bạn có thể tạo hoạt ảnh cho bất kỳ thứ gì bạn thích, cho dù đó là chiều rộng, chiều cao, vị trí, màu sắc hay hình nền, nhưng bạn cần lưu ý về các tắc nghẽn hiệu suất tiềm ẩn. Hoạt ảnh được chọn kém có thể ảnh hưởng tiêu cực đến trải nghiệm người dùng, vì vậy hoạt ảnh cần phải hiệu quả và phù hợp. Animate càng ít càng tốt. Hoạt hình chỉ để làm cho UX của bạn cảm thấy tự nhiên nhưng không hoạt hình quá mức

Sử dụng hình ảnh động để hỗ trợ tương tác

Đừng chỉ làm sinh động một cái gì đó bởi vì bạn có thể. Thay vào đó, hãy sử dụng các hoạt ảnh được đặt một cách chiến lược để củng cố tương tác của người dùng. Tránh hoạt ảnh làm gián đoạn hoặc cản trở hoạt động của người dùng một cách không cần thiết

Tránh hoạt ảnh các thuộc tính đắt tiền

Điều duy nhất tồi tệ hơn các hoạt ảnh được đặt ở vị trí kém là những hoạt ảnh khiến trang bị giật hình. Loại hoạt ảnh này khiến người dùng cảm thấy thất vọng và không hài lòng

Chúng tôi sử dụng hoạt ảnh trong SessionStack khá dễ dàng. Nói chung, chúng tôi tuân theo các phương pháp được đề cập ở trên nhưng chúng tôi cũng có một vài tình huống khác mà chúng tôi sử dụng hoạt ảnh do sự phức tạp của giao diện người dùng của chúng tôi. SessionStack phải tạo lại dưới dạng video mọi thứ đã xảy ra với người dùng cuối tại thời điểm họ gặp sự cố khi duyệt ứng dụng web. Để làm điều này, SessionStack chỉ tận dụng dữ liệu được thư viện của chúng tôi thu thập trong phiên. sự kiện người dùng, thay đổi DOM, yêu cầu mạng, ngoại lệ, thông báo gỡ lỗi, v.v. Trình phát của chúng tôi được tối ưu hóa cao để hiển thị chính xác và sử dụng tất cả dữ liệu đã thu thập nhằm cung cấp mô phỏng hoàn hảo đến từng pixel về trình duyệt của người dùng cuối và mọi thứ diễn ra trong đó, cả về mặt hình ảnh và kỹ thuật

Để đảm bảo quá trình sao chép diễn ra tự nhiên, đặc biệt là với các phiên người dùng dài và nhiều, chúng tôi sử dụng hoạt ảnh để biểu thị chính xác quá trình tải/đệm và tuân theo các phương pháp hay nhất về cách triển khai chúng để chúng tôi không chiếm quá nhiều thời gian của CPU và rời khỏi vòng lặp sự kiện

Bạn có thể sử dụng JavaScript cho hoạt ảnh không?

Hoạt ảnh JavaScript được thực hiện bằng cách lập trình các thay đổi dần dần trong kiểu của phần tử . Các thay đổi được gọi bởi một bộ đếm thời gian. Khi khoảng thời gian hẹn giờ nhỏ, hoạt ảnh trông liên tục.

Tôi có nên sử dụng CSS hoặc JavaScript cho hoạt ảnh không?

Sử dụng hoạt ảnh CSS để chuyển tiếp đơn giản hơn, chẳng hạn như chuyển tiếp một lần . Ví dụ: chúng ta có thể nói như chuyển đổi trạng thái phần tử giao diện người dùng. Sử dụng hoạt ảnh JavaScript khi bạn muốn có các hiệu ứng nâng cao như nảy, dừng, tạm dừng, tua lại, làm chậm hoặc nếu bạn cần kiểm soát thời gian và nội dung để tạo hoạt ảnh.

Làm cách nào để áp dụng hoạt ảnh trong JavaScript?

Để có thể tạo hoạt ảnh, phần tử hoạt ảnh phải được tạo hoạt ảnh tương ứng với "vùng chứa chính" . Phần tử vùng chứa phải được tạo với style="position. liên quan đến". Phần tử hoạt hình nên được tạo với style="position. tuyệt đối".

Khung nào là tốt nhất cho hoạt ảnh?

Thư viện hoạt ảnh miễn phí tốt nhất dành cho nhà thiết kế .
AnimeJS
quảng cáo
mo. js
Nền tảng hoạt hình Greenstock (GSAP)
vận tốc. js
csshake
Bay lượn. css
hoạt hình ma thuật