ハイパーリンクを提供する

WWWでは、読者は文書のある部分から、関連するほかの文書・場所へ直接ジャンプし、関心を持ったトピックについて、「文書」の枠を超えて次々に渡り歩いていくことができます。このような機能を持つ文書をハイパーテキストと呼び、関連づけをすることを「リンクを張る」と言ったりします。HTMLではa要素を使って文中の語句や画像からリンクを形成します。

目次:

取り上げる要素: a

アンカー要素

本文中のリンク情報は アンカー要素(a要素タイプ)で表現します。アンカー(Anchor)とは「錨」のことですが、何かをつなぎとめるものという一般的な意味もあります。文書のある場所から別の場所(リソース)へのリンクを、文書と文書をつなぐ錨として表しているわけです。リンクには起点(リンク元)と終点(リンク先)を示すことが必要ですが、アンカー要素はその両方を表現する役割を持っています。

HTML4では、この要素はインライン要素のグループに属します。つまり、段落中の単語などにリンクの「錨」としての役割を与える要素です。

HTML5では、a要素の中に見出しなどフレージング内容グループ以外の要素も記述できるようになりました。

ほかの文書へのリンク

文書中のある部分(起点)からほかの文書(終点)にリンクを張るときは、起点となる部分をa要素としてマークアップします。そしてどこにリンクするかを示すために、開始タグに終点(参照先)を示す付加情報(属性)として「href="リンク先URL"」を加えます。例えば、同じディレクトリにあるkan.htmlというファイルにリンクするには

(例)<a href="kan.html">リンクの起点とするテキスト</a>

と記述します。インターネット上のリソース(ファイルなど)にリンクするには

(例)<a href="http://www.kanzaki.com/docs/htminfo.html">

のように、URL全体を指定します(ファイル名のみによる指定は、リンク元とリンク先が同じディレクトリ(フォルダ)にあるため、URLのサーバー名などが省略されたもの=相対URL=です)。

〔補足〕

Note: 属性 (Attribute)とは、要素の働きを細かく指定するための情報で、必要に応じて開始タグの中に記述されます。属性は複数指定することができ、タグは

(例)<element attr1="val1" attr2="val2" ... >

という形になります(element, attr, valはそれぞれ要素タイプ名、属性名、属性値)。どの要素がどんな属性を持ち、その値はどんな範囲をとるかは、やはりDTDというHTMLの文法書で定められています。

属性値はかならず引用符で囲むようにしてください(HTML4においては、英数字と.:_-のみで構成される属性値は裸でもよいことになっていますが、%や#を含むものは引用符で囲まなければなりません)。XHTMLでは、全ての属性値は引用符で囲む必要があります。

〔以上補足〕

なお、HTMLのリンクはこのような一対一の単方向の関係を示すシンプルなものですが、一対多、双方向などの複雑なリンクは、XMLのリンク言語であるXLinkを用いて表現することができるようになります。

文書の特定の場所へのリンク

リンク先には、文書中の特定の段落など具体的な場所(フラグメントといいます)を指定することもできます。フラグメントを示すには、対象となる要素にid属性を使って名前を付けます(古いブラウザとの互換性のためには、アンカー要素の2番目の役割であるname属性による名前付け機能を使うこともできます)。文書Aの「説明を読む」から文書Bの「詳細」という項目にブラウザの表示をジャンプさせるには、

  1. 文書Bの「詳細」を示す要素に、id属性(もしくはアンカー要素のname属性)を使って名前付けする
  2. 文書Aの「説明を読む」を、アンカー要素の第1機能でリンク元に設定する。このときリンク先ファイル名(文書B)の後ろに、#名前としてターゲット要素(フラグメント)の指示を加える

という2つの手続きをとります。

名前を付ける

文書の特定要素に名前を付けるためには、その要素にid属性を加えます。例えば「詳細」というテキストがレベル2の見出し(h2要素)になっていれば、次のようにします。

(例)<h2 id="detail">詳細</h2>

〔古い情報〕

id属性はHTML4から導入されたもので、それ以前はa要素のname属性で名前を付けていました。大部分のブラウザはid属性を理解しますが、互換性を重視する場合はname属性による名前付けを使う方が都合がよいこともあります。

(例)<h2><a name="detail">詳細</a></h2>

Note: XHTMLでは文書内の名前付けの方法として、name属性ではなくid属性を使用することになっています。XHTML1.0では互換性にも配慮して、a要素に同じ値のidとnameを併記しアンカーとすることができます。

(例)<h2><a name="detail" id="detail">詳細</a></h2>

XHTML 1.1以降ではa要素のname属性は廃止されるため、このような併記方式ではなく、上記のid属性による名前付けを用いなければなりません。name属性をどう扱うかは、過渡期として難しい問題です。

〔以上、古い情報〕

名付けたフラグメントにリンクする

文書B内のdetailという名前を付けられている場所(ここでは「詳細」)にリンクするための「始点」の記述は次のようになります。

(例)<a href="file-b.html#detail">説明を読む</a>

#名前 は文書のフラグメントを指定するための書式で、この名前は「フラグメント識別子」と呼ばれます。

同じディスク上のファイルではなくインターネット上のリソースの場合でも <a href="http://www.kanzaki.com/file-b.html#detail"> のように、URLの後に#とフラグメント識別子を加えた形で特定の箇所にリンクすることができます。

名前付けの注意点

名前に使う文字

id属性や、a要素のname属性の値の付け方には、一定の約束があります。これらは、アルファベット[A-Za-z]で始まり、そのあとにアルファベット、数字[0-9] 、ハイフン( - )、アンダースコア( _ )、コロン( : )、ピリオド( . )を組み合わせた名前でなければなりません。

〔補足〕

id属性の値は、必ずアルファベット[A-Za-z]で始めなければなりません。IDというとid="1301"のように数字を付けてしまいそうですが、数字だけのidは誤りなので注意してください。HTMLの場合、定義上はname属性にはこの制限はないのですが、id属性に移行するときに困ることになるので、同じルールに合わせておくほうがよいでしょう。XHTML1.0ではname属性もid属性と同じ名前付けルールになります(最初の文字に _ を使ってよいなど、id属性のルールも少し変わります)。

コロンは名前文字に使ってよいことになっていますが、XMLの名前空間の接頭辞を区切る文字と混乱しかねないので、避けた方がよいかも知れません。また、アンダースコア( _ )、コロン( : )、ピリオド( . )はCSSスタイルシートのセレクタとしては使うことができないので注意してください。

さらに、日本語による名前を直接指定することは事実上できないので注意してください(定義上は不可能ではないが、URLと一緒に使うとややこしいので、仕様書ではASCII文字以外はそのままでは使わないこととされている)。

名前の唯一性

名前は、同一ドキュメントの中で唯一のものでなければならず、重複してはいけません(Uniqueness)。このとき、(1)大小文字の違いだけによる名前付けは、この唯一性を満足できません;(2)ただし、名前の照合時(string match)に大小文字は区別されます。以下のような使い方をしないよう注意してください。

(誤った例)

  1. The <a name="china">china</a> is a porcelain made in <a name="China">China</a>×名前の唯一性に違反)
  2. id="xyz"と指定したフラグメントを<a href="#XYZ">として参照する(大小文字が異なるので一致しない)

×:なお、idとnameは名前空間を共有するので、同じ名前を異なる要素のidとnameに設定することはできません。つまり

(誤った例)<h2 id="detail"><a name="detail">詳細</a></h2>

は名前の唯一性に反する(2箇所に同じ名前を付けている)誤った書き方ということになります。

同じファイルの特定箇所へのリンク

同じファイル内の異なる箇所を表示するときは、リンク元のaタグを記述するときに、ファイル名を略して#名前だけで指定することができます。名前付けについてはほかの文書の特定の場所へのリンクの場合と同様です。例えば文書Bのある部分から同じ文書Bの「詳細」に表示位置を変更するためには

(例)<a href="#detail">このファイル内の詳細へ</a>

のようにします。×よくある間違い:#を忘れると、「detail」という名前のファイルを探そうとしてNot Foundエラーになります。

フラグメント識別子に関する補足

※フラグメント識別子の解釈について細かい話をします。読み飛ばして差し支えありません。

RFC 2396では、フラグメント識別子はURIの一部ではなく、URI '#' fragidという形は「URI参照」と呼ばれていましたが、2005年に発行されたRFC 3986で定義が改められ、URIの構文はフラグメント識別子も含むものとなりました。RFC 3986での「URI参照」は、絶対URIと相対参照を合わせた総称として用いられています。

The fragment identifier has been moved back into the section on generic syntax components and within the URI and relative-ref rules, though it remains excluded from absolute-URI. The number sign ("#") character has been moved back to the reserved set as a result of eintegrating the fragment syntax. (RFC 3986: D.2. Modifications)

※このサイトの他のページ(特にRDF関係)で「URI参照」と記述している場合、多くはRFC 2396の意味で用いています。細かいことなので、あまり気にしないでください。

以下は古い記述ですが、参考のために残してあります。RFC 2396では次のような定義でした:

#名前の部分は、URLの一部ではありません。厳密にいうと、フラグメント識別子を加えたURI#fragidという形はURI参照と呼ばれます。ブラウザがサーバーへのリクエストに使うのはURIの部分だけで、その結果得られたリソースを、フラグメント識別子に対応して表示する(スクロールする、ハイライトするなど)は、ブラウザが独自に行います。

URI部分のない(#fragidだけの)URI参照は、その文書の「見え方(view)」を変更するものであるとされています。

... the normal intent of such references is for the user agent to change its view of the current document to the beginning of the specified fragment within that document ...(RFC 2396: G.4. Modifications from RFC 1808)

文章の読み方という点で見れば、ユーザーのアクションによってviewを変更する=異なるポジションに移動するのも、やはりハイパーリンクですね。

(ここまでが古い記述でした)