--- title: ': 外部リソースへのリンク要素' slug: Web/HTML/Element/link tags: - Element - HTML - HTML document metadata - Link - Reference - Web - Web Performance - metadata translation_of: Web/HTML/Element/link ---
HTML 外部リソースへのリンク要素 (<link>) は、現在の文書と外部のリソースとの関係を指定します。この要素は{{Glossary("CSS", "スタイルシート")}}へのリンクに最もよく使用されますが、サイトのアイコン ("favicon" スタイルのアイコンと、モバイル端末のホーム画面やアプリのアイコンの両方) の確立や、その他のことにも使用されます。
外部スタイルシートへリンクするには、 {{HTMLElement("head")}} の中に次のような <link> 要素を入れてください。
<link href="main.css" rel="stylesheet">
この単純な例では、 href 属性内にスタイルシートへのパスを提供し、 rel 属性の値を stylesheet にしています。 rel は "relationship" を意味し、おそらく <link> 要素の重要な機能の一つです。 — 値はこれを含んでいる文書にどのように関係するかを示します。リンク種別で見られるように、様々な種類の関係があります。
他にも見かけるであろう他の一般的な種別はたくさんあります。例えば、サイトのファビコンへのリンクがあります。
<link rel="icon" href="favicon.ico">
他にもアイコンの rel 値はいくつもあり、以下のように主に様々なモバイルプラットフォーム上で特殊なアイコンの種別を示すために使用されます。
<link rel="apple-touch-icon-precomposed" sizes="114x114"
href="apple-icon-114.png" type="image/png">
sizes 属性はアイコンの寸法を表し、 type はリンクされようとしているリソースの MIME タイプが入ります。これらはブラウザーが利用できる最も適切なアイコンを選択するための有益なヒントを提供します。
media 属性でメディア種別やクエリを指定することもできます。このリソースはメディアの条件が真になった場合のみ読み込まれます。
<link href="print.css" rel="stylesheet" media="print"> <link href="mobile.css" rel="stylesheet" media="screen and (max-width: 600px)">
<link> 要素には、興味深いパフォーマンスやセキュリティの機能もいくつか追加されています。以下の例を見てみましょう。
<link rel="preload" href="myFont.woff2" as="font"
type="font/woff2" crossorigin="anonymous">
rel が preload の値であることは、ブラウザーがこのリソースを先読みすることを指示しており (詳しくは rel="preload" によるコンテンツの先読みを参照)、 as 属性がコンテンツが読み込まれるされる特定のクラスを示します。 crossorigin 属性はリソースが {{Glossary("CORS")}} リクエストによって読み込まれるかどうかを示します。
その他の有用なメモです。
<link> 要素はリンク種別が body-ok であるかどうかによって、 {{HTMLElement("head")}} 要素または {{HTMLElement("body")}} 要素のどちらかに置くことができます。例えば stylesheet リンク種別は body-ok であり、<link rel="stylesheet"> を body 要素内に置くことができます。しかし、これは従うべき良い方法ではありません。 <link> 要素は <head> に入れて本文から離した方が分かりやすくなります。<link> を使用する場合で、サイトがセキュリティの強化のためにコンテンツセキュリティポリシー (CSP) を使用している場合、ファビコンにポリシーが適用されます。ファビコンが読み込まれないという問題が発生したら、 {{HTTPHeader("Content-Security-Policy")}} ヘッダーの img-src ディレクティブがアクセスを禁止していないかどうか確認してください。<link> 要素向けのイベントハンドラーを定義していますが、それらがどのように使用されるかは不明確です。<link> のような空要素では、 <link /> のように末尾のスラッシュが必要です。rel に next の値を使用して、一連の文書の次のページを先読みすることに対応しています。この要素にはグローバル属性があります。
rel="preload" または rel="prefetch" を <link> 要素に設定した場合に限り使用されます。これは <link> によって読み込まれるコンテンツのタイプを指定する属性であり、リクエストのマッチング、正しいコンテンツセキュリティポリシーの適用、正しい {{HTTPHeader("Accept")}} リクエストヘッダーの設定のために必要です。さらに、 rel="preload" はこれをリクエストの優先度付の信号として使用します。下記の表はこの属性に有効な値と、適用先の要素またはリソースの一覧です。| 値 | 適用先 |
|---|---|
| audio | <audio> 要素 |
| document | <iframe> および <frame> 要素 |
| embed | <embed> 要素 |
| fetch |
fetch, XHR この値では |
| font | CSS @font-face |
| image | <img> および <picture> 要素で srcset または imageset 属性が付いているもの、 SVG の <image> 属性、 CSS の *-image 規則 |
| object | <object> 要素 |
| script | <script> 要素、ワーカーの importScripts |
| style | <link rel=stylesheet> 要素、 CSS の @import |
| track | <track> 要素 |
| video | <video> 要素 |
| worker | ワーカー、共有ワーカー |
anonymoususe-credentialsOrigin ヘッダーを持つリクエスト) が実行され、信用情報が送信されます (Cookie、証明書、HTTP ベーシック認証が利用されます)。サーバーが元のサイトに信用情報を付与しない場合 (HTTP の {{HTTPHeader("Access-Control-Allow-Credentials")}} ヘッダーに関わらず)、画像が汚染され、その使用も制限されます。Origin HTTP ヘッダーを送信せずに) 取得され、汚染されない使用が妨げられます。これが無効な場合、列挙型のキーワード anonymous が指定されたものとして扱われます。それ以上の情報は CORS 設定属性 を参照してください。rel="stylesheet" の場合のみ、 disabled は論理属性であり、指定されたスタイルシートを読み込んで文書に適用するかどうかを示します。 disabled が HTML に読み込み時点で指定されていた場合、そのスタイルシートはページ読み込み処理の間に読み込まれません。代わりに、そのスタイルシートは disabled 属性が false に変更されたか削除された場合にオンデマンドで読み込まれます。
DOM から disabled プロパティの値を変更すると、そのスタイルシートを文書の {{domxref("StyleSheet.disabled")}} のプロパティから削除します。
rel="preload" および as="image" において、 imagesizes 属性は、 img 要素によって使用される適切なリソースを、その srcset および sizes 属性に対応する値で先読みすることを示す sizes 属性です。rel="preload" および as="image" において、 imagesrcset 属性は img 要素によって使用される適切なリソースを、その srcset および sizes 属性に対応する値で先読みすることを示す sourceset 属性です。注:
print, screen, aural, braille などの使用可能な値が定義されています。 HTML5 ではこれがあらゆるメディアクエリに拡張され、 HTML 4 で使用できる値の上位互換となっています。no-referrer は、{{HTTPHeader("Referer")}} ヘッダーを送信しないことを表します。no-referrer-when-downgrade は、TLS (HTTPS) を使用せずに生成元へナビゲートする場合は {{HTTPHeader("Referer")}} ヘッダーを送信しないことを表します。これは他にポリシーが定められていない場合の、ユーザーエージェントの既定の動作です。origin は、ページの生成元 (大まかにいえばスキーム、ホスト、ポート) をリファラーとすることを表します。origin-when-cross-origin は、異なるオリジンへの移動ではリファラーをスキーム、ホスト、ポートに制限します。同一オリジンへの移動では、リファラーのパスも含めます。unsafe-url は、リファラーに生成元とパスを含めることを表します (ただし、フラグメント、パスワード、ユーザー名は含めません)。これは生成元やパスの情報が TLS で保護されたリソースからセキュアでない生成元へ漏えいしますので、安全ではありません。icon 又は Apple の apple-touch-icon のような標準外の種別が含まれている場合にのみ指定することができます。以下の値を指定できます。
any: image/svg+xml のようなベクター画像であるため、どのようなサイズにも調整可能であることを示します。<幅のピクセル値>x<高さのピクセル値> または <幅のピクセル値>X<高さのピクセル値> という形式です。それぞれのサイズがリソースに含まれていることが必要です。注: ほとんどのアイコン形式は1個のアイコンのみ保存可能です。よってほとんどの場合、 {{HTMLAttrxRef("sizes")}} 属性はエントリーが1個だけになります。アップルの ICN はもちろん、マイクロソフトの ICO 形式も使用できます。 ICO の方が一般的であり、複数ブラウザーの対応 (特に IE の古いバージョン) が重要である場合はこの形式を使用してください。
title 属性は、<link> 要素では特別な意味があります。<link rel="stylesheet"> で使用すると、優先スタイルシートか代替スタイルシートか を定義します。間違って使用すると スタイルシートが無視されます。type 属性を省略できるばかりでなく、それが実際に推奨される習慣になっています。また rel="preload" リンク種別で、ブラウザーが対応するファイルタイプのみダウンロードさせるためにも使用します。iso-8859-1 です。
rel 属性の値と比べたときに逆向きの関係を定義します。この属性向けのリンク種別の値は、{{HTMLAttrxRef("rel", "link")}} 向けの値と似ています。注: この属性は WHATWG HTML living standard (MDN が正式とみなしている仕様書) で廃止とみなされています。しかし、 rev は W3C 仕様書では廃止とみなされていないことは注目に値します。とはいうものの、不確実性を考えると、 rev に頼ることは賢明ではありません。
代わりに、逆の意味のリンク種別の値を与えた {{HTMLAttrxRef("rel", "link")}} 属性を使用してください。例えば made は author に置き換えます。また、この属性はリビジョンを表すものではなく、バージョン番号を指定してはいけませんが、残念ながらいくつものサイトでそのように使用されています。
ページにスタイルシートを読み込むには、以下の構文を使用します。
<link href="style.css" rel="stylesheet">
代替スタイルシートも提示できます。
ユーザーはメニューの 表示 > スタイルシート で、使用するスタイルシートを選択できます。これは、ユーザーがページをさまざまなバージョンで閲覧する手段を提供します。
<link href="default.css" rel="stylesheet" title="Default Style"> <link href="fancy.css" rel="alternate stylesheet" title="Fancy"> <link href="basic.css" rel="alternate stylesheet" title="Basic">
同じページにいくつかの異なるアイコンへのリンクを含めて、ブラウザーが rel や sizes の値をヒントとして使用し、特定の場面で最適に動作する一つを選択するようにすることができます。
<!-- 高解像度ディスプレイの第三世代 iPad --> <link rel="apple-touch-icon-precomposed" sizes="144x144" href="favicon144.png"> <!-- 高解像度ディスプレイの iPhone --> <link rel="apple-touch-icon-precomposed" sizes="114x114" href="favicon114.png"> <!-- 第一、第二世代の iPad: --> <link rel="apple-touch-icon-precomposed" sizes="72x72" href="favicon72.png"> <!-- 高解像度でない iPhone, iPod Touch, Android 2.1 以降の端末 --> <link rel="apple-touch-icon-precomposed" href="favicon57.png"> <!-- 基本的なファビコン --> <link rel="icon" href="favicon32.png">
以下のように、メディア種別やクエリを media 属性で指定することができます。このリソースはメディア条件が真の場合にのみ読み込まれます。
<link href="print.css" rel="stylesheet" media="print"> <link href="mobile.css" rel="stylesheet" media="all"> <link href="desktop.css" rel="stylesheet" media="screen and (min-width: 600px)"> <link href="highres.css" rel="stylesheet" media="screen and (min-resolution: 300dpi)">
load イベントの発生を確認することで、スタイルシートが読み込まれた時を判断できます。同様に error イベントを確認することで、スタイルシートを処理する際のエラー発生を検出できます。
<script>
var myStylesheet = document.querySelector('#my-stylesheet');
myStylesheet.onload = function() {
// Do something interesting; the sheet has been loaded
}
myStylesheet.onerror = function() {
console.log("An error occurred loading the stylesheet!");
}
</script>
<link rel="stylesheet" href="mystylesheet.css" id="my-stylesheet">
注: load イベントはスタイルシートとスタイルシートがインポートするすべてのコンテンツの読み込みと解析が行われた後、スタイルシートがコンテンツに適用される直前に発生します。
rel="preload" によるコンテンツの先読みに、<link rel="preload"> の例がいくつかあります。
| コンテンツカテゴリ | メタデータコンテンツ。 itemprop 属性がある場合はフローコンテンツ、記述コンテンツ |
|---|---|
| 許可されている内容 | なし。これは{{Glossary("empty element", "空要素")}}です。 |
| タグの省略 | 空要素であるため開始タグは必須であり、終了タグは置いてはいけません。 |
| 許可されている親要素 | メタデータ要素を受け入れるすべての要素。 itemprop 属性がある場合は記述コンテンツを受け入れるすべての要素。 |
| 暗黙の ARIA ロール | href 属性つきの {{ARIARole("link")}} |
| 許可されている ARIA ロール | 許可されている role なし |
| DOM インターフェイス | {{DOMxRef("HTMLLinkElement")}} |
| 仕様書 | 状態 | 備考 |
|---|---|---|
| {{SpecName("HTML WHATWG", "semantics.html#the-link-element", "<link>")}} | {{Spec2("HTML WHATWG")}} | 最新のスナップショットから変更なし。 |
| {{SpecName("HTML5 W3C", "document-metadata.html#the-link-element", "<link>")}} | {{Spec2("HTML5 W3C")}} | crossorigin 属性および sizes 属性を追加。media の値をすべてのメディアクエリーに拡張。rel に多くの新たな値を追加。 |
| {{SpecName("HTML4.01", "struct/links.html#h-12.3", "<link>")}} | {{Spec2('HTML4.01')}} |
{{Compat("html.elements.link", 3)}}