「名前」または「ID」でHTMLアンカーを作成する必要がありますか?


783

ウェブページの一部を " http://example.com/#foo"メソッドで参照したい場合、

<h1><a name="foo"/>Foo Title</h1>

または

<h1 id="foo">Foo Title</h1>

どちらも機能しますが、同等ですか、または意味上の違いがありますか?


2
リンクは実際にhttp://example.com#foo(つまり/の前に#がない)
Dana

71
実は、http://example.com#fooおよびhttp://example.com/#fooURIの上のRFCの1に定義された同等です。
オリバー

回答:


616

HTML 5仕様によると、5.9.8フラグメント識別子への移動

HTMLドキュメント(およびtext / html MIMEタイプ)の場合、次の処理モデルに従って、ドキュメントの指定された部分が何かを判断する必要があります。

  1. URLを解析し、fragidをURLの<fragment>コンポーネントにします。
  2. fragidが空の文字列の場合、ドキュメントの指定された部分がドキュメントの先頭になります。
  3. fragidと完全に等しいIDを持つ要素がDOMにある場合、ツリー順で最初のそのような要素はドキュメントの指定された部分です。ここでアルゴリズムを停止します。
  4. DOM内に、値がfragidと完全に等しいname属性を持つa要素がある場合、ツリー順で最初のそのような要素は、ドキュメントの指定された部分です。ここでアルゴリズムを停止します。
  5. それ以外の場合、ドキュメントの指定された部分はありません。

したがって、それはを探しid="foo"、次に従いますname="foo"

編集:@hsivonenで指摘されているように、HTML5ではa要素にname属性がありません。ただし、上記のルールは他の名前付き要素にも適用されます。


76
そのアルゴリズムと妥当性の間に暗黙の関係はありません。<下書き>は、現在草案されているHTML5では無効です。
hsivonen、2009年

13
実際には、他の「名前付き要素」には適用されません。名前属性に関する限り、それは<名前>にのみ適用されます。ただし、作成者はその属性を使用できません。古いHTMLページのユーザーエージェントがそれを尊重する必要があるだけです。
アン

19
@RafaelSoares <h1 id="foo">Foo Title</h1>はIE6でも動作し、HTML 4.01仕様の
Aprillion

4
name = "foo"ではなく、<a name="foo">を検索します。リンクを
ダニエルヘルツォーク

3
a name="foo"とa id="foo"(ページ内の順序に関係なく)を含むHTML5ドキュメントでは、ChromeとFirefoxはにジャンプしますがid、IE(11でテスト済み)とEdge name
はに

182

空のXML構文はでサポートされていないため、<h1><a name="foo"/>Foo Title</h1>として機能するHTMLで使用しtext/htmlないでくださいtext/html。ただし、<h1><a name="foo">Foo Title</a></h1>HTML4 では問題ありません。現在ドラフトされているHTML5では無効です。

<h1 id="foo">Foo Title</h1>HTML4とHTML5のどちらでも問題ありません。これはNetscape 4では機能しませんが、おそらくNetscape 4では機能しない他の多数の機能を使用することになります。


6
ブラウザのサポートについて話すための+1。NS4だけがurl#id => element.idをサポートしていないのですか?
ハッシュブラウン2013年

14
@Hashbrown答えが見つからなかったので、テストを行いました。URLフラグメントとCSS セレクターの互換性に関して、非常に古いブラウザーでもidsをnameアンカーのように扱うことがわかりました。テスト済み:Chrome 6、Firefox 1.5、IE6、Opera 8.02、Safari 3.1.2、Netscape 7.2、Lynx 2.24、およびモバイルブラウザー:Android 2.2、Chrome 26、Dolphin 9.3、Firefox 19、IE10、Safari 4、およびOpera Mini 5.1。:target
スティーブンM.ハリス14

1
@smhmic、見つけた。Off-By-One Webブラウザーは、<a name="foo"/>を介して定義されたアンカーを認識しますが、<sometag id = "foo">を介して定義されたアンカーを認識しません。OB1は8年以上前に最後に更新されました。その作者は、それが「HTML 3.2を完全にサポートする世界最小かつ最速のWebブラウザかもしれない」と自負しています。Win95からXPまでのサポートを主張していますが、64ビットWin7で正常に動作します。では、なぜそのような恐竜がいるのでしょうか?もちろん、テストのために、本当に旧式のブラウザで私のサイトがひどく壊れないことを確認してください。また、OB1はフラッシュドライブにも搭載しています。それは小さく、自己完結型であり、感染に対して免疫があります。
Dave Burton、

26
これを2016年に読むと、次のようになります。Netscape4?
ADTC

1
。 `<a name="something" id="something> </a>の[ELEMENT TO SCROLL TO]それは互換性のため、おそらく最もされ、&それはスタイルが何であれ、スクロールするためにエレメントでいますしない使用
JustinCB

52

あなたがページのその領域にリンクするつもりなら... page.html#fooのように、そしてFoo Titleはあなたが使うべきリンクではないと言っておく必要があります:

<h1 id="foo">Foo Title</h1>

代わりに<a>参照を配置すると、見出しは<a>サイト内の特定のCSSの影響を受けます。これは追加のマークアップであり、必要ありません。見出しにIDを配置することを強くお勧めします。IDを形成するだけでなく、JavaScriptまたはCSSでそのオブジェクトに対応できます。


それだけでなく、表示に関する奇妙なエラーと戦っています。IEには何も表示されませんでした。攻撃ポイントについての考えが欠けているので、<a name="foo">エントリにフラグを立てた検証ツールにそれを投げて、それらを変更しました。
Loren Pechtel、2015

これで十分です。効果のためにアンカータグは必要ありません。
WallaceSidhrée2015

27

ウィキペディアはこの機能を次のように多用しています。

<a href="#History">[...]</a>
<span class="mw-headline" id="History">History</span>

ウィキペディアはすべての人のために機能しているので、このフォームをそのまま使用しても安心です。

また、忘れずに、これをスパンだけでなく、divまたはテーブルセルでも使用でき、要素の:target疑似クラスにアクセスできるようになります。太字のテキストのように、幅を変更しないように注意してください。これにより、コンテンツが移動し、邪魔になります。

名前付きアンカー-私の投票は回避することです:

  • 「名前とIDは同じ名前空間にあります...」-同じ名前空間を持つ2つの属性は狂っています。すでに廃止されたとしましょう。
  • 「href属性なしで要素をアンカーする」-さらに、要素の性質(ハイパーリンクかどうか)は、属性を持つことによって定義されますか?ダブルクレイジー。常識では、それを完全に回避するように言われています。
  • 疑似クラスを使用せずにアンカーをスタイルする場合、スタイルはそれぞれに適用されます。CSS3では、属性セレクター(または各疑似クラスの同じスタイル)を使用してこれを回避できますが、それでも回避策です。疑似クラスごとに色を選択するため、これは通常は発生しません。デフォルトで下線が表示されているため、削除するだけで意味があり、他のテキストと同じになります。しかし、リンクを太字にすることにした場合、問題が発生します。
  • Netscape 4はid機能をサポートしていない場合がありますが、それでも不明な属性が原因で問題が発生することはありません。それが私にとって互換性と呼ばれるものです。

1
編集箇条書き3の4をa {color:red}提案:スタイルを設定すると、<a href>リンクと<a name>フラグメントの両方に色が付けられます。これを回避するには、疑似クラスa:link {color:red]}または属性セレクターを使用しますa:not([href]) {color:red;}
Bob Stein

あなたは正しいですが、私にとっては第3弾はまさにこれを述べています。でも私の英語かもしれない...
ゾルタンモルバイ2013

最後に、私はあなたのポイントを持っています:「疑似クラスなしでアンカーをスタイルする場合、スタイルはそれぞれに適用されます。」あいまいさ:「各疑似クラス」と考えるかもしれません。正しい。しかし、私はアンカーを使用する "それぞれのケース"を考えていました。明確にした。:)あなたのコメントの後に編集する必要はありませんが、あなたが主張すれば私はできます。しかし、また、それはまだにくいあなたは通常、別のそれらを保つ意図したとおり、色で起こり、それにフォントの太さとまだ同じ場合...
ゾルタンMorvai

@ZoltánMorvaiのコメントを読んで楽しんだ。「double crazy」と「netscape 4」のdoubleplusgood。
ランディL

1
同じ名前空間を持つ2つの属性はクレイジーです-実際にはそうではありません。ユーザーが作成したコンテンツを実行する場合<a name="heading1"></a> ... document.html#heading1、IDを設定せずにフラグメントリンクとして何かを指定できると非常に便利です。これは、IDがページ上の別のIDと競合する可能性があるためです。nameHTML5に属性を設定しなかったのは残念です。
Jez

14
<h1 id="foo">Foo Title</h1>

使用すべきものです。リンクが必要でない限り、アンカーを使用しないでください。


ティム・ナイトの答えと同じで、この答えの半年前に投稿されました。-1
Luc

13

JavaScriptユーザーに向けて:すべてのIDはwindowの下でグローバル変数になります

<h1 id="foo">Foo Title</h1>

JSグローバルを作成しました。

window.foo

値はwindow.fooなりますHTMLElementためh1

id属性で使用されているすべての値が安全であることを保証できない場合は、以下を守ることをお勧めしますname

<h1 name="foo">Foo Title</h1>

12
良いニュースは、で定義された関数を上書きできないことですwindow。たとえば<div id="open"></div>、関数を上書きしませんwindow.open
Flimm

8

意味上の違いはありません。標準の傾向はでidはなくを使用する方向にありますname。ただし、name場合によっては好む可能性のある違いがあります。HTML 4.01仕様では、次のヒントが提供されています

idまたは使用しますかname?作成者は、アンカー名を使用するidname、アンカー名に使用するかを決定するときに、次の問題を考慮する必要があります。

  • id属性は、単なるアンカー名(たとえば、スタイルシートセレクター、処理識別子など)として機能することができます。
  • 一部の古いユーザーエージェントは、id属性で作成されたアンカーをサポートしていません。
  • name属性は、より豊富なアンカー名を(エンティティと共に)許可します。

14
明確に言うと、彼らが「古いユーザーエージェント」と言うとき、それらは本当に古いユーザーエージェントを意味します。私はそれについて心配しません。
Eli

1
HTML5では「リッチ」IDも使用できます。IDアンカーされたフラグメントを処理できない0.1%を超える市場シェアを持つブラウザーのバージョン番号を持っている人はいますか?–または、恐竜のNetscape 4.7は実際に最も普及しているものですか?
Robert Siemer

7
FWIW、idSafari for iOS 5でアンカーを機能させることができなかったので、'09年にすでに「本当に古い」ブラウザだけではありません。nameサイトをiPadで正しく機能させるには、s を追加する必要がありました。これは今では修正されているかもしれません。私はチェックするiOS 6デバイスを所有していません。
Daniel Saner、

@DanielSaner本当に?それでen.wikipedia.org/wiki/IPad#ApplicationsはあなたのiPadでは動かないのですか?
Aprillion 2013年

1
@DanielSanerシミュレータを使用してMobile Safari 5.02と5.1、およびAndroidブラウザ2.2と2.3をテストしましたが、idアンカーは普遍的に機能しているようです。場合はこの単純な例では、あなたの携帯電話上では動作しません、私は、デバイスのアクセシビリティ設定を確認します。(@deathApril Wikipediaモバイルサイトには、URLフラグメントを効果的に無視させるJavascriptがあります。)
Stephen M. Harris

8

IDメソッドは古いブラウザでは機能せず、アンカー名メソッドは新しいHTMLバージョンで非推奨になります...私はIDを使用します。


2
それらの主張の出典はありますか?誤解しないでください。私は一般的に興味があります。
Henrik Paul

11
それは、「古いブラウザでは機能しない」ということを明らかにしません。– Netscape 4を除いて、これらはどのブラウザですか?
Robert Siemer

3
私はdivでidを使用してみましたが、IE 7でも機能しますが、IE 6ではテストできませんでしたが、最近IE 6を使用しているのは...
Gilly

@deathAprilは特定の場合(HASLAYOUTによって異なります)、バグがあります。
Knu

@RobertSiemerはほぼ普遍的に機能しますこの回答の下にある私のコメントを参照してください。
スティーブンM.ハリス

3

垂直に積み重ねられた多数のdivコンテナーで構成されるWebページがあり、形式は同じでシリアル番号のみが異なります。各divの上部にある名前アンカーを非表示にしたかったので、最も経済的な解決策は、開始divタグ内にIDとしてアンカーを含めることです。

<div id="[serial number]" class="topic_wrapper">

2

マークアップに関する単なる観察以前のバージョンのHTMLのマークアップフォームは、アンカーポイントを提供していました。id属性を使用するHTML5のマークアップフォームは、ほとんど同じですが、識別するための要素を必要とします。ほとんどすべての要素は通常、コンテンツを含むことが期待されています。

たとえば、空のスパンまたはdivを使用することもできますが、この使用法では、外観とにおいが悪化します。

この目的のために、wbr要素を使用することが考えられます。wbrには空のコンテンツモデルがあり、改行が可能であることを単に宣言します。これは、まだマークアップタグのやや無意味な使用法ですが、無意味なドキュメント分割や空のテキストスパンよりもはるかに少ないです。


それは良い点です。詳細情報についてwbrw3.org/TR/html-markup/wbr.html使用<wbr id="foo" />ではなく<a name="foo"></a>
ルーク

1

2番目のサンプルは、問題の要素に一意のIDを割り当てます。この要素は、DHTMLを使用して操作またはアクセスできます。

一方、1つ目は、ブックマークに似た、ドキュメント内の名前付きの場所を設定します。「アンカー」に取り付けられているので、完全に理にかなっています。


1

HTML 5では、id=""属性は要素の一意の識別子を定義します。これは、フラグメントリンクのアンカーでもあります。以前のHTML標準でname=""は、<a>要素の属性はフラグメントリンクのアンカーを定義していました。私は次のようなものをお勧めします:属性の
<a name="foo" id="foo"></a><h1>Foo Title</h1>
サポートid=""は少しむらがあるため(すべての主要なブラウザーの最新リリースでサポートされている場合でも、リリースが数年以内のものではありません[そして、何かを壊さないことが最善ですする正当な理由がない場合])。互換性があり、リンクされた要素のスタイルはありません。終了</a>はまだ要素の外側にあるためですが、現在のすべての標準で引き続き有効です。

要素のname=""およびid=""属性が<a>同じであることを確認してください。


2
HTMLを使用するすべてがブラウザであるとは限りません。HTMLを使用してウィンドウに情報を表示するJavaライブラリを使用しています。これが機能した唯一の方法です。それはだname必要とされたアンカータグの属性。に属性を配置するhNか、機能spanしませんでした。
火星

0

古いブラウザのname属性と新しいブラウザのid属性を使用するのはどうでしょう。両方のオプションが使用され、フォールバックメソッドがデフォルトで実装されます!!!


-3

「名前付きアンカー」の概念全体では、定義によりname属性を使用します。名前の使用に固執する必要がありますが、ID属性は一部のjavascriptの状況で便利な場合があります。

コメントのように、両方を使って賭けをヘッジすることができます。


両方を使用する場合、id:sと名前はグローバルに一意ですか?のように、IDと名前の両方に同じ文字列を使用できますか?
Henrik Paul、

できますが、一部の人々はそれを悪い習慣だと考えています。
Alex Fort

9
HTML仕様によると、両方が存在する場合、名前とIDは同一である必要があります。また、名前とIDは同じ名前空間にあると述べています。HTMLバリデーターサービスはこれらをチェックしませんし、ブラウザーが気にすることはないと思いますが、とにかくこれらは良いガイドラインのようです。
エリクソン2009年

3
現実が再定義されました!<名前...最初から病気だったし、CSSリンクのスタイリングはそれをさらに厄介にします。
Robert Siemer
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.