aタグ(a要素)とは、href 属性に書いた行き先へ移動できる「リンク」を作るHTMLのタグです。 行き先には、別のページのURLだけでなく、同じページ内の位置(#id名)、メールアドレス(mailto:)、電話番号(tel:)、ダウンロードさせたいファイルも指定できます。

この記事では、用途別にそのままコピペできる書き方を先にまとめ、そのあとで「target="_blank" に rel="noopener" は必要か」「固定ヘッダーで見出しが隠れるときはどうするか」といった判断に迷いやすい点を、Chromium 141 で実際に動かした結果と HTML 仕様の記述をもとに整理します。rel 属性の値の早見表、検証ツールが出すメッセージの原文も載せました。

aタグのリンクの早見表

やりたいことから書き方を選べます。

やりたいこと 書き方
同じサイトの別ページへ <a href="/about/">このサイトについて</a>
外部サイトへ <a href="https://example.com/">公式サイト</a>
別タブで開く <a href="https://example.com/" target="_blank">公式サイト</a>
別タブで開き、参照元も渡さない <a href="https://example.com/" target="_blank" rel="noreferrer">公式サイト</a>
同じページ内の位置へ <a href="#price">料金へ</a> と <h2 id="price">料金</h2>
別ページの特定の位置へ <a href="/guide/#price">ガイドの料金へ</a>
ページの先頭へ戻る <a href="#top">ページの先頭へ</a>
メールソフトを開く <a href="mailto:info@example.com">メールで問い合わせる</a>
件名つきでメールソフトを開く <a href="mailto:info@example.com?subject=Hello">メール</a>(日本語は後述の変換が必要)
電話をかける <a href="tel:+81312345678">03-1234-5678</a>
ファイルをダウンロードさせる <a href="/files/report.csv" download>CSVをダウンロード</a>
名前を付けてダウンロードさせる <a href="/files/report.csv" download="list-2026-10.csv">CSVをダウンロード</a>
広告・有料のリンク <a href="https://example.com/" rel="sponsored">商品ページ</a>
投稿欄などユーザーが書いたリンク <a href="https://example.com/" rel="ugc">リンク</a>

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「HTML aタグのリンクの書き方|target=_blank・ページ内リンク」

aタグの基本の書き方

リンクは「開始タグ+リンクの文字+終了タグ」で書き、行き先を href 属性に入れます。

<a href="https://example.com/">公式サイトを見る</a>
部分 役割
<a ...> と </a> ここからここまでがリンク、という範囲
href="..." 行き先(URL、ページ内の位置、mailto など)
タグにはさまれた文字 画面に出るリンクの文字(リンクテキスト)

よく使う属性の一覧

属性 意味 主な値
href 行き先 URL、#id名、mailto:、tel:
target どこで開くか _self(同じタブ・既定)、_blank(新しいタブ)、_parent、_top
rel リンク先との関係 noopener、noreferrer、nofollow、sponsored、ugc など
download ダウンロードとして扱う 値なし、または保存するファイル名
hreflang リンク先の言語 en、ja など
type リンク先の種類の手がかり application/pdf など
referrerpolicy 参照元をどこまで送るか no-referrer、origin など

絶対URLと相対URLの書き分け

href には、https:// から始まる絶対URLのほか、いまのページを基準にした相対URLも書けます。いまのページが https://example.com/dir/a.html のとき、それぞれの書き方がどのURLになるかを、ブラウザと同じ規則で動く Node.js 22 の URL で確かめました。

href の書き方 行き先 使いどころ
b.html https://example.com/dir/b.html 同じフォルダのページ
./img/c.png https://example.com/dir/img/c.png 同じフォルダからたどる
../about/#access https://example.com/about/#access 1つ上のフォルダからたどる
/top https://example.com/top サイトの先頭(ルート)からたどる
#price https://example.com/dir/a.html#price 同じページ内の位置
?page=2#list https://example.com/dir/a.html?page=2#list 同じページのパラメータ違い
//cdn.example.com/x https://cdn.example.com/x いまのページと同じ http/https を引き継ぐ

サイト内のリンクは / から始める書き方にそろえると、ページをフォルダごと移動してもリンクが切れにくくなります。 外部サイトへは https:// から始まる絶対URLで書きます。

外部リンクと別タブで開くリンクの書き方

外部リンク

<a href="https://example.com/">公式サイト</a>

外部サイトへのリンクは、これだけで完成です。同じタブで開くので、読者はブラウザの「戻る」で元のページに戻れます。

別タブで開く target=_blank

<a href="https://example.com/" target="_blank">公式サイト</a>

target="_blank" を付けると、新しいタブ(設定によっては新しいウィンドウ)で開きます。

target の値 開く場所
_self いまのタブ(書かないときと同じ)
_blank 新しいタブ
_parent 1つ外側のフレーム(iframe の中から使う)
_top いちばん外側のウィンドウ(iframe の中から使う)
任意の名前(例:help) その名前のタブ。すでに開いていれば同じタブを使い回す

別タブで開くかどうかは、読者が自分で選べる状態が基本です(Ctrl や Command を押しながらクリックすると、どのリンクも別タブで開けます)。入力中のフォームから規約を確認するリンク、PDF、作業の途中で参照するヘルプなど、「いまのページを閉じたくない」場面に絞って使うと親切です。別タブで開くことをリンクの文字で伝える書き方も紹介します。

<a href="https://example.com/terms.pdf" target="_blank">
  利用規約(PDF・新しいタブで開きます)
</a>

target=_blank に rel=noopener は必要か

結論から書くと、現行のブラウザでは target="_blank" だけで noopener と同じ動きになるため、新しく書くリンクに rel="noopener" を足さなくても同じ結果になります。

noopener が生まれた背景

以前は、別タブで開いたページ側の JavaScript から window.opener を通じて、リンク元のタブを操作できました(たとえばリンク元を別のURLへ移動させる、といった操作です)。これを防ぐために、リンク元とのつながりを切る rel="noopener" を付ける書き方が広まりました。

その後、HTML 仕様そのものが改められました。仕様(WHATWG HTML Standard の Links の章)を今回開いて確認したところ、次の内容が書かれています。

  • リンクの rel に opener が含まれず、target が _blank のときは、noopener として扱う
  • noreferrer は、Referer ヘッダーを送らないことに加えて、noopener と同じ効果を持つ
  • opener は、あえてリンク元とのつながりを残したいときに書くキーワード

MDN の rel="noopener" のページにも、a・area・form で target="_blank" を指定すると rel="noopener" と同じ動作になる、という注記がありました。

Chromium 141 で実測した結果

リンク元(http://127.0.0.1:8150/index.html)から、別のオリジン(http://localhost:8151/dest.html)を別タブで開き、開いた先で window.opener と document.referrer を調べました。Playwright 1.56.0 と Chromium 141.0.7390.37 での結果です。

リンクの書き方 開いた先の window.opener 開いた先の document.referrer
target="_blank" のみ null http://127.0.0.1:8150/
target="_blank" rel="noopener" null http://127.0.0.1:8150/
target="_blank" rel="noreferrer" null (空)
target="_blank" rel="noopener noreferrer" null (空)
target="_blank" rel="opener" あり(リンク元を参照できる) http://127.0.0.1:8150/
target="_blank" rel="nofollow" null http://127.0.0.1:8150/
target="_blank" のみ(同じオリジンへ) null http://127.0.0.1:8150/index.html

target="_blank" だけの行と rel="noopener" を付けた行は、まったく同じ結果でした。違いが出るのは noreferrer(参照元が空になる)と opener(つながりが残る)です。

参照元については、別オリジンへはオリジン(http://127.0.0.1:8150/)だけ、同じオリジンへはページのURL全体が渡っています。これはブラウザの既定の参照元ポリシーによる動きで、別サイトへはパスやパラメータが渡らないようになっています。

書くかどうかの判断表

状況 おすすめの書き方 理由
新しく書くリンク target="_blank" のみ 現行ブラウザでは noopener と同じ動き
参照元を一切渡したくない target="_blank" rel="noreferrer" 参照元が空になり、noopener の効果も含む
かなり前のブラウザやアプリ内ブラウザも対象に含めたい target="_blank" rel="noopener" 書いてあっても動作は変わらず、対象が広がる
開いた先からリンク元を操作したい(自分で作った子ウィンドウなど) target="_blank" rel="opener" 明示したときだけつながりが残る
既存のリンクに rel="noopener noreferrer" が付いている そのままでよい 動作に影響はない。参照元の計測が必要なら noreferrer を外す

主要ブラウザがこの動きにそろったのは2021年ごろまで、というのが一般に知られた情報です(各ブラウザの対応バージョンは今回公式ページで確認していません)。CMS やリンターが自動で rel="noopener" を付ける場合は、そのままにしておいて差し支えありません。 付いていても付いていなくても、現行ブラウザでの動きは同じです。

一点だけ気を付けたいのは noreferrer です。これを付けると、リンク先のアクセス解析では「どこから来たか」がわからなくなります。自分のサイトどうしをつなぐリンクや、紹介元として記録されたいリンクでは、noreferrer を付けないほうが目的に合います。

rel属性の値の早見表

rel は「リンク先との関係」を表す属性で、複数の値を半角スペースで区切って並べられます。

値 意味 使う場面 誰に向けた指定か
noopener 開いた先からリンク元を操作できないようにする target="_blank" では既定でこの動き ブラウザ
noreferrer 参照元を送らない(noopener の効果も含む) 参照元を渡したくないリンク ブラウザ
opener 開いた先からリンク元を参照できるようにする 自分で作った子ウィンドウと連携する ブラウザ
nofollow リンク先を自分のサイトと関連付けたくない ほかに合う値がないとき 検索エンジン
sponsored 広告・有料のリンク 広告、提供を受けたリンク 検索エンジン
ugc ユーザーが作成した内容のリンク コメント欄、掲示板の投稿 検索エンジン
external 外部サイトへのリンクであることを示す CSS で外部リンクに印を付ける目印 主に制作者
author 著者のページへのリンク 記事の著者紹介 検索エンジン・ツール
license ライセンスの説明へのリンク 利用条件のページ 検索エンジン・ツール
prev / next 連続するページの前後 ページ送り ツール(Google 検索では使われない)

nofollow・sponsored・ugc の説明は、Google 検索セントラルの「Google に外部リンクの関係性を伝える」のページを今回開いて確認しました。同ページによると、広告や有料のリンクには sponsored が推奨され、複数の値はスペース区切り(rel="ugc nofollow")で組み合わせられます。 sponsored と ugc は HTML 仕様の表にはなく、検索エンジン向けに使われている値です。

<!-- 広告のリンクを別タブで開く -->
<a href="https://example.com/item/" target="_blank" rel="sponsored">商品ページを見る</a>

<!-- コメント欄に投稿されたリンク -->
<a href="https://example.com/" rel="ugc nofollow">投稿されたリンク</a>

ブラウザ向けの値(noopener・noreferrer・opener)と、検索エンジン向けの値(nofollow・sponsored・ugc)は目的が別なので、必要なら両方を並べて書けます。

ページ内リンクの書き方

ページ内リンクは、行き先の要素に id を付け、href に # と id 名を書きます。

<nav aria-label="このページの目次">
  <ul>
    <li><a href="#about">概要</a></li>
    <li><a href="#price">料金</a></li>
    <li><a href="#faq">よくある質問</a></li>
  </ul>
</nav>

<h2 id="about">概要</h2>
<p>…</p>

<h2 id="price">料金</h2>
<p>…</p>

<h2 id="faq">よくある質問</h2>
<p>…</p>
ポイント 内容
id はページ内で1つだけ 同じ id を2か所に付けると、最初の要素へ移動する
id に空白を入れない id="price list" ではなく id="price-list"
大文字と小文字は区別される #Price と id="price" は一致しない
行き先は見出しでなくてもよい 段落、section、表など、どの要素にも id を付けられる
a 要素の name 属性は使わない 以前の書き方。いまは id を使う

別ページの特定の位置へリンクする

URL の後ろに #id名 を続けます。

<a href="/guide/#price">ガイドページの「料金」へ</a>
<a href="https://example.com/guide/#faq">外部サイトの「よくある質問」へ</a>

リンク先のページに、その id を持つ要素があることが条件です。id が見つからない場合は、ページの先頭が表示されます。

ページの先頭へ戻るリンク

<a href="#top">ページの先頭へ</a>

#top は、同じ名前の id を持つ要素がなくてもページの先頭へ移動する、という HTML 仕様の決まりがあります(一般に知られた仕様で、今回は該当箇所を開いていません)。href="#" でも先頭へ移動します。

なめらかにスクロールさせる

CSS を1行足すと、ページ内リンクの移動がなめらかになります。動きを減らす設定にしている人には、すぐ移動する形に戻しておくと親切です。

html {
  scroll-behavior: smooth;
}

@media (prefers-reduced-motion: reduce) {
  html {
    scroll-behavior: auto;
  }
}

固定ヘッダーで見出しが隠れるときは scroll-margin-top

画面の上部にヘッダーを固定(position: fixed や sticky)していると、ページ内リンクで移動した先の見出しがヘッダーの下に隠れることがあります。移動先の要素に scroll-margin-top を指定すると、その分だけ余白を空けて止まります。

直す前

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>ページ内リンクと固定ヘッダー</title>
  <style>
    body { margin: 0; }
    .site-header {
      position: fixed; top: 0; left: 0; right: 0;
      height: 64px; background: #223; color: #fff;
    }
    main { padding-top: 64px; }
    section { min-height: 1200px; }
  </style>
</head>
<body>
  <header class="site-header">
    <a href="#price">料金</a>
    <a href="#faq">よくある質問</a>
  </header>
  <main>
    <section><h2 id="about">概要</h2></section>
    <section><h2 id="price">料金</h2></section>
    <section><h2 id="faq">よくある質問</h2></section>
  </main>
</body>
</html>

直した後

style の中に、次の1行を足します。

h2[id] { scroll-margin-top: 80px; }

ヘッダーの高さ 64px に、少しゆとりを足して 80px にしています。

実測した結果

幅800px・高さ600pxの画面で「料金」のリンクをクリックし、移動後の見出しの上端の位置(画面の上端からの距離)を測りました。

指定 クリック後の見出しの位置 別ページから #faq 付きで開いたとき 見え方
指定なし 0px 0px 高さ64pxのヘッダーの下に隠れる
h2[id] { scroll-margin-top: 80px; } 80px 80px ヘッダーの下に16pxの余白を空けて見える
html { scroll-padding-top: 80px; } 80px 80px 同上

クリックしたときも、別ページから #faq 付きのURLで開いたときも、同じように効きます。

scroll-margin-top と scroll-padding-top の使い分け

プロパティ 指定する場所 向いている場面
scroll-margin-top 移動先の要素(見出しなど) 要素ごとに余白を変えたい。一部の見出しだけ調整したい
scroll-padding-top スクロールする側(html など) ページ全体で一律に空けたい。1か所の指定で済ませたい

ヘッダーの高さを CSS 変数にしておくと、高さを変えたときに1か所の修正で済みます。

:root {
  --header-height: 64px;
}
.site-header {
  position: fixed; top: 0; left: 0; right: 0;
  height: var(--header-height);
}
html {
  scroll-padding-top: calc(var(--header-height) + 16px);
}

id を付けたすべての要素に効かせたい場合は、:target { scroll-margin-top: 80px; } と書く方法もあります。:target は、URLの # 以降と id が一致した要素を表す疑似クラスで、今回の検証でもクリック後に :target が price の見出しを指していることを確認しました。

メールのリンク mailto の書き方

mailto: に続けてメールアドレスを書くと、クリックでメールソフトの新規作成画面が開きます。

<a href="mailto:info@example.com">メールで問い合わせる</a>

件名・本文・CC を付ける

アドレスの後ろに ? を付け、名前=値 を & でつないで指定します。

指定 書き方
件名 ?subject=...
本文 ?body=...
CC ?cc=cc@example.com
BCC ?bcc=bcc@example.com
宛先を複数 mailto:a@example.com,b@example.com
本文の改行 %0D%0A
半角スペース %20
& という文字そのもの %26
? という文字そのもの %3F
<a href="mailto:info@example.com?subject=Hello%20World&body=Line1%0D%0ALine2">
  メールを書く
</a>

日本語の件名と本文を付ける

日本語や記号は、パーセントエンコード(%E5%82%99… のような形)に変換して書きます。 変換は JavaScript の encodeURIComponent でできます。Node.js 22 での実行例です。

const to = 'info@example.com';
const subject = '備品の貸し出しについて';
const body = 'お世話になっております。\r\n以下の備品を借りたいです。\r\n・モニター 1台';

const href = 'mailto:' + to
  + '?subject=' + encodeURIComponent(subject)
  + '&body=' + encodeURIComponent(body);
console.log(href);

実行結果です。

mailto:info@example.com?subject=%E5%82%99%E5%93%81%E3%81%AE%E8%B2%B8%E3%81%97%E5%87%BA%E3%81%97%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6&body=%E3%81%8A%E4%B8%96%E8%A9%B1%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%A6%E3%81%8A%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82%0D%0A%E4%BB%A5%E4%B8%8B%E3%81%AE%E5%82%99%E5%93%81%E3%82%92%E5%80%9F%E3%82%8A%E3%81%9F%E3%81%84%E3%81%A7%E3%81%99%E3%80%82%0D%0A%E3%83%BB%E3%83%A2%E3%83%8B%E3%82%BF%E3%83%BC%201%E5%8F%B0

出力された文字列を、そのまま href に貼り付けます。

<a href="mailto:info@example.com?subject=%E5%82%99%E5%93%81%E3%81%AE%E8%B2%B8%E3%81%97%E5%87%BA%E3%81%97%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6&amp;body=%E3%81%8A%E4%B8%96%E8%A9%B1%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%A6%E3%81%8A%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82%0D%0A%E4%BB%A5%E4%B8%8B%E3%81%AE%E5%82%99%E5%93%81%E3%82%92%E5%80%9F%E3%82%8A%E3%81%9F%E3%81%84%E3%81%A7%E3%81%99%E3%80%82%0D%0A%E3%83%BB%E3%83%A2%E3%83%8B%E3%82%BF%E3%83%BC%201%E5%8F%B0">
  備品の貸し出しをメールで申し込む
</a>

HTML の属性の中では、& を &amp; と書くのが正式な書き方です(上の例の &amp;body=)。変換の様子を表にすると次のとおりです。

元の文字 変換後
見積もりの相談 %E8%A6%8B%E7%A9%8D%E3%82%82%E3%82%8A%E3%81%AE%E7%9B%B8%E8%AB%87
A&B 見積もり? A%26B%20%E8%A6%8B%E7%A9%8D%E3%82%82%E3%82%8A%3F
改行(\r\n) %0D%0A

mailto のリンクが実際にメールソフトでどう開くかは、端末の設定やメールソフトによって変わります。今回はメールソフトでの表示確認はしていません(未実行)。メールソフトを設定していない読者もいるので、リンクの文字や近くにメールアドレスそのものも書いておくと、コピーして使ってもらえます。

電話番号のリンク tel の書き方

tel: に続けて電話番号を書くと、スマートフォンではタップで発信画面が開きます。

<a href="tel:+81312345678">03-1234-5678</a>
ポイント 内容
href は国番号つきが確実 日本は +81。市外局番の先頭の 0 を取って続ける(03-1234-5678 は +81312345678)
画面に出す文字は読みやすい形で ハイフン入りの 03-1234-5678 のままでよい
href にハイフンを入れてもよい tel:+81-3-1234-5678 も使える
国内だけが対象なら tel:0312345678 の形も広く使われている

パソコンでは、通話アプリが設定されていない場合にクリックしても何も起きないことがあります。スマートフォンの幅のときだけリンクとして見せ、パソコンでは文字として見せる CSS の例です。

/* 画面幅が広いときは、電話リンクを文字として扱う */
@media (min-width: 768px) {
  a[href^="tel:"] {
    pointer-events: none;
    color: inherit;
    text-decoration: none;
  }
}

tel のリンクが各端末でどう開くかは、今回は実機で確認していません(未実行)。

ファイルをダウンロードさせる download 属性の書き方

download 属性を付けると、リンク先をページとして開く代わりに、ファイルとして保存する動きになります。

<!-- 元のファイル名のまま保存 -->
<a href="/files/report.csv" download>CSVをダウンロード</a>

<!-- 名前を変えて保存 -->
<a href="/files/report.csv" download="list-2026-10.csv">CSVをダウンロード</a>

<!-- 種類とサイズを添えると親切 -->
<a href="/files/manual.pdf" download>利用マニュアル(PDF・1.2MB)</a>

Chromium 141 で実測した結果

同じオリジンと別オリジンのファイルで、download 属性の効き方を確かめました(Playwright 1.56.0 のヘッドレス実行で、保存時に提案されたファイル名を取得)。

リンクの書き方 結果
同じオリジンの CSV に download report.csv として保存
同じオリジンの CSV に download="bihin-list-2026-10.csv" bihin-list-2026-10.csv として保存
同じオリジンの HTML に download="saved.html" saved.html として保存(ページ移動なし)
別オリジンの CSV に download="renamed.csv" 保存はされたが、名前は report.csv のまま
別オリジンの HTML に download="saved.html" 保存されず、そのページへ移動した
同じオリジンの CSV に download="備品一覧.csv" この検証環境では download という名前で保存

ここから読み取れるポイントは次の3つです。

  • download 属性が確実に効くのは、同じオリジンのファイルです。別オリジンでは、ファイル名の指定は反映されず、ブラウザが表示できる種類(HTML など)はふつうのリンクと同じようにページ移動になりました
  • 別オリジンのファイルを確実に保存させたい場合は、配信するサーバー側で Content-Disposition: attachment ヘッダーを付ける方法が使えます(今回この方法は未実行です)
  • 日本語のファイル名は、今回のヘッドレス環境では反映されませんでした。通常の画面つきブラウザでの動きは確認していないため、確実さを優先するなら半角英数字とハイフンのファイル名にしておくと安心です

リンクの文字と中身の書き方

リンクの文字は行き先がわかる言葉にする

読み上げソフトには、ページ内のリンクだけを一覧で読み上げる機能があります。そのとき「こちら」「詳しくはこちら」が並ぶと、行き先の区別がつきません。

書き方 伝わり方
料金の詳細は<a href="/price/">こちら</a> リンクだけ読むと「こちら」
<a href="/price/">料金の詳細を見る</a> リンクだけ読んでも行き先がわかる

リンクの文字だけで行き先がわかる形にすると、検索エンジンにも読者にも内容が伝わりやすくなります。

画像をリンクにする

<a href="/items/pothos/">
  <img src="/img/pothos.jpg" alt="ポトスの商品ページへ" width="300" height="200">
</a>

画像だけをリンクにするときは、alt がリンクの文字の代わりになります。alt が空だと、行き先が伝わらないリンクになるので、行き先を表す言葉を入れます。

カード全体をリンクにする

a 要素の中には、見出しや段落、div を入れられます。カード全体をクリックできるようにする書き方です。

<a href="/articles/water/" class="card">
  <div>
    <h3>観葉植物の水やりの基本</h3>
    <p>土の表面が乾いてから与えます。</p>
  </div>
</a>

一方で、a の中に別の a や button など、クリックできる要素は入れられません。

検証ツールで確かめたエラーの例

つまずきやすい書き方をまとめた HTML を、Nu Html Checker(vnu.jar 26.10.2)にかけました。

<a href="/a/"><a href="/b/">入れ子のリンク</a></a>
<a href="/c/"><button type="button">ボタン入りリンク</button></a>
<a href="/d/" target="_blank" rel="noopner">relのつづり違い</a>
<a href="my page.html">空白を含むURL</a>
<a target="_blank">hrefなしでtarget</a>
<a href="/e/"><div><h2>カード全体をリンクにする</h2><p>説明文</p></div></a>
<a href="#a" name="top">name属性</a>

実行結果です(a 要素に関する行を抜粋。行番号は検証に使ったファイルでの位置)。

"bad.html":3.15-3.28: error: Start tag “a” seen but an element of the same type was already open.
"bad.html":3.40-3.43: error: Stray end tag “a”.
"bad.html":4.15-4.36: error: The element “button” must not appear as a descendant of the “a” element.
"bad.html":5.1-5.44: info: Potentially bad value “noopner” for attribute “rel” on element “a” Typo for “noopener”?
"bad.html":6.1-6.23: error: Bad value “my page.html” for attribute “href” on element “a”: Illegal character in path segment. Space is not allowed.
"bad.html":7.1-7.19: error: Element “a” is missing required attribute “href”.
"bad.html":9.1-9.24: info warning: The “name” attribute on the “a” element is obsolete. Consider putting an “id” attribute on the nearest container instead.
書き方 メッセージの意味 直し方
a の中に a すでに a が開いているのに、もう一度 a が始まった リンクを並べる。カード全体をリンクにするなら内側のリンクを外す
a の中に button button は a の中に置けない どちらか一方にする。移動なら a、操作なら button
rel="noopner" つづりの候補を教えてくれる noopener に直す
href="my page.html" URL に空白は書けない ファイル名から空白をなくす、または my%20page.html
href なしで target target を使うなら href が必要 href を書く
div や見出しを a で囲む メッセージなし(正しい書き方) そのままでよい
name="top" name は以前の書き方 近くの要素に id を付ける

リンクが思ったとおりに動かないときの確認表

症状 よくある原因 確かめ方・直し方
クリックしても移動しない href がない、または空 href の値を確認する
ページ内リンクで移動しない id のつづり違い、大文字と小文字の違い # の後ろと id を見比べる
移動先の見出しがヘッダーに隠れる 固定ヘッダーの高さ分だけ重なる scroll-margin-top または scroll-padding-top を指定
相対URLのリンクが 404 になる 基準のフォルダが想定と違う / から始める書き方にそろえる
外部リンクが自分のサイト内のURLになる https:// を書き忘れている(href="example.com") https:// から書く
download で保存されずページが開く 別オリジンのファイル 同じオリジンに置く、またはサーバー側でヘッダーを付ける
mailto の件名が途中で切れる 空白や & を変換していない encodeURIComponent で変換する
リンクの範囲が広がって見える 終了タグ </a> の書き忘れ 検証ツールにかける

よくある質問

Q. target="_blank" には必ず rel="noopener noreferrer" を付けるべきですか? A. 現行のブラウザでは、target="_blank" だけで noopener と同じ動きになります。今回の Chromium 141 での実測でも、付けた場合と付けない場合で window.opener はどちらも null でした。付けたままでも動作に影響はありません。noreferrer は参照元を送らなくする指定なので、リンク先に「どこから来たか」を伝えたい場合は外します。

Q. nofollow と sponsored と ugc はどう使い分けますか? A. 広告や有料のリンクは sponsored、コメント欄などユーザーが書いたリンクは ugc、どちらにも当てはまらないが関連付けたくないリンクは nofollow です。rel="ugc nofollow" のように組み合わせることもできます。通常の参考リンクには、どれも付けなくて問題ありません。

Q. ページ内リンクの行き先は name 属性と id 属性のどちらで作りますか? A. id 属性です。a 要素の name 属性は以前の書き方で、検証ツールでも id を使うよう案内されます。見出しや section など、移動させたい要素に直接 id を付けます。

Q. scroll-margin-top と scroll-padding-top はどちらを使えばよいですか? A. ページ全体で同じ余白でよければ、html に scroll-padding-top を1か所指定するのが手軽です。見出しの種類によって余白を変えたい場合は、要素ごとに scroll-margin-top を指定します。今回の実測では、どちらも同じ位置(80px)で止まりました。

まとめ

  • リンクは href に行き先を書く。URL のほか、#id名・mailto:・tel: も指定できる
  • target="_blank" だけで noopener と同じ動きになる(HTML 仕様の記述と Chromium 141 の実測で確認)。参照元も渡したくないときは rel="noreferrer"
  • rel の値は目的で選ぶ:ブラウザ向けの noopener・noreferrer・opener、検索エンジン向けの nofollow・sponsored・ugc
  • ページ内リンクは id と #id名 の組み合わせ。別ページの特定位置へは URL#id名
  • 固定ヘッダーで見出しが隠れるときは scroll-margin-top(または html に scroll-padding-top)で余白を空ける
  • mailto の日本語は encodeURIComponent で変換し、改行は %0D%0A
  • download 属性が確実に効くのは同じオリジンのファイル。ファイル名は半角英数字が安心

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「HTML aタグのリンクの書き方|target=_blank・ページ内リンク」

株式会社RJCでは、aタグのリンクの書き方のようなHTMLの基礎を仲間と学び合っています。こうした知識を共有しながら、日々技術を磨いています。

株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。

WE ARE HIRING

RJCで一緒に開発しながら、
成長を楽しみませんか?

RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!

  • 127日年間休日
  • 12時間平均残業時間
  • 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!

ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ

RJCで一緒に開発しながら、 成長を楽しみませんか?