ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
Vue Router のデフォルト挙動
Vue Router を使ったプロジェクトでは <router-link> が現在ルートにマッチした要素に自動でクラスを付与します:
router-link-active— そのリンク先 (またはサブパス) にいる場合router-link-exact-active— そのリンク先と完全一致している場合
最小構成
<!-- App.vue -->
<template>
<nav>
<router-link to="/">トップ</router-link>
<router-link to="/about">About</router-link>
<router-link to="/products">商品一覧</router-link>
<router-link to="/contact">お問合せ</router-link>
</nav>
<router-view />
</template>
<style>
nav a {
color: #64748b;
text-decoration: none;
padding: 8px 16px;
}
/* 現在ページのハイライト */
nav a.router-link-active {
color: #f4c430;
font-weight: bold;
border-bottom: 2px solid #f4c430;
}
/* 完全一致 (/ にいるときのトップだけ) */
nav a.router-link-exact-active {
background-color: #fffbea;
}
</style>
これだけで /about にいるときに "About" だけがハイライトされます。
active と exact-active の違い
| 現在 URL | リンク to="/" | リンク to="/products" |
|---|---|---|
/ | active + exact-active | - |
/products | active | active + exact-active |
/products/123 | active | active のみ (exact 不一致) |
つまり router-link-active は前方一致、router-link-exact-active は完全一致です。
クラス名のグローバル変更
// router/index.js (Vue Router 4)
import { createRouter, createWebHistory } from 'vue-router';
const router = createRouter({
history: createWebHistory(),
routes: [/* ... */],
linkActiveClass: 'is-active',
linkExactActiveClass: 'is-current',
});
export default router;/* CSS 側もこれで参照 */
nav a.is-active { color: #f4c430; }
nav a.is-current { background: #fffbea; }
リンク単位のカスタマイズ
<router-link to="/about" active-class="my-active" exact-active-class="my-exact">
About
</router-link>
computed + $route で完全制御
サブメニュー / ボタン / フッターなど <router-link> 以外の要素でハイライトしたい場合:
<template>
<nav>
<button
:class="{ active: isActive('/') }"
@click="$router.push('/')"
>トップ</button>
<button
:class="{ active: isActive('/about') }"
@click="$router.push('/about')"
>About</button>
<button
:class="{ active: isActive('/products') }"
@click="$router.push('/products')"
>商品</button>
</nav>
</template>
<script setup>
import { computed } from 'vue';
import { useRoute } from 'vue-router';
const route = useRoute();
function isActive(path) {
return route.path === path
|| route.path.startsWith(path + '/');
}
</script>
<style scoped>
button.active {
color: #f4c430;
font-weight: bold;
}
</style>
ネストルートでの挙動
子ルートにいるとき親リンクも active になります:
// routes
{
path: '/products',
component: ProductsLayout,
children: [
{ path: '', component: ProductsIndex },
{ path: ':id', component: ProductDetail },
],
}
// /products/123 にいるとき
// <router-link to="/products"> は router-link-active が付く (前方一致)
// <router-link to="/products/123"> は exact-active も付く
動的なルートに対する判定
<template>
<ul>
<li v-for="cat in categories" :key="cat.id">
<router-link :to="`/category/${cat.slug}`">
{{ cat.name }}
</router-link>
</li>
</ul>
</template>
<script setup>
import { computed } from 'vue';
import { useRoute } from 'vue-router';
const route = useRoute();
const currentSlug = computed(() => route.params.slug);
</script>
Nuxt 3 の場合
Nuxt 3 は <NuxtLink> が同等の動作をします。クラス名も同じ router-link-active / router-link-exact-active:
<template>
<nav>
<NuxtLink to="/">トップ</NuxtLink>
<NuxtLink to="/about">About</NuxtLink>
</nav>
</template>
<style>
.router-link-active { color: #f4c430; }
.router-link-exact-active { background: #fffbea; }
</style>
Nuxt 3.4+ では activeClass / exactActiveClass プロップで変更可能:
<NuxtLink to="/about" active-class="my-active">About</NuxtLink>
クエリパラメータ違いを区別したい
標準の active 判定はパスのみ。クエリも含めたい場合は手動:
<template>
<router-link
to="/search?cat=book"
:class="isActiveWithQuery('/search', { cat: 'book' }) ? 'active' : ''"
>書籍</router-link>
</template>
<script setup>
import { useRoute } from 'vue-router';
const route = useRoute();
function isActiveWithQuery(path, query) {
if (route.path !== path) return false;
return Object.entries(query).every(([k, v]) => route.query[k] === v);
}
</script>
CSS で表現の工夫
/* 下線で示す */
nav a.router-link-active {
position: relative;
}
nav a.router-link-active::after {
content: '';
position: absolute;
left: 0; right: 0; bottom: -2px;
height: 2px;
background: #f4c430;
}
/* バッジで示す */
nav a.router-link-exact-active::before {
content: '●';
color: #f4c430;
margin-right: 4px;
}
/* スムーズなトランジション */
nav a {
transition: color .2s, border-color .2s;
}
FAQ
Q: / リンクが全ページで active になる
A: 旧 Vue Router 3 の挙動。exact プロップを付けるか、Vue Router 4 にアップグレード (4 では exact-active が独立クラス化)。
Q: ハイライトが付かない
A: <router-link> が描画する <a> 要素にクラスが付く。CSS で nav a.router-link-active のようにセレクタを正しく指定。
Q: SSR / Hydration で初期表示時にハイライトが消える
A: Nuxt 3 / Vue Router 4 のサーバ側も useRoute() を解決するので問題なし。ハイライトが消える場合は CSS のスコープ問題を疑う。
Q: アンカーリンク (#section) もハイライトしたい
A: ハッシュは route.hash で取れる。:class="{ active: route.hash === "#section" }" で判定。
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
子ページはありません
- インストール(ファイルのダウンロード)
- npmを使用したプロジェクトの作成
- for 繰り返し処理
- ifの条件分岐とtemplateを用いたグループ化
- クリック時のイベント処理(on:click)
- modelとdata フォーム入力値とDOMへの即時反映
- computed(算出プロパティ)と使い方とdataとの違い
- ライフサイクルフック(created / mounted / updated / destroyedの使い方)
- $nextTickの使い方(ライフサイクルフック)
- メソッドの定義方法
- エラー一覧
- ルーティング設定
- aリンクの貼り方と動的URLの作成
- Mixinを利用した共通処理の記述方法
- v-bindによるデータ連携
- ヘッダー/フッターの共通コンポーネント
- ナビゲーションの現在ページをハイライトする方法
- 画面サイズの取得方法
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript base URL 取得方法|window.location.origin と SSR/Node.js 対応
- 4 YouTube Data API v3 エラー一覧|403/400/404 の主要原因と切り分け
- 5 Spring Frameworkのアノテーション一覧
- 6 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 7 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- IPv6とは|128bitアドレス・コロン16進表記/::省略・リンクローカル・SLAAC・デュアルスタック NEW 2026-06-22 12:34:44
- MAC アドレスフィルタリングの仕組みと限界 | ネットワーク入門 NEW 2026-06-22 12:19:10
- VPNとは|暗号トンネル・サイト間/リモートアクセス・IPsec/SSL-VPN/WireGuardを解説 NEW 2026-06-22 12:19:10
- WebSocket とは 全二重リアルタイム通信 ws/wss | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/2 とは 多重化・HPACK・バイナリフレーム | ネットワーク入門 NEW 2026-06-22 12:17:25
- Web通信プロトコル入門 HTTP/2・HTTP/3・WebSocket・gRPC・WebRTC | ネットワーク入門 NEW 2026-06-22 12:17:25
- gRPC とは HTTP/2 + Protocol Buffers の高速 RPC | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/3 (QUIC) とは UDP ベースの低遅延 Web 通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- WebRTC とは ブラウザ間 P2P の音声・映像・データ通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- 証明書と認証局(CA)とは|X.509・信頼チェーン・DV/OV/EV・失効(CRL/OCSP)を解説 NEW 2026-06-22 12:17:24
- ファイアウォールとは|パケットフィルタ・ステートフル・DMZ・次世代FW(L4/L7)を解説 NEW 2026-06-22 12:17:24
- iptables/nftablesとは|テーブル・チェーン・ルール例・永続化をLinux視点で解説 NEW 2026-06-22 12:17:24
- HAProxy とは frontend/backend と設定例 | ネットワーク入門 NEW 2026-06-22 12:17:24
- TLS/SSLの仕組み|ハンドシェイク・暗号スイート・前方秘匿性・証明書検証をわかりやすく解説 NEW 2026-06-22 12:17:24
- CDN とは エッジキャッシュ・TTL・Cloudflare/CloudFront | ネットワーク入門 NEW 2026-06-22 12:17:24
コメントを削除してもよろしいでしょうか?