HTMLタグは自分で作って使える
(maurycyz.com)- HTMLでは、認識されないタグ名を使っても、ブラウザはそれを一般的な要素として扱う
- CSSでそのタグ名をセレクタとして指定すれば、スタイル指定と表示制御が可能
- ハイフン(-)を含む名前を使えば、将来のHTML標準との衝突を防止できる
やの代わりに意味のあるカスタムタグを使うと、コードの可読性が高まる- 複雑なネスト構造でも、タグ名だけで構造を把握しやすく、保守しやすい
カスタムHTMLタグの活用
-
ブラウザは未知のタグを一般的なブロック要素のようにレンダリングする
- これはHTML標準で明記された正常な動作であり、CSSでスタイルを指定すれば見た目を制御できる
- 例として``のようなタグを定義し、CSSで
cool-thing { ... }の形で装飾できる
-
タグ名に**ハイフン(-)**を含めると、今後HTML標準に追加される可能性がなく、衝突リスクがない
- 例:
,など
- 例:
可読性と構造の改善
やの代わりに意味のある名前のタグを使うと、コードの理解がしやすくなる- たとえば
の代わりにを使える
- たとえば
- ネストした``構造では閉じタグの位置を把握しにくいが、明示的なタグ名を使えば構造が明確になる
の中を、``などで構成すると、DOM構造の把握が直感的になる
コード例
- 従来の方法
Hello, World! - カスタムタグ方式
Hello, World!- CSSで
cool-thing { display: block; font-weight: bold; text-align: center; ... }の形でスタイル指定が可能
- CSSで
結論
- HTML標準が許容する柔軟なタグ定義機能を活用すれば、 可読性の高い構造的なマークアップを書ける
- ただし、既存の意味あるタグが定義されている場合は、既存タグの使用を優先すべき
1件のコメント
Hacker Newsの意見
は認識されないタグではないことを強調している 自身の[ブログ記事](https://dashed-html.github.io)を紹介しつつ、は WHATWG が新要素として追加するまでは HTMLUnknownElement として扱われる一方、は **有効な HTMLElement** としてレイアウトやスタイリングに有用だと説明している JavaScript の Custom Elements API でアップグレードすると **定義済みカスタム要素** になる これはすべてのブラウザで標準の動作であり、W3C HTML Validator もダッシュを含むカスタム要素を HTMLElement として認識する ただしデフォルトの UA スタイルシートにある `[hidden]{display:none}` ルールは継承されないため、自分で指定する必要があるがデフォルトでdisplay:blockなのも UA スタイルシートのおかげなので、カスタム要素には自分でdisplayプロパティを設定する必要がある CSS の:definedと:not(:defined)セレクタにより、定義済み/未定義の要素を区別できる Declarative Shadow DOM(``)も同様に 未定義のカスタム要素 を生成するhiddenが HTML プレゼンテーション属性 だからだと反論している UA スタイルシートはカスタム要素にも同じように適用され、[hidden]ルールは存在しないhiddenはalign="right"のように、属性そのものがスタイルとして解釈される例だという-)の代わりに コロン(:) を使えていれば、XML 名前空間を自然に統合できただろうと惜しんでいる nginx や apache でコロンをハイフンに変換することもできただろうと述べている 「1999年に戻ることはできないが」と、回顧的な調子で締めくくっているサンプルコードの
の入れ子構造が過剰だと指摘している、、などの セマンティックタグ を使うほうが適切だと提案している3〜4年間カスタム要素を使ってきた経験を共有している アイデアは 巧妙だが実務では扱いにくい カスタムタグを多用しすぎると可読性が落ち、ブロック/インラインの区別もしにくくなる バランスの取れたアプローチとして、基本タグはそのまま使い、
やのような コンポーネント型要素 にだけカスタムタグを使う 下位コンポーネントは `` のように slot 属性 で区別する class は修正・カスタマイズ用途に限定し、構造は slot で表現する方式を好んでいる< !app-header />のような 自己終了カスタム要素 もコメントノードのトリックで実装したと付け加えているslot属性を基準に選択するならdiv[slot="hero-blurb"]のように書けばよいのかと質問している基本的にカスタムタグは `` のように動作する 必要であれば Custom Element API で動作を定義できる
というカスタムタグを作っての逆の役割を実装したと紹介している JS が無効化されている場合に特定の領域を隠せる プロジェクトリンクを共有している@media (scripting)機能を使えば 純粋な CSS だけでも同じ効果 を出せると提案している MDN ドキュメントへの参考リンクを添えている過去にブラウザから削除された `` タグを 自分で再現 した経験を共有している jQuery と visibility 操作で実装し、ブラウザが任意のタグを許容する事実に驚いたという コードは 10行程度しかないので公開はしていないが、似た試みは多いだろうと推測している
.blinkの代わりにblinkセレクタを使えばタグに直接適用できるという、などの例は実際の HTML タグで置き換えられると指摘している、、`` を使うほうが適切だというカスタムタグは基本的に `` のようにインラインでレンダリングされるが、CSS で デフォルトの display プロパティ を指定すればよい 以前は名前空間の問題で避けていたが、標準でハイフン(
-)が許可されたことで衝突の危険はなくなった CSS セレクタでも問題なく動作し、querySelectorからもアクセスできる Vue のようなフレームワークがなくても 現代の HTML だけで十分に表現可能 だと感じているすべてのカスタム要素にデフォルトスタイルを指定するには、次のようにすればよい
昔の IE は HTML5 タグを認識できなかったため、2010年ごろに自作スクリプトで対処したと振り返っている JS でタグを一度生成すれば IE が認識し、その後削除しても問題なかった この方法で 任意のタグもレンダリング可能 だと気づいたという 当時のブログ記事も共有している