レスポンシブデザインに対応したグローバルナビゲーションとは、画面サイズやデバイスの種類に応じて柔軟に形を変えるナビゲーションメニューのことです。
大きなディスプレイでは横並びのメニューとして表示され、ユーザーが一目で全体構造を把握できるように設計されます。
一方でスマートフォンやタブレットのような小さな画面では、ハンバーガーメニューやドロワー形式に切り替わり、限られたスペースでも操作できるよう工夫しますよね。
こうした仕組みによって、同じサイトをどの環境から閲覧しても一貫した操作性が保たれ、ユーザーは迷うことなく目的のページへアクセスできます。
レスポンシブ対応のグローバルナビゲーションは、現代のWebにおいて必須の要素といえるでしょう。
…と、ここまでは教科書的な一般論なんですけど。
当サイトの場合、グローバルナビゲーションはそのままスマホでも小さめに表示されるようにしてあり、ハンバーガーメニューやドロワー形式のメニューは別途用意してあります。
1つのサイトに複数のカテゴリーがあるので、常にメインのサイトマップが目につくようにしてあるのです。
普通のHTMLですから、特に難しいことはないです。
<nav class="den_nav">
<ul>
<li><a href="https://feinatelier.org/"><img src="/menu/mspass.webp" alt="このサイトのシンボルマーク" class="feinhome"></a></li>
<li><a href="/" class="animated-link">ホーム</a></li>
<li><a href="/another-eden/anaden_sitemap.html" class="animated-link">アナザーエデン</a></li>
<li><a href="/fish/fish_sitemap.html" class="animated-link">アウトドアのエリア</a></li>
<li><a href="/contents/site_create.html" class="animated-link">個人サイト制作</a></li>
<li><a href="/contents/protect.html" class="animated-link">AI学習を防ぐ工夫</a></li>
<li><a href="/contents/rss.html" class="animated-link">更新のお知らせ</a></li>
</ul>
</nav>
唯一言えることがあるとすれば、あんまりグローバルナビゲーションに多くの項目を付けないようにしていますね。
当サイトであれば、カテゴリー分けされたサイトマップ+α程度。
その他はすべて他のメニューに委ねています。
このCSSは「グローバルナビゲーション(上部メニュー)」の見た目と動きを作るためのものです。
主にリンクの下線アニメーション、半透明のナビ背景、ロゴのホバー効果、リストの横並びを実現しています。
基本の役割としては、次のような感じでしょうかね。
各ルールについて、ちょっと説明してみましょう。
疑似要素で装飾を追加するとHTMLを汚さずに表現できるんですよね。
transitionとtransformで自然なアニメーションを作るようにしてます。
ただ、backdrop-filterで背景をぼかす時にはブラウザの対応状況だけ確認したほうが良いかも。
そろそろコードに移りますか。
グローバルナビゲーションを構成するheader.css
/* ★グローバルナビゲーションを構成する */
.animated-link {
position: relative;
color: #e3f2fd;
font-weight: 500;
text-decoration: none;
transition: color 0.3s ease;
}
.animated-link:hover {
color: #ffffff;
}
.animated-link::after {
content: "";
position: absolute;
left: 0;
bottom: -3px;
width: 0%;
height: 2px;
background: linear-gradient(to right, #42a5f5, #80d8ff);
transition: width 0.3s ease;
}
.animated-link:hover::after {
width: 100%;
}
.den_nav {
background: linear-gradient(to bottom, rgba(173, 216, 230, 0.5), rgba(173, 216, 230, 0));
backdrop-filter: blur(12px);
-webkit-backdrop-filter: blur(12px);
padding: 12px 20px;
border-radius: 20px;
opacity: 0;
transform: translateY(-20px);
transition: opacity 0.8s ease, transform 0.8s ease;
}
.den_nav.visible {
opacity: 1;
transform: translateY(0);
}
.feinhome {
width: 45px;
transition: transform 0.3s ease, filter 0.3s ease;
}
.feinhome:hover {
transform: scale(1.1);
filter: drop-shadow(0 0 6px rgba(128, 216, 255, 0.6));
}
.den_nav ul {
list-style-type: none;
margin: 0;
padding: 0;
display: flex;
flex-wrap: wrap;
}
.den_nav ul li {
margin-right: 20px;
margin-bottom: 10px;
}
.den_nav ul li a {
color: #1A73E8;
}
.den_nav ul li a:hover {
color: #0078D4;
}
.animated-link {
position: relative;
color: #e3f2fd;
font-weight: 500;
text-decoration: none;
transition: color 0.3s ease;
}
.animated-link:hover {
color: #ffffff;
}
.animated-link::after {
content: "";
position: absolute;
left: 0;
bottom: -3px;
width: 0%;
height: 2px;
background: linear-gradient(to right, #42a5f5, #80d8ff);
transition: width 0.3s ease;
}
.animated-link:hover::after {
width: 100%;
}
.den_nav {
background: linear-gradient(to bottom, rgba(173, 216, 230, 0.5), rgba(173, 216, 230, 0));
backdrop-filter: blur(12px);
-webkit-backdrop-filter: blur(12px);
padding: 12px 20px;
border-radius: 20px;
opacity: 0;
transform: translateY(-20px);
transition: opacity 0.8s ease, transform 0.8s ease;
}
.den_nav.visible {
opacity: 1;
transform: translateY(0);
}
.feinhome {
width: 45px;
transition: transform 0.3s ease, filter 0.3s ease;
}
.feinhome:hover {
transform: scale(1.1);
filter: drop-shadow(0 0 6px rgba(128, 216, 255, 0.6));
}
.den_nav ul {
list-style-type: none;
margin: 0;
padding: 0;
display: flex;
flex-wrap: wrap;
}
.den_nav ul li {
margin-right: 20px;
margin-bottom: 10px;
}
.den_nav ul li a {
color: #1A73E8;
}
.den_nav ul li a:hover {
color: #0078D4;
}
次はブログ用のCSSを掲載しますが、これは単に色を変えただけで、他の機能的な部分は全て同じですよ。
ブログ用のグローバルナビゲーションを構成するheader.css
/* ★ブログ用のグローバルナビゲーションを構成する */
.animated-link_blog {
position: relative;
color: #1A73E8;
font-weight: 500;
text-decoration: none;
transition: color 0.3s ease;
font-size: 0.95em;
}
.animated-link_blog:hover {
color: #0d47a1;
}
.animated-link_blog::after {
content: "";
position: absolute;
left: 0;
bottom: -3px;
width: 0%;
height: 2px;
background: linear-gradient(to right, #42a5f5, #80d8ff);
transition: width 0.3s ease;
}
.animated-link_blog:hover::after {
width: 100%;
}
.den_nav_blog {
background: linear-gradient(to bottom,
rgba(255, 165, 0, 0.15),
rgba(255, 165, 0, 0));
backdrop-filter: blur(14px);
-webkit-backdrop-filter: blur(14px);
border-radius: 20px;
padding: 12px 20px;
opacity: 0;
transform: translateY(-20px);
transition: opacity 0.8s ease, transform 0.8s ease;
}
.den_nav_blog.visible {
opacity: 1;
transform: translateY(0);
}
.feinhome {
width: 45px;
transition: transform 0.3s ease, filter 0.3s ease;
}
.feinhome:hover {
transform: scale(1.1);
filter: drop-shadow(0 0 6px rgba(66, 133, 244, 0.5));
}
.den_nav_blog ul {
list-style-type: none;
margin: 0;
padding: 0;
display: flex;
flex-wrap: wrap;
}
.den_nav_blog ul li {
margin-right: 20px;
margin-bottom: 10px;
}
.den_nav_blog ul li a {
color: #1A73E8;
}
.den_nav_blog ul li a:hover {
color: #0d47a1;
}
次はJavaScriptの解説ですが、グローバルナビゲーションのものは大したことやってないから、そんなに長くはならないです。
このスクリプトが何をしているかというと、まずはナビが画面に見えたら visible クラスを付け、見えなくなったら外しています。
IntersectionObserver が「画面との交差」をイベントのように教えてくれるようになってる。
フェードイン・スライドインなどのCSS演出を、見えるタイミングで発火させているわけですね。
さっそくスクリプトを見ていきましょう。
// グローバルナビゲーションの動き
document.addEventListener("DOMContentLoaded", () => {
const nav = document.querySelector(".den_nav");
const observer = new IntersectionObserver(entries => {
entries.forEach(entry => {
if (entry.isIntersecting) {
nav.classList.add("visible");
} else {
nav.classList.remove("visible");
}
});
});
observer.observe(nav);
});
他に何かあるかなー…
一応補足としてお話しするなら、次のようなポイントがあるかも。
次はブログ用のJavaScriptですが、これはden_nav_blogの部分が違うだけで、カラーの異なるCSSに合わせているだけです。
// ブログ用グローバルナビゲーションの動き
document.addEventListener("DOMContentLoaded", () => {
const nav = document.querySelector(".den_nav_blog");
const observer = new IntersectionObserver(entries => {
entries.forEach(entry => {
if (entry.isIntersecting) {
nav.classList.add("visible");
} else {
nav.classList.remove("visible");
}
});
});
observer.observe(nav);
});
このようにして、当サイトのグローバルナビゲーションはCSSとJavaScriptが連携して動いているわけです。
一口にグローバルナビゲーションといってもいろんなデザインパターンや動きがあると思うから、以前に使っていたコードも残しておきますね。
全ページをリスト化したサイトマップも用意していますが、けっこうなページ数があります。
下記の「カテゴリー分けサイトマップ」のほうが使いやすいでしょう。
アナザーエデン関連ページ・サイトマップ
アナザーエデンの強敵戦やストーリーコンテンツのリスト、お勧めバッジなどを掲載したコーナーです。
期間限定のない普通のRPGですので、初心者でも安心して続けていけるゲームとなっています。
もっとも重要なグラスタについては、場所別に網羅した表があります。
個人サイトのホスティングとコンテンツ作成
個人でウェブサイトを作るなら時間をかけて。
HTML・CSS・JavaScriptの書き方はもちろん、無料かつ広告なしでホームページを作る方法を掲載したコーナーです。
Webデザインやレイアウトについても書いてあります。
魚釣りなどアウトドアのエリア
ゲームとパソコンだけじゃなく、アウトドアも趣味なんです。
このコーナーでは魚釣りの記録とか、魚料理のレシピ、はたまたサイクリングなどなど。
アウトドアに関連するコンテンツが詰め込まれています。