Có thể tự tạo và sử dụng trực tiếp thẻ HTML
(maurycyz.com)- Trong HTML, ngay cả khi dùng tên thẻ không được nhận diện, trình duyệt vẫn xử lý nó như một phần tử thông thường
- Nếu chỉ định tên thẻ đó làm selector trong CSS, có thể định kiểu và kiểm soát cách hiển thị
- Nếu dùng tên có chứa dấu gạch nối (-), có thể tránh xung đột với tiêu chuẩn HTML trong tương lai
- Thay vì
hay, dùng thẻ tùy chỉnh có ý nghĩa sẽ giúp mã dễ đọc hơn - Ngay cả trong cấu trúc lồng nhau phức tạp, cũng dễ nắm bắt cấu trúc chỉ qua tên thẻ, giúp việc bảo trì thuận tiện hơn
Cách tận dụng thẻ HTML tùy chỉnh
-
Trình duyệt sẽ render thẻ không biết như một phần tử khối thông thường
- Đây là hành vi bình thường được nêu trong tiêu chuẩn HTML, và nếu định kiểu bằng CSS thì có thể kiểm soát về mặt hiển thị
- Ví dụ có thể định nghĩa thẻ như `` và trang trí trong CSS theo dạng
cool-thing { ... }
-
Nếu tên thẻ có chứa dấu gạch nối (-), sẽ không có nguy cơ xung đột với những phần bổ sung vào tiêu chuẩn HTML sau này
- Ví dụ:
,
- Ví dụ:
Cải thiện khả năng đọc và cấu trúc
- Thay vì
hay, nếu dùng thẻ có tên mang ý nghĩa, việc hiểu mã sẽ trở nên dễ hơn- Ví dụ, có thể dùng
thay cho
- Ví dụ, có thể dùng
- Trong cấu trúc `` lồng nhau, thường khó xác định vị trí thẻ đóng, nhưng nếu dùng tên thẻ tường minh thì cấu trúc sẽ rõ ràng hơn
- Nếu bên trong
được tổ chức bằng, `` v.v. thì việc nắm bắt cấu trúc DOM sẽ trực quan hơn
- Nếu bên trong
Mã ví dụ
- Cách cũ
Hello, World! - Cách dùng thẻ tùy chỉnh
Hello, World!- Trong CSS có thể định kiểu theo dạng
cool-thing { display: block; font-weight: bold; text-align: center; ... }
- Trong CSS có thể định kiểu theo dạng
Kết luận
- Nếu tận dụng khả năng định nghĩa thẻ linh hoạt mà tiêu chuẩn HTML cho phép, có thể viết markup có cấu trúc và dễ đọc hơn
- Tuy nhiên, nếu đã có thẻ mang ý nghĩa được định nghĩa sẵn, thì ưu tiên dùng thẻ hiện có
1 bình luận
Ý kiến trên Hacker News
Nhấn mạnh rằng
không phải là thẻ không được nhận diện Giới thiệu [bài viết blog](https://dashed-html.github.io) của mình, tác giả giải thích rằngsẽ được xử lý như HTMLUnknownElement cho đến khi WHATWG thêm nó thành phần tử mới, cònlà một **HTMLElement hợp lệ**, hữu ích cho layout và styling Khi được nâng cấp bằng JavaScript Custom Elements API, nó sẽ trở thành **custom element đã được định nghĩa** Đây là hành vi tiêu chuẩn trên mọi trình duyệt, và W3C HTML Validator cũng công nhận custom element có dấu gạch nối là HTMLElement Tuy nhiên, quy tắc `[hidden]{display:none}` trong stylesheet UA mặc định không được kế thừa, nên cần tự chỉ định Vìmặc định làdisplay:blockcũng là nhờ stylesheet UA, nên với custom element phải tự đặt thuộc tínhdisplayCó thể phân biệt phần tử đã/ chưa được định nghĩa thông qua các selector:definedvà:not(:defined)của CSS Declarative Shadow DOM (``) cũng tương tự, tạo ra custom element chưa được định nghĩahiddenlà HTML presentation attribute Stylesheet UA vẫn được áp dụng giống nhau cho custom element, và không hề có quy tắc[hidden]hiddenlà ví dụ mà chính thuộc tính được diễn giải thành style, giống nhưalign="right"-) thì đã có thể tích hợp XML namespace một cách tự nhiên Cũng nhắc rằng nginx hay apache có thể chuyển dấu hai chấm thành dấu gạch nối Kết lại bằng giọng hoài niệm rằng “không thể quay lại năm 1999”Chỉ ra rằng cấu trúc lồng
trong ví dụ là quá mức Đề xuất dùng **các thẻ ngữ nghĩa** như,,sẽ phù hợp hơnChia sẻ kinh nghiệm đã dùng custom element trong 3~4 năm Ý tưởng thì thông minh nhưng triển khai thực tế khá khó chịu Dùng quá nhiều custom tag sẽ làm giảm khả năng đọc và khó phân biệt block/inline Theo hướng tiếp cận cân bằng, vẫn giữ nguyên các thẻ cơ bản, chỉ dùng custom tag cho các phần tử dạng component như
hayCác thành phần con được phân biệt bằng thuộc tính slot như `` Tác giả thích cách chỉ giới hạn class cho mục đích sửa đổi/tùy biến, còn cấu trúc thì biểu đạt bằng slot< !app-header />được triển khai bằng mẹo với comment nodeslottrong CSS thì có thể viết nhưdiv[slot="hero-blurb"]hay khôngVề cơ bản, custom tag hoạt động như `` Nếu cần, có thể định nghĩa hành vi thông qua Custom Element API
Giới thiệu việc đã tạo custom tag
để làm vai trò ngược lại vớiCó thể ẩn một vùng nhất định khi JS bị vô hiệu hóa Chia sẻ liên kết dự án@media (scripting)của CSS để đạt hiệu ứng tương tự chỉ với CSS thuần Đính kèm tài liệu MDNChia sẻ trải nghiệm từng tự tái tạo thẻ `` đã bị loại bỏ khỏi trình duyệt Được triển khai bằng jQuery và thao tác visibility, và họ nói mình đã ngạc nhiên khi biết trình duyệt cho phép thẻ tùy ý Vì đoạn code chỉ khoảng 10 dòng nên không công khai, nhưng đoán là đã có nhiều thử nghiệm tương tự
blinkthay vì.blinkthì sẽ áp dụng trực tiếp cho thẻChỉ ra rằng các ví dụ như
,có thể được thay bằng thẻ HTML thật Dùng,, `` sẽ phù hợp hơnCustom tag về cơ bản được render inline như ``, nhưng chỉ cần đặt thuộc tính display mặc định bằng CSS là được Trước đây người ta tránh dùng vì vấn đề namespace, nhưng sau khi tiêu chuẩn cho phép dấu gạch nối (
-) thì nguy cơ xung đột đã biến mất Chúng cũng hoạt động bình thường trong CSS selector, và có thể truy cập bằngquerySelectorCó cảm giác rằng ngay cả không cần framework như Vue thì HTML hiện đại thôi cũng đã đủ sức biểu đạtNếu muốn đặt style mặc định cho mọi custom element thì có thể làm như sau
Nhớ lại rằng IE ngày xưa không nhận ra các thẻ HTML5, nên khoảng năm 2010 họ đã tự giải quyết bằng một script do mình viết Chỉ cần tạo thẻ một lần bằng JS là IE sẽ nhận diện, và sau đó xóa đi cũng không sao Qua cách này họ nhận ra rằng cả các thẻ tùy ý cũng có thể render được Cũng chia sẻ bài blog khi đó