Trang Chủ

Không cần đến CSS, Web Animation API còn làm web sống động hơn nữa

Một chìa (API) đút mọi lỗ

Animation trên web từ lâu đã được chia thành 4 lĩnh vực cụ thể:

Web Animations API lại có hoài bão to lớn hơn: kết hợp các tính năng tốt nhất của tất cả các kiểu công cụ trên thành một chỉnh thể duy nhất, đồng thời loại bỏ hết mọi thiếu sót, tạo sự thấu hiểu thấu đáo về keyframes, easing, và element control trong JavaScript, với cùng hiệu năng on-screen như CSS. Với các specifications giờ đây đã được hỗ trợ trong Chrome và Firefox, cùng với các nghiên cứu đã được công bố và đã thực hiện với các trình duyệt khác, gồm có SafariEdge. Cùng với robust polyfil khả dụng. Với những ưu việt như vậy, đã đến lúc ta dành sự chú ý xứng đáng cho Web Animations API.

Keyframes trong JavaScript

Hãy xét đến một trong những ví dụ đơn giản nhất về keyframe animation: duy chuyển một element red ball (banh đỏ) từ phía này sang phía kia page. Cho dù ta có dùng kỹ thuật nào đi nữa, element sẽ giữ nguyên như cũ:

CSS ban đầu cũng vậy:

Tôi đã dùng đến đơn vị vmin để element luôn đối xứng , đồng thời phản hồi với kích thước của view point.

Trong CSS, để di chuyển banh từ bên này sang bến khác page, ta sẽ cần:

Animation sẽ được call sau khi khai báo red ball element:

Kết quả minh họa trên codepen:

See the Pen Basic CSS Red Ball Animation by SitePoint (@SitePoint) on CodePen.

Đến đây, có một số điều cần ghi nhớ về animation, trong đó, easing (tăng tốc lúc ban đầu và chậm lại khi về cuối) được built in tự động.

Về Web Animations API

Giữ nguyên HTML và style ban đầu, hãy xóa bỏ CSS animation và thay thế JavaScript (sử dụng Web Animation API) để đạt mục đích tương tự:

Bạn có thể thấy rằng animation tiếp nhận cú pháp đa phần giống với CSS, nhưng lại biểu hiện dưới dạng object với một array thể hiện keyframes. Chúng ta không phải khai báo rõ ràng to hay from trong keyframe – JavaScript sẽ tự động phân phối đều keyframe cho chúng ta, thậm chí declaration (khai báo) cũng hoàn toàn có thể.

Animation vẫn chưa chạy; giống như trong CSS, chúng ta phải call ra:

Phần keyframe của cú pháp thậm chí sẽ trở nên dễ dàng hơn nữa với các trình duyệt tương lai, khi các khía cạnh của cú pháp chuyển đổi CSS (mà trước đó là values) có thể dùng được làm properties:

Thay đổi đến specification này đã có sẵn trong Chrome Canary, nhưng phải đến một hai nắm thì may ra cú pháp mới mới được tất cả trình duyệt hiện đại hỗ trợ.

Một số điều nên lưu ý về script:

Kết quả có chức năng tương tự với CSS animation.

See the Pen Basic Red Ball Anim in Web Animation API by SitePoint (@SitePoint) on CodePen.

Tất nhiên, sao chép CSS animation như thế này trong JavaScript không thực sự tận dụng hết mức sự linh hoạt của ngôn ngữ scripting này; để minh họa rõ hơn, chúng ta sẽ tạo một animation hoàn chỉnh hơn nữa.

Dealing Images

Không lâu trước đây tôi từng nghiên cứu làm một cái animation “tán” một loạt hình ảnh lên trang web, giống như búng bài đang chơi lên bàn vậy. Viết từng animation một cho mỗi card trong CSS truyền thống sẽ mất rất nhiều thời gian, và hầu như đều mang lại cùng một hiệu ứng. Thay vào đó, tôi dùng Web Animation API, đây là công cụ hoàn hảo cho yêu cầu lần này.

Progressive Cards

Chúng ta muốn hình ảnh được hiển thị dù JavaScript hay Web Animations API có hiệu lực hay không. Vậy, chúng ta sẽ bắt đầu bằng cách thêm một loạt hình ảnh vào page:

Chúng ta để trống giá trị alt của hình ảnh để giữ code cho sạch sẽ; trong phiên bản production, chúng sẽ được điền description. Những bức ảnh này được chụp bở .tafo., được sử dụng theo Creative Commons Attribution-NoDerivs 2.0 Generic license.

Chúng ta có thể thêm một chút CSS để hiển thị hình ảnh với animation nếu điều kiện no-JavaScript vẫn đúng:

Thời gian xuất hiện của từng hình ảnh có thể được delay với:

Thông thường, tan có thể tự động hóa những khai báo này với Sass hoặc một công cụ xử lý khác.

Hình ảnh sẽ có viền nếu element mẹ có class webanim, được áp dụng với JavaScript:

JavaScript

Chúng ta sẽ thêm script vào cuối page. Sẽ cần vài giá trị ngẫu nhiên trong animation, nên tôi sẽ tạo một hàm riêng cho mục đích này:

Sau đó, tôi sẽ thu thập image container và tất cả hình ảnh trong đó, đồng thời set một biến incrementor:

Sau đó, tôi sẽ loại bỏ class expose (hình ảnh không có animation và có opacity ở mức 0) vì CSS animation chỉ làm việc nếu container có một class expose:

Class webanim sẽ đặt hình ảnh vào khung.

Phần lớn scripts diễn ra ở vòng lặp forEach trong một hàm. Tôi sẽ call hàm một khi tất cả dữ liệu ảnh đã được tải (trái với node của ảnh chỉ đơn thuần xuất hiện trong DOM) bằng script imagesLoaded cực hay của David DeSandro:

Cũng như trên, trước hết chúng ta phải call hàm:

Kết quả:

See the Pen Random Stacked Images w/ WebAnim API & Progressive JS by SitePoint (@SitePoint) on CodePen.

Theo đó, hàm này:

Ta cần đến fill forward vì chúng ta muốn hình ảnh giữ nguyên trạng thái cuối cùng sau khi đã hoàn thành animation.

Tham gia cộng đồng lập trình Web lớn nhất Việt Nam: Vietnamwebsummit.com

Từ điểm mạnh này đến điểm mạnh khác

Web Animation API vẫn đang được phát triển nhanh chóng:

Kết luận

Như bạn thấy đấy, Web Animation API cho phép ta chuyển từ tính chất cụ thể, khai báo, từng bước một của CSS animation sang hướng linh hoạt, vô điều kiện của JavaScript, từ đó cho ra các animation expressive (sống động), random (ngẫu nhiên), và hiệu năng cao.

ITZone via sitepoint

 

Chia sẻ bài viết ngay