カスタム要素は有効なHTML5ですか?


181

次のように、カスタムタグがHTML5で有効かどうかについての明確な答えを見つけることができませんでした。

<greeting>Hello!</greeting>

いずれにしても、仕様には何も見つかりませんでした。

http://dev.w3.org/html5/spec/single-page.html

また、カスタムタグはW3Cバリデーターで検証されないようです。


2
4.5年以上前に作成されたHTML5記事にあまり多くのストックを入れたくない場合があります。
jessegavin 2012年

9
クロックフォードの記事は奇妙なものです。重要な文章は「これは優しくて穏やかなHTML 5に対する私の提案です」です。言い換えれば、これは私たちが今日知っているHTML5ではなく、HTML 4の後継としての別のHTML 5の提案です。奇妙なのは、W3Cがほぼ1年間HTML5に取り組んでいた2007年11月の日付だからです。 。ここでの「許可」という言葉の使い方は紛らわしい。カスタムタグが「準拠」/「有効」になったことはありませんが、ブラウザパーサーは引き続き存在します。とにかく、クロックフォードの提案はまったく牽引力を獲得しませんでした。かろうじてその一部はHTML5に組み込まれています。
アロヒ、2012年

3
カスタム要素は、Webコンポーネントカスタム要素の新しいW3標準がFirefoxとChromeに導入さ
hg

3
ダグラス・クロックフォードに関しては、彼の言うことすべてを信じたくなります。
wnrph 2013

1
カスタム要素のWebブラウザサポートテーブルcaniuse.com/#feat=custom-elements
Adrien Be

回答:


169

カスタム要素の仕様は、 ChromeとOperaで利用でき、中に利用可能になって他のブラウザ。カスタム要素を正式に登録する手段を提供します。

カスタム要素は、作成者が定義できる新しいタイプのDOM要素です。ステートレスで一時的なデコレータとは異なり、カスタム要素は状態をカプセル化し、スクリプトインターフェースを提供できます。

カスタム要素は、テンプレート、HTMLインポート、シャドウDOMとともに、Webコンポーネントと呼ばれるより大きなW3仕様の一部です。

Webコンポーネントの作成者は、Webコンポーネントを使用して、CSSだけでは不可能な視覚的な豊かさと対話性を備えたウィジェットを定義できます。また、今日のスクリプトライブラリでは、簡単に構成および再利用できません。

ただし、カスタム要素v1に関するGoogle Developersのこのウォークスルー記事から:

カスタム要素の名前にはダッシュ(-)を含める必要があります。そう<x-tags><my-element><my-awesome-app>しながら、すべての有効な名前であり、<tabs>かつ<foo_bar>ではありません。この要件は、HTMLパーサーがカスタム要素と通常の要素を区別できるようにするためです。また、新しいタグがHTMLに追加されたときの上位互換性も保証します。

いくつかのリソース


3
これは良い答え(+1)ですが、ルールはやや循環的です。「ユーザーは許可されていないことをしてはなりません...」
Alohci

8
@Alohci次の3語を引用に追加する必要があります:「この仕様による」。
jessegavin 2012年

1
仕様のその部分も読んだので、本当に混乱しました。その理由は次のとおりです。1)HTML5ではカスタム属性が許可されています。これは、Alochiの循環引数の観察を裏付けています。2)カスタム要素が許可されていないという仕様はどこにも記載されていません。
d13 2012年

この引用はせいぜい曖昧です。確かにW3Cはどちらかといえばより具体的なスタンスを持っていますか?
フラッシュ

2
customelements.ioへのそのリンクはもはや役に立ちません。更新/削除してもよろしいですか?
Nisarg 2017年

22

それは可能であり、許可されています:

ユーザーエージェントは、理解できない要素や属性を意味的に中立として扱う必要があります。それらをDOM(DOMプロセッサーの場合)に残し、CSS(CSSプロセッサーの場合)に従ってスタイリングしますが、それらから意味を推測しません。

http://www.w3.org/TR/html5/infrastructure.html#extensibility-0

ただし、インタラクティブ機能を追加する場合は、IEの7と8に対応するために、ドキュメントを無効にする(ただし、完全に機能させる)必要があります。

http://blog.svidgen.com/2012/10/building-custom-xhtml5-tags.html(私のブログ)を参照してください


そのセクション全体を読んでいないようです。これは主に属性に関するものであるだけでなく、そこでのカスタマイズも強く推奨していません。
Andrew Barber、

私の他のコメントを繰り返します、はい、それが私のブログであることを示すことを知らなかったのは残念です。私は多くが明白であると思いました。記事は直接関連しています。さらに付け加えますが、これは私が出してきた「申し立て」をバックアップするための参照としての役割を果たすものではなく、それを機能させる方法をより長い形式で示すためのものです。
svidgen 2012年

1
要点はこれだけです。仕様ではこれらのことを明示的に許可しています。そして、落胆する振る舞いのほとんどのコンテキストでは、仕様はHTMLの作者ではなくユーザーエージェントベンダーにかなり明確に語っています。
svidgen 2012年

3
上記で引用されたこのステートメントは、w3.org / TR / html5 / introduction.html#extensibilityの最新バージョンでは削除されているようです。これまでのところ、ハイフンなしのカスタムHTML要素の使用が有効かどうか、またはハイフン付きのカスタムHTML要素を検証するためにJSステートメントが必要かどうかに関するドキュメントはまだ見つかりません(html5rocks.com/en/tutorials/webcomponents/ customelements)。
John Slegers

@JohnSlegersええ、ドキュメントやアンカーの配置が少し変更されたようです。リンクを更新しました。私の回答の引用は、リンク先の拡張性セクションの下部にあります。
svidgen 2014

14

注:2012年に書かれたとき、以下の答えは正解でした。それ以来、状況は少し進みました。HTML仕様では、「自律型カスタム要素」と「カスタマイズされた組み込み要素」という2種類のカスタム要素が定義されています。前者は、フレージングコンテンツが期待されるところならどこにでも行くことができます。これはbody内のほとんどの場所ですが、たとえばulまたはol要素の子、またはtd、thまたはcaption要素以外のテーブル要素にはありません。後者は、拡張する要素がどこにでも移動できる場所ならどこでも実行できます。


これは実際には要素のコンテンツモデルの蓄積の結果です。

たとえば、ルート要素はhtmlます。

html要素は含まれていてもよいです本体要素続いヘッド素子。

body要素は含まれていてもよいですフローコンテンツフローコンテンツを要素として定義されます。 a、abbr、address、area(map要素の子孫である場合)、article、aside、audio、b、bdi、bdo、blockquote、br、button、canvas、cite、code、command、datalist、del、details 、dfn、div dl、em、embed、fieldset、figure、footer、form、h1、h2、h3、h4、h5、h6、header、hgroup、hr、i、iframe、img、input、ins、kbd、keygen、 label、map、mark、math、menu、meter、nav、noscript、object、ol、output、p、pre、progress、q、ruby、s、samp、script、section、select、small、span、strong、style(スコープ属性が存在する場合)、sub、sup、svg、table、textarea、time、u、ul、var、video、wbr、Text

等々。

コンテンツモデルでは、カスタム要素/タグに必要な「この要素に好きな要素を置くことができます」と言っていることはありません。


わかりましたので、カスタム要素が言及されていない場合、それらも許可されていないと想定できます。それは十分に公平に思えます。
d13 2012年

4
この回答は、新興W3 Webコンポーネントのカスタム要素の標準は現在、ブラウザの土地に始めて、今では無効です:dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/custom/...
csuwldcat

1
@csuwldcat-実際にはありません。HTML5以降の標準では、このようなカスタム要素をコンテンツモデルの一部にするために、何らかの方法で更新する必要があります。それは興味深いニュースです。どのブラウザで使用できますか?
Alohci

3
@Alochi-明らかに、古い言語のその他の仕様は、この新しい現実を反映するように更新する必要がありますが、HTMLは生きた標準であり、他の仕様をブロックしません-標準の次の段階に移行すると、更新が行われます追跡。Chrome Canaryで、そしてまもなくFirefox Auroraで、Webコンポーネントのネイティブ実装をいじることができます。さらに、今日のすべてのモダーブラウザーで非常にうまく機能する4つのWebコンポーネント仕様のうち3つで利用できるポリフィルがあります。これには、カスタム要素の仕様/機能が含まれます。
csuwldcat 2013年

カスタム要素を特定の場所に配置できるのですか?それとも彼らはまったく許可されていないと言っていますか?
Melab、

12

基本的なカスタム要素と属性

カスタム要素と属性は、次の条件が満たされていれば、HTMLで有効です。

  • 要素名は小文字で始まり、 x-
  • 属性名は小文字で始まり、 data-

たとえば、<x-foo data-bar="gaz"/>または<br data-bar="gaz"/>

要素の一般的な規則は次のとおりですx-foox-vendor-featureがおすすめ。

開発者が要素の登録に伴うすべての能力を必要とすることはほとんどありませんので、これはほとんどの場合を処理します。構文も十分に有効で安定しています。より詳細な説明を以下に示します。

高度なカスタム要素と属性

2014年以降、カスタム要素と属性を登録するための大幅に改善された新しい方法があります。IE 9やChrome / Firefox 20などの古いブラウザでは機能しません。ただし、標準のHTMLElementインターフェースを使用して、衝突を防ぎ、非x-*および非data-*名前や名前以外を使用したり、ブラウザーのカスタム動作や構文を定義して尊重したりできます。 。以下のリンクに詳細が記載されているように、少し凝ったJavaScriptが必要です。

HTML5 Rocks-HTML WebComponents.orgでの新しい要素の定義
-カスタム要素の紹介
W3C-Webコンポーネント:カスタム要素

基本構文の有効性について

使用する data-*カスタム属性名にすることはしばらくの間完全に有効であり、古いバージョンのHTMLでも機能します。

W3C-HTML5:拡張性

カスタム(未登録)要素名については、W3Cはそれらを強く推奨し、それらを非準拠と見なします。しかし、ブラウザはそれらをサポートする必要があり、x-*識別子は将来のHTML仕様やx-vendor-feature競合せず識別子は他の開発者と競合しません。カスタムDTDを使用して、うるさいブラウザを回避できます。

公式ドキュメントからの関連する抜粋をいくつか示します。

「該当する仕様は、新しいドキュメントコンテンツ(例:foobar要素)[...]を定義する場合があります。特定の準拠するHTML5ドキュメントの構文とセマンティクスが、該当する仕様の使用によって変更されない場合、そのドキュメントは準拠するHTML5のままです。資料。"

「ユーザーエージェントは、理解できない要素や属性を意味的に中立として扱う必要があります。それらはDOMに残し(DOMプロセッサの場合)、CSSに従ってスタイル設定しますが(CSSプロセッサの場合)、それらから意味を推測することはできません。」

「ユーザーエージェントは、準拠していないドキュメントを自由に処理できるわけではありません。この仕様で説明されている処理モデルは、入力ドキュメントの準拠に関係なく実装に適用されます。」

「この仕様で定義されていないHTML要素には、HTMLUnknownElementインターフェイスを使用する必要があります。」

W3C-HTML5:適合文書
WhatWG-HTML標準:DOM要素


11

「有効な」という言葉は、この文脈では2つの異なる意味を持つ可能性があることを指摘しておきます。

  1. カスタムタグを含むHTMLドキュメントは有効なHTML5と見なされますか? これに対する答えは明らかに「いいえ」です。仕様には、どのタグがどのコンテキストで有効であるかが正確にリストされています。これが、HTMLバリデーターがカスタムタグや標準タグの間違った場所(ヘッダーの「img」タグなど)を持つドキュメントを受け入れない理由です。

  2. カスタムタグを含むHTMLドキュメントは、ブラウザ間で標準の明確に定義された方法で解析およびレンダリングされますか? ここでは、おそらく驚くべきことに、答えは「はい」です。ドキュメントは技術的に有効なHTML5とは見なされませんが、HTML5仕様で、カスタムタグが表示されたときにブラウザーが実行することを正確に指定しています。つまり、カスタムタグは<span>、デフォルトですが、HTMLでスタイル設定し、JavaScriptでアクセスできます。


5

カスタムHTML要素は、パーサーを使用してカスタム要素を宣言および登録できるようにするために私が貢献してきた新しいW3標準です。仕様については、W3 Webコンポーネントのカスタム要素の仕様を参照してください。さらに、MicrosoftはX-Tagと呼ばれるライブラリ(以前のMozilla 開発者によって作成された)をサポートしています。これにより、Webコンポーネントの操作がさらに簡単になります。


1
このドラフトは合格ですか?
Starx

一部は、FirefoxとChromeに上陸している-私たちは一緒に緊密に協力し、完全な実装を持つことを期待されている2013年の年末までに上陸
csuwldcat

1
今2014年、完全な実装が上陸しましたか?
Hasib Mahmud 2014

1
@JamieHutberにアクセスして、1年後の最新のブラウザでWebページが壊れるのを確認してください。ブラウザーの相互運用性に関するルール#1:ルールに従ってください。
リスター氏

1
@HasibMahmud仕様が完成し、数週間でChrome Betaに、6週間でFirefox Auroraにリリースされます。設定フラグdom.webcomponents.enabledをに切り替えることで、Firefox Auroraでこれらを使用できますtrue
csuwldcat 2014年

4

最新のページを反映した更新された回答を提供します。

カスタムタグは、次の場合に有効です。

1)ダッシュが含まれている

<my-element>

2)XMLが埋め込まれている

<greeting xmlns="http://example.com/customNamespace">Hello!</greeting>

これは、HTML5 doctypeを使用していることを前提としています。 <!doctype html>

これらの単純な制限を考慮すると、HTMLマークアップを有効に保つために最善を尽くすことが理にかなっています(<img>およびなどの終了タグを停止してください<hr>。XHTMLdoctypeを使用しない限り、これはばかげて正しくないため、おそらく必要はありません)。

HTML5が解析ルールを明確に定義していることを考えると、準拠しているブラウザーは、厳密に有効でなくても、スローしたタグを処理できます。


3

HTML5仕様の拡張性セクションからの引用:

XMLシリアル化に限定でき、HTMLシリアル化でサポートする必要がないマークアップレベルの機能の場合、ベンダーは名前空間メカニズムを使用して、非標準の要素と属性がサポートされるカスタム名前空間を定義する必要があります。

したがって、HTML5のXMLシリアル化を使用している場合、次のようなことを行うことは合法です。

<greeting xmlns="http://example.com/customNamespace">Hello!</greeting>

ただし、HTML構文を使用している場合は、実行できることがはるかに制限されます。

HTML構文での使用を目的としたマークアップレベルの機能の場合、拡張機能は "x-vendor-feature" [...]形式の新しい属性に制限する必要があります。新しい要素名は作成しないでください。

ただし、これらの手順は主にブラウザーベンダーを対象としています。ブラウザーベンダーは、作成することを選択したカスタム要素に視覚的なスタイルと機能を提供しているはずです。

ただし、作成者にとっては、ページにカスタム要素を埋め込むことは(少なくともXMLシリアル化では)正当な場合がありますが、DOMのノード以外のものは取得しません。カスタム要素で実際に何かを実行したい場合、または特別な方法でレンダリングしたい場合は、カスタム要素の仕様を確認する必要があります。

このトピックのより穏やかな入門書については、Webコンポーネントの概要をお読みください。これには、Shadow DOMおよびその他の関連仕様に関する情報も含まれています。これらの仕様は現時点ではまだ草案です-現在のステータスはここで確認できますが、積極的に開発されています。

例として、greeting要素の単純な定義は次のようになります。

<element name="greeting">
  <template>
    <style scoped>
      span { color:gray; }
    </style>
    <span>Simon says:</span>
    <q><content/></q>
  </template>
</element>

これは、ブラウザに要素のコンテンツを引用符で囲んでレンダリングし、色「灰色」でスタイル設定されたテキスト「Simonは言う:」を前に付けるように指示します。通常、このようなカスタム要素の定義は、リンクを使用してインポートする別のhtmlファイルに保存されます。

<link rel="import" href="greeting-definition.html" />

必要に応じてインラインで含めることもできます。

ここで確認できるPolymerのポリフィルライブラリを使用して、上記の定義の実用的なデモを作成しました。これは古いバージョンのPolymerライブラリーを使用していることに注意してください-最近のバージョンはまったく異なる動作をします。ただし、仕様はまだ開発中であるため、これはとにかく製品コードで使用することをお勧めするものではありません。


2

ドム宣言なしで好きなだけ使用してください

<container>content here</container>

独自のスタイル(display:block)を追加すると、最新のブラウザで動作します


1

data-*属性はHTML5で有効であり、HTML4でも、それらを尊重するために使用されるすべてのWebブラウザーで有効です。新しいタグを追加することは技術的には問題ありませんが、次の理由で推奨されません。

  1. 将来追加されるものと競合する可能性があります。
  2. JavaScriptを介して動的に追加されない限り、HTMLドキュメントを無効にします。

私はGoogleがゲームエンジンはiframeでecampleため、気にしないということだけの場所でカスタムタグを使用して、私が作っ<log>含まれるタグ<msg><error>およびを<warning>-しかし通じたJavaScriptのみ。バリデータによると、それは完全に有効でした。それはそのスタイルでInternet Explorerでも動作します!;]


1
JavaScriptでこれらの要素を作成していたため、バリデーターに対して有効でしたが、JavaScriptを実行しないため、バリデーターはそれらを表示しませんでした。最初に読み込まれたときに表示されるページのみが表示されます。
アニムソン

丁度。有効なHTMLではありませんが、カスタムタグは引き続き有効なSGMLであり、結局のところHTMLはSGMLです。CSSはカスタムタグのスタイル設定に使用でき、IEで完全に機能します。:)また、DOCTYPE仕様で独自のカスタム要素を使用して独自のDTDを指定できるため、JavaScriptがなくてもカスタムタグが実際に検証される可能性がありますが、私はそれらを気にしません-ゲームエンジンのGUIシステムは明らかにGoogleではありません仕事:)
ПетърПетров

1
まあ、落とし穴があります。カスタム要素を無造作に投入することはできません。それらを「有効な」HTMLと見なすためには、それらを定義してDTDに登録する必要があります。何かが機能するからといって、それが有効であるとは限りません。
アニムソン

<x-msg>、<x-log>などの修飾子を要素名に追加するだけであれば、Webコンポーネント/カスタム要素の仕様に準拠することになります。
Neil Monroe

Webkitが動的GUIをレンダリングするためだけに存在するゲームエンジンでは、誰もDTDを気にしません。:HTMLのための任意の未知のタグがあなたのGUIは、最後にいくつかの意味を取得しますので、まだ、jQueryとCSSで完璧に働く、JSのためHTMLUnknownElementあり <inventory><item type="potion" sprite="2">-それは定義を持っているHTML要素にもかかわらず、SGML + CSSではなくHTMLと呼ばれるように、より良いですので、ボタン、リスト、... -あるとして仕事
ПетърПетров

1

カスタムタグはHTML5では無効です。しかし現在、ブラウザはそれらの解析をサポートしており、cssを使用してそれらを使用することもできます。したがって、現在のブラウザでカスタムタグを使用する場合は、使用できます。ただし、ブラウザーがW3C標準を厳密に実装してHTMLコンテンツを解析するようになると、サポートがなくなる可能性があります。


1
多分それは彼らがサポートをやめる<center>と起こるでしょうか<marquee>
Ravenstine 2016年

1

私はこの質問が古いことを知っていますが、私はこの主題を研究しており、上記のステートメントのいくつかは正しいですが、カスタム要素を作成する唯一の方法ではありません。例えば:

<button id="find">click me</button>
<Query? ?attach="find" ?content="alert( find() );" ?prov="Hello there :D" >
I won't be displayed :D
</Query?>

<style type="text/css">

[\?content] {

display: none;

}

</style>

<script type="text/javascript">

S = document.getElementsByTagName("Query?")[0];

Q = S.getAttribute("?content");

A = document.getElementById( S.getAttribute("?attach") );

function find() {

  return S.getAttribute("?prov");

}

(function() {

A.setAttribute("onclick", Q);

})();

</script>

(Google Chrome、IE、FireFox、およびモバイルSafariのこれまでの新しいバージョンではこれまでのところ)完全に正常に動作します。必要なのは、タグを開始するためのアルファ文字(az、AZ)だけであり、その後に非アルファ文字を使用できます。CSSの場合、要素を見つけるには "\"(バックスラッシュ)を使用する必要があります。たとえば、Query \ ^ {...}が必要です。しかし、JSでは、あなたはそれをあなたがそれをどのように見ているかと呼ぶだけです。これがお役に立てば幸いです。こちらの例をご覧ください

-Mink CBOS


3
これは最近見た中で最も奇妙なHTMLです:)
Dan Dascalescu
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.