- Giới thiệu các cách mới nhất để thay thế những chức năng phụ thuộc JS trên web bằng HTML/CSS
- Tận dụng các phần tử chuẩn như
details·summary, datalist, popover để triển khai accordion, tự động hoàn thành, modal và điều hướng off-screen
- Cách tiếp cận này giúp giảm tải xuống, đánh giá và mức dùng bộ nhớ, từ đó cải thiện hiệu năng và trải nghiệm người dùng
- Với từng chức năng đều có kèm ví dụ CodePen, tài liệu MDN và thông tin tương thích trình duyệt
- Chỉ dùng JS ở những phần thật sự cần thiết và tích cực tận dụng các khả năng đã phát triển của HTML/CSS
Thay thế chức năng JS bằng HTML và CSS
- Trong thời gian dài, JavaScript đã đảm nhiệm những chức năng mà HTML và CSS không thể triển khai
- Tuy nhiên, khi khả năng của HTML và CSS ngày càng mở rộng, một số chức năng của JS nay có thể được thay thế bằng công nghệ web native
- Vì JS cần được tải xuống, giải nén, đánh giá và duy trì trong bộ nhớ, nên việc chuyển những chức năng có thể làm được sang HTML/CSS là hiệu quả hơn
- Bài viết đưa ra định hướng: để JS tập trung vào logic phức tạp, còn phần điều khiển UI đơn giản thì giao cho HTML/CSS
Accordion / bảng nội dung mở rộng
- Có thể triển khai accordion mà không cần JS bằng các phần tử
details và summary
- Có thể nhấp để mở và đóng nội dung, đồng thời dùng thuộc tính
open để đặt trạng thái mặc định
- Khi dùng cùng một thuộc tính
name, chỉ một bảng được mở
- Cũng có thể tạo kiểu bằng CSS hoặc điều khiển trạng thái mở/đóng bằng JS
- Tài liệu liên quan: tài liệu MDN về
details, ví dụ CodePen, bảng tương thích trình duyệt
Ô nhập gợi ý tự động hoàn thành
- Kết hợp
input và datalist để triển khai dropdown tự động lọc
- Khi nhập, danh sách gợi ý sẽ tự động được lọc
- Hỗ trợ nhiều kiểu nhập khác nhau ngoài văn bản như
number, time
- Firefox hiện chỉ hỗ trợ các kiểu nhập dựa trên văn bản, và có hạn chế về khả năng truy cập trên di động
- Tài liệu liên quan: tài liệu MDN về
datalist, hướng dẫn SitePoint, bảng tương thích trình duyệt
Modal / popover
- Có thể triển khai modal và popover không cần JS bằng thuộc tính
popover và popovertarget
- Cung cấp ba chế độ:
auto, hint, manual
auto sẽ đóng khi nhấp bên ngoài hoặc nhấn ESC, còn manual chỉ đóng khi thao tác thủ công
- Firefox và iOS không hỗ trợ chế độ
hint
- Tài liệu liên quan: tài liệu MDN về
popover, blog Chrome, ví dụ CodePen, video về accessibility
Điều hướng / nội dung off-screen
- Có thể tận dụng tính năng
popover để triển khai menu điều hướng off-screen
- Dùng phần tử
nav để mang ý nghĩa ngữ nghĩa, và dùng CSS translate để di chuyển vào/ra màn hình
- Sẽ đóng khi nhấp bên ngoài, và có thể đặt đóng thủ công bằng
popover="manual"
- Có thể dùng pseudo-element
::backdrop để làm nền bán trong suốt
- Tài liệu liên quan: MDN Popover API, blog Chrome, ví dụ CodePen
Kết luận
- Thừa nhận sức mạnh của JS, nhưng chỉ nên dùng ở nơi cần thiết
- Với sự phát triển gần đây của HTML/CSS, nhiều lựa chọn thay thế không cần JS đã xuất hiện
- Có thể xem thêm ví dụ trong bài blog của tác giả “Replace JS with No-JS or Lo-JS Options”
- Nhấn mạnh việc giảm thiểu JS và tối ưu hiệu năng để cải thiện trải nghiệm người dùng
5 bình luận
Những thử nghiệm kiểu này đôi khi giúp tôi tự nhìn lại xem mình có đang over-engineering hay không, nhưng từ góc nhìn công việc thực tế với nhiều yêu cầu phong phú thì nó gần như chỉ là một màn biểu diễn kỹ năng.
Có vẻ như nội dung đã bị cắt mất rồi
Đã chỉnh sửa rồi~!
Rõ ràng là có những giới hạn, và một khi AI được kích hoạt.. liệu có cần phải làm kiểu refactoring này không? Bạn đã cân nhắc những phần như chặn nội dung JS chưa?
Ý kiến trên Hacker News
Nếu thay vì chỉ đặt link CodePen mà chèn trực tiếp các ví dụ thay thế HTML ngay trên trang thì có lẽ bài viết đã thuyết phục hơn nhiều
<details>/<summary>thực sự rất lớnCó thể làm được gần như mọi thứ, nhưng đa số thư viện component lại bỏ qua nó
Không cần cả thuộc tính aria và khả năng truy cập cũng có sẵn mặc định
<details>còn hoạt động trên các trang dùng Markdown như GitHub. Có thể gấp các log dài lại để đăng cho gọn gàngKhi viết cuốn “You Don’t Need JavaScript”, điều tôi nhận ra là JS trong nhiều trường hợp chỉ đang bổ trợ các khả năng sẵn có của nền tảng hơn là thêm tính năng hoàn toàn mới
<input>và<datalist>thì chưa đủ để dùng thực tếNgười dùng kỳ vọng những thứ như chấp nhận lỗi gõ, văn bản phụ trợ, UX di động, nhưng datalist lại không đáp ứng được
Hầu như không ai quan tâm đến việc dùng HTML đúng ngữ nghĩa hay khả năng truy cập
Bài viết nói về “làm bằng HTML thôi” mà lại phụ thuộc vào dịch vụ bên ngoài thì nghe hơi mâu thuẫn
Nó đang ở WHATWG stage 3 và có vẻ có thể thay thế phần triển khai dropdown bằng JS vốn ác mộng bấy lâu nay
Tham khảo bài viết trên blog Chrome
Tôi cũng đã thử các lựa chọn như HTMX hay Phoenix LiveView, nhưng chúng không phải lời giải hoàn chỉnh
Cuối cùng tôi thấy chấp nhận JS hiện đại là thực tế hơn
<marquee>từng rất hợp để làm cuộn ngang trong các trang mua sắm, còn giờ người ta phải gò ép làm bằng JS. Tôi mong HTML tự hỗ trợ nhiều mẫu UI hơnWeb app phức tạp thì JS là bắt buộc, nhưng vẫn có rất nhiều phần có thể làm chỉ với HTML
Nhưng giờ JS đã trở thành công cụ cốt lõi cho thu thập dữ liệu và theo dõi quảng cáo
Tôi khá tò mò liệu không có JS thì Big Tech còn có thể triển khai mức độ giám sát và dịch vụ quảng cáo tương tự hay không
Suy cho cùng, sự ác cảm với JS không chỉ là vấn đề kỹ thuật mà còn xuất phát từ sự mất niềm tin vào hệ sinh thái quảng cáo