CSSとJavaScriptでスクロール時にナビゲーションバーのサイズを変更する方法
Webサイトでよく見かける演出のひとつに、ページを下にスクロールするとナビゲーションバー(ヘッダー)がコンパクトに縮小されるエフェクトがあります。本記事では、CSSのtransitionプロパティとJavaScriptのスクロールイベントを組み合わせて、この動的なナビゲーションバーを実装する方法を詳しく解説します。
実装の仕組み
このエフェクトは、次の2つの要素を組み合わせることで実現できます。
- CSS側:ナビゲーションバーに
position: fixed;を指定して画面上部に固定し、transitionプロパティによってパディングやロゴのフォントサイズが変化する際に滑らかなアニメーション効果を付与します。 - JavaScript側:
window.onscrollイベントでスクロール量を監視し、一定量(この例では20px)を超えたかどうかを判定して、ナビゲーションバーのスタイルを動的に切り替えます。
コード例
以下は、CSSとJavaScriptを使用してスクロール時にナビゲーションバーのサイズを変更する完全なコード例です。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
<style>
*,
*::before,
*::after {
box-sizing: border-box;
}
body {
margin: 0px;
margin-top: 60px;
padding: 0px;
}
nav {
position: fixed;
top: 0px;
width: 100%;
background-color: rgb(39, 39, 39);
overflow: auto;
height: auto;
transition: 0.5s;
padding: 50px 10px;
}
.links {
display: inline-block;
text-align: center;
padding: 14px;
color: rgb(178, 137, 253);
text-decoration: none;
font-size: 17px;
}
.links:hover {
background-color: rgb(100, 100, 100);
}
.selected {
background-color: rgb(0, 18, 43);
}
.sample-content {
height: 150vh;
}
.company-logo {
font-size: 50px;
color: white;
position: absolute;
right: 30px;
transition: 0.3s;
}
</style>
</head>
<body>
<nav>
<a class="company-logo">€</a>
<a class="links selected" href="#">Home</a>
<a class="links" href="#"> Login</a>
<a class="links" href="#"> Register</a>
<a class="links" href="#"> Contact Us</a>
<a class="links" href="#">More Info</a>
</nav>
<div class="sample-content">
<h1>Here are some headers</h1>
<h2>Here are some headers</h2>
<h3>Here are some headers</h3>
<h4>Here are some headers</h4>
<h1>Here are some headers</h1>
<h2>Here are some headers</h2>
<h3>Here are some headers</h3>
<h4>Here are some headers</h4>
</div>
<script>
window.onscroll = scrollShowNav;
function scrollShowNav() {
if (
document.body.scrollTop > 20 ||
document.documentElement.scrollTop > 20
)
{
document.getElementsByTagName("nav")[0].style.padding = "10px 10px";
document.querySelector(".company-logo").style.fontSize = "20px";
} else {
document.getElementsByTagName("nav")[0].style.padding = "40px 50px";
document.querySelector(".company-logo").style.fontSize = "50px";
}
}
</script>
</body>
</html>コードの解説
ポイントとなる部分を簡単に整理します。
- nav要素の初期状態:
padding: 50px 10px;で大きな余白を持たせ、transition: 0.5s;によりサイズ変化が0.5秒かけて滑らかに行われます。 - スクロール検知:
scrollShowNav関数内でdocument.body.scrollTopおよびdocument.documentElement.scrollTopを参照し、ブラウザ間の互換性を保ちながらスクロール位置を取得します。 - スタイルの切替:スクロール量が20pxを超えるとパディングが「10px 10px」に、会社ロゴのフォントサイズが20pxに縮小されます。逆にページ最上部に戻ると元の大きさへ復帰します。
出力結果
上記のコードを実行すると、まず次のように余白たっぷりのナビゲーションバーが表示されます。

その後、ページをスクロールすると、ナビゲーションバーが次のようにコンパクトに縮小されます。

まとめ
CSSのtransitionによるアニメーションと、JavaScriptのwindow.onscrollイベントによるスクロール検知を組み合わせるだけで、特別なライブラリを使わずに洗練されたナビゲーションバーの縮小エフェクトを実装できます。閲覧領域を広く確保できるため、特に縦長のランディングページやブログサイトなどで有効なテクニックです。ぜひ実際のプロジェクトでも活用してみてください。
-
CSSとJavaScriptでスクロール時にヘッダーを縮小させる方法
CSSとJavaScriptを組み合わせることで、ページのスクロール量に応じてヘッダーのサイズを動的に変更できます。この手法は、ナビゲーションバーを画面上部に固定しながら、スクロール中はコンテンツの表示領域をできるだけ広く確保したい場合に非常に効果的です。ここでは、window.onscrollイベントとCSSのtransitionプロパティを活用し、スクロールするとヘッダーがスムーズに縮小される実装例を紹介します。実装例<!DOCTYPE html> <html> <head> <meta name="viewport" cont
-
CSSで作る!スクロール時に画面上部へ固定されるナビゲーションバーの実装方法
CSSでスクロール時に固定されるナビゲーションバーを作成する方法Webサイトでページをスクロールしても画面上部に固定され続けるナビゲーションバーは、メニューへのアクセス性を保ち、ユーザビリティを大きく向上させる定番のUIテクニックです。CSSのpositionプロパティとJavaScriptを組み合わせることで、誰でも簡単に実装できます。この記事では、スクロールするとナビゲーションバーが画面上部にピタッと固定される仕組みを、実際のコード例とともにわかりやすく解説します。positionプロパティの基本構文CSSにおけるpositionプロパティの基本構文は次のとおりです。セレクタ {