MENU

相対パスと絶対パスの違いを実務で理解する。画像・CSS・リンク指定で迷わない書き方

相対パスと絶対パスの違いを実務で理解する。画像・CSS・リンク指定で迷わない書き方

Web制作でパス指定に迷ったら、先に結論だけ押さえるのが早いです。同じサイト内でファイルの位置関係に合わせて書くのが相対パス、ドメイン名まで含めて場所を完全に書くのが絶対パスです。

そして実務でつまずきやすいポイントはもう1つあります。HTMLの画像やリンクは「そのHTML文書」を基準に解決されますが、CSSの url()HTMLではなく、そのCSSファイル自身の場所を基準に解決されます。ここを取り違えると、画像だけ表示されない、CSSだけ当たらない、リンク先がずれる、といった不具合が起きます。

  • 相対パス: 今いるファイルから見た位置で書く
  • ルート相対パス: ドメイン直下を起点に / から書く
  • 絶対パス: https://example.com/... のように完全なURLで書く
  • 画像、CSS、リンクで基準が同じとは限らない
  • CSSの url() はスタイルシートの場所基準なので特に注意

ここがポイント: 迷ったら「このパスは、どのファイルを基準に解決されるのか」を先に確認すると崩れにくくなります。

目次

相対パスと絶対パスの違い

まずは定義を短く整理します。

相対パス

相対パスは、現在のファイルから見た位置関係で指定する書き方です。

<img src="images/logo.png" alt="ロゴ">
<a href="contact.html">お問い合わせ</a>
<link rel="stylesheet" href="css/style.css">

たとえば現在のHTMLが /company/about/index.html にあり、images/logo.png と書いた場合は、同じ階層から見た /company/about/images/logo.png を探します。

よく使う書き方は次の3つです。

  • photo.jpg または ./photo.jpg: 同じ階層
  • ../photo.jpg: 1つ上の階層
  • ../../photo.jpg: 2つ上の階層

ルート相対パス

/ で始める書き方は、現在のファイルではなくサイトのルートを基準にします。

<img src="/assets/images/logo.png" alt="ロゴ">
<a href="/support/faq/">FAQ</a>

https://example.com/company/about/index.html にいても、/assets/images/logo.pnghttps://example.com/assets/images/logo.png を指します。

絶対パス

絶対パスは、ドメイン名やスキームまで含めて完全に書くURLです。

<img src="https://example.com/assets/images/logo.png" alt="ロゴ">
<a href="https://example.com/support/faq/">FAQ</a>

外部サイトへのリンクや、参照先を明示したい場面で向いています。

まず押さえたい前提

このテーマで混乱しやすいのは、「相対パスはいつも同じ基準で解決される」と思い込みやすい点です。実際には、どの記述場所に書いたかで基準が変わります。

  • HTMLの img srca href は、その文書のベースURLを基準に解決される
  • HTMLの <base> を使うと、相対URLの基準を変更できる
  • CSSの url() は、そのCSSファイルのURLを基準に解決される

MDNでも、相対参照はベースURLに対して解決され、/ はサイトルート基準、../ は親ディレクトリ基準になると説明されています。また、CSSの相対URLはHTMLではなくスタイルシートのURL基準です。

ディレクトリ構成で見ると理解しやすい

次のような構成を前提にすると、違いが見えやすくなります。

project/
├─ index.html
├─ about/
│  └─ team.html
├─ assets/
│  ├─ css/
│  │  └─ style.css
│  └─ images/
│     └─ logo.png
└─ contact.html

about/team.html から見た指定例はこうなります。

<img src="../assets/images/logo.png" alt="ロゴ">
<a href="../contact.html">お問い合わせ</a>
<link rel="stylesheet" href="../assets/css/style.css">

解決後のイメージ:

  • ../assets/images/logo.png/assets/images/logo.png
  • ../contact.html/contact.html
  • ../assets/css/style.css/assets/css/style.css

一方で、同じ場所からルート相対で書くならこうです。

<img src="/assets/images/logo.png" alt="ロゴ">
<a href="/contact.html">お問い合わせ</a>
<link rel="stylesheet" href="/assets/css/style.css">

ページの階層が変わっても同じ指定を流用しやすいのが利点です。

画像・CSS・リンクでの書き方

ここが実務で最も使う部分です。

画像を指定する場合

<img>src には相対URLも絶対URLも使えます。

<img src="../assets/images/logo.png" alt="ロゴ">
<img src="/assets/images/logo.png" alt="ロゴ">
<img src="https://example.com/assets/images/logo.png" alt="ロゴ">

使い分けの目安:

  • 同じサイト内で完結する: 相対パスまたはルート相対パス
  • 外部CDNの画像を使う: 絶対パス
  • HTMLファイルの置き場所が頻繁に変わる: ルート相対パスが管理しやすい

CSSファイルを読み込む場合

HTMLからCSSを読む link href は、HTML文書を基準に考えます。

<link rel="stylesheet" href="../assets/css/style.css">

ただし、その style.css の中で画像を指定すると、今度はCSSファイルの場所が基準です。

/* /assets/css/style.css に書かれている場合 */
.hero {
  background-image: url("../images/logo.png");
}

この ../images/logo.png は、HTMLではなく /assets/css/ から見て1つ上の /assets/ に戻り、/assets/images/logo.png を探します。

HTML基準で考えて images/logo.png と書くと、期待した場所に届かないのが典型的なミスです。

リンクを指定する場合

<a href> も相対、ルート相対、絶対のどれでも書けます。

<a href="../contact.html">相対パスのリンク</a>
<a href="/contact.html">ルート相対のリンク</a>
<a href="https://example.com/contact.html">絶対パスのリンク</a>

社内サイトや静的サイトでページ構造がはっきりしているなら、内部リンクは相対かルート相対で十分な場面が多いです。外部サイトへ飛ばすなら絶対パスが自然です。

よくあるNG例と改善例

抽象的に覚えるより、失敗例で見る方が実務では役に立ちます。

NG例1: CSSの画像パスをHTML基準で書いてしまう

NG:

<!-- /about/team.html -->
<link rel="stylesheet" href="../assets/css/style.css">
/* /assets/css/style.css */
.hero {
  background-image: url("images/logo.png");
}

この場合、CSSは /assets/css/images/logo.png を探します。画像が /assets/images/logo.png にあるなら不一致です。

改善:

.hero {
  background-image: url("../images/logo.png");
}

NG例2: ページを移動したら相対リンクが全部ずれる

NG:

<a href="contact.html">お問い合わせ</a>

index.html では正しくても、about/team.html に同じ記述を移すと /about/contact.html を探してしまいます。

改善:

<a href="/contact.html">お問い合わせ</a>

ページをまたいで共通部品として使うなら、ルート相対の方が崩れにくい場面があります。

NG例3: / 始まりをどこでも安全だと思う

ルート相対は便利ですが、配信先が必ずドメイン直下とは限りません。たとえばサイト全体が https://example.com/docs/ 配下で公開されているのに、/assets/style.css と書くと、https://example.com/assets/style.css を見に行きます。

改善の考え方:

  • ドメイン直下で運用するサイト: ルート相対が使いやすい
  • サブディレクトリ配下でも配布する: 相対パスの方が移植しやすい

JavaScriptで解決結果を確認する方法

パスの解決結果が不安なら、URL コンストラクタで確認すると早いです。

const base = "https://example.com/about/team/";

console.log(new URL("../images/logo.png", base).href);
// https://example.com/about/images/logo.png

console.log(new URL("/assets/logo.png", base).href);
// https://example.com/assets/logo.png

console.log(new URL("https://cdn.example.com/logo.png", base).href);
// https://cdn.example.com/logo.png

文字列を単純連結しているのではなく、URLのルールに沿って解決される点が重要です。..// の挙動を確認したいときに便利です。

実務での使い分け

現場では「どちらが正しいか」より、「どの運用に向くか」で決める方が失敗しません。

相対パスが向く場面

  • テンプレートや静的ファイルを別ディレクトリへまとめて移しやすくしたい
  • サブディレクトリ配下で公開する可能性がある
  • ローカル確認、本番配信、ステージングでドメインが変わる

ルート相対パスが向く場面

  • サイト内の共通ヘッダーや共通ナビで、どの階層でも同じ記述を使いたい
  • サイトが常にドメイン直下で公開される
  • 内部リンクや共通アセットの見通しを良くしたい

絶対パスが向く場面

  • 外部サイトへリンクする
  • CDNや別ドメインの画像、API、フォントを参照する
  • 参照先を完全に明示したい

迷ったときの判断フロー

短く整理すると、判断基準は次の順です。

  1. 外部サイトや別ドメインを指すか
  2. 同じサイト内なら、公開場所がドメイン直下で固定か
  3. その記述はHTML内か、CSS内か
  4. 共通部品として複数階層で再利用するか

この4点を先に見るだけで、かなりのミスを避けられます。

まとめ

相対パスと絶対パスの違いは単純ですが、どのファイルを基準に解決するかを外すと一気に混乱します。特に、HTMLの srchref は文書基準、CSSの url() はCSSファイル基準、という違いは早めに体で覚えた方が実務で効きます。

最後に確認するなら次の3点です。

  • そのパスはHTML基準か、CSS基準か
  • サイト内運用には相対かルート相対のどちらが保守しやすいか
  • 配信先がサブディレクトリ配下でも壊れないか

ファイルを移動したときに壊れるリンクや画像は、たいていこの3点のどこかに原因があります。新しく書くときだけでなく、既存サイトの修正時にもここを先に見直すと手戻りが減ります。

参照リンク

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次