スクロールするとデザインが変わるヘッダーってよく見かけますよね。
背景の色が変わったり、ヘッダーの高さがせまくなったり。。
ヘッダーナビゲーションは上部で固定されていることが多いので、
スクロールした後のデザインを変えないと、
文字と背景のコントラストが不十分で読みづらくなってしまったりします。
今回はスクロールでデザインが変化する
ヘッダーナビゲーションを作る手順を説明してみようと思います。
このようなスクロールでデザインが変わるサンプルデモを作ってみました。
See the Pen by notebook (@orange-notebook) on CodePen.
100px以上スクロールすると下記デザインが変化するようになっています。
- ヘッダー内のフォントの色
- ヘッダーの背景色
- ヘッダーの高さ
- ヘッダーの影
まずスクロールでデザインが変わるヘッダーを
作るためのポイントを簡単にまとめてみました。
- CSSでヘッダーを上部に固定する。
- CSSで「スクロールしたときのデザイン」と「スクロールしていないときのデザイン」を分けて作成する。
- スクロールしたときにデザインを変更するため特定のクラスをJavaScriptでつける。
それでは作り方についてもう少しくわしくみていきましょう。
HTML
HTMLの全体像はこんなかんじになっています。
<!-- ヘッダー -->
<header>
<!-- ロゴ -->
<a href="#" class="logo">Logo</a>
<!-- ナビゲーション -->
<ul>
<li><a href="#">会社案内</a></li>
<li><a href="#">サービス</a></li>
<li><a href="#">お問い合わせ</a></li>
</ul>
</header>
<!-- スクロール用のsectionタグ -->
<section class="section section-a">
</section>
<!-- スクロール用のsectionタグ -->
<section class="section section-b">
</section>
HTMLでは以下のパーツを作ります。
- ヘッダー
- ヘッダー内のロゴ
- ヘッダー内のナビゲーション
- スクロールできるように高さを確保するためのsectionタグ
CSS
CSSの全体像は下記のようなかんじになっています。
header {
/* headerを画面上部に固定する */
position: fixed;
top: 0;
left: 0;
width: 100%;
/* ロゴとナビゲーションを横並びにする */
display: flex;
justify-content: space-between;
align-items: center;
/* スクロールしても他のコンテンツの下にならないようにする */
z-index: 10;
/* 背景色を黒にする */
background: #000;
/* headerに余白を作る */
padding: 25px 15px;
/* アニメーションの変化時間 */
transition: 0.5s;
}
/* ロゴのデザイン */
.logo {
color: #fff;
text-decoration: none;
font-size: 18px;
letter-spacing: 1px;
/* アニメーションの変化時間 */
transition: 0.5s;
}
/* ナビゲーションのリンクを横並びにする */
ul {
display: flex;
justify-content: center;
align-items: center;
}
li {
list-style: none;
}
/* ナビゲーションのリンクのスタイル調整 */
a {
display: inline-block;
margin-left: 12px;
color: #fff;
font-size: 12px;
text-decoration: none;
letter-spacing: 1px;
/* アニメーションの変化時間 */
transition: 0.5s;
}
/* スクロールするため高さを出すためのsection */
.section {
height: 100vh;
}
.section-a {
background: #000;
}
.section-b {
background: #fff;
}
/* スクロールして「scroll-navクラス」がついたときのヘッダーデザイン */
header.scroll-nav {
/* 余白を狭くする */
padding: 10px 15px;
/* 背景を白にする */
background: #fff;
/* コンテンツの背景が白でもナビゲーションだと分かりやすいように影をつける */
box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.1);
}
/* 「scroll-navクラス」がヘッダーについたときに、ロゴとナビゲーションの文字を黒にする */
header.scroll-nav .logo,
header.scroll-nav ul li a {
color: #000;
}
CSSでのポイントは以下かなと思います。
- ヘッダーを上部に固定する。
- ヘッダーに「z-index」プロパティを指定して、コンテンツの下にもぐらないようにする。
- スクロール用のクラスとデザインの設定する。
- 変化にかかる時間を指定する。
1:ヘッダーを上部に固定する
まずスクロールしても表示されるように、
「position: fixed;」を使ってヘッダーを上部に固定します。
header {
/* headerを画面上部に固定する */
position: fixed;
top: 0;
left: 0;
width: 100%;
}
2:ヘッダーに「z-index」プロパティを指定する
ヘッダーを上部に固定表示したので、コンテンツの下にヘッダーがもぐらないように「z-index」プロパティを指定します。
header {
/* スクロールしても他のコンテンツの下にならないようにする */
z-index: 10;
}
例では「10」としていますが、z-indexの値は他の要素のz-indexの値との相対性で決まります。
3:スクロール用のクラスとデザインを設定する
スクロール状態でデザインを変えるため、
スクロールなしのヘッダーと、スクロールしたときのヘッダー、
別々にデザインを作る必要があります。
そのためスクロール用のクラス名を作り、そのクラスに対し専用のデザインを当てます。
今回はスクロールしたときのデザイン用として
「scroll-nav」というクラスを作り、デザインを出し分けていきます。
- 背景色:黒
- 文字色:白
- ヘッダーの影:なし
header {
/* 背景色を黒にする */
background: #000;
/* headerに余白を作る */
padding: 25px 15px;
}
文字色については「ロゴ」と「ナビゲーションのリンク」
それぞれにスタイルを当てています。
/* ロゴのデザイン */
.logo {
color: #fff;
}
/* ナビゲーションのリンクのスタイル調整 */
a {
color: #fff;
}
- 背景色:白
- 文字色:黒
- ヘッダーの高さ:低くする
- ヘッダーの影:影付き (コンテンツの背景も白い場合、影をつけることで境目がわかるようにする)
/* スクロールして「scroll-navクラス」がついたときのヘッダーデザイン */
header.scroll-nav {
/* 余白を狭くする */
padding: 10px 15px;
/* 背景を白にする */
background: #fff;
/* コンテンツの背景が白でもナビゲーションだと分かりやすいように影をつける */
box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.1);
}
また文字色の指定は「ロゴ」と「ナビゲーション」に当てているので、ヘッダーに「scroll-navクラス」がついたとき、ロゴとナビゲーションの文字色も変わるように指定をします。
/* 「scroll-navクラス」がヘッダーについたときに、ロゴとナビゲーションの文字を黒にする */
header.scroll-nav .logo,
header.scroll-nav ul li a {
color: #000;
}
4:変化にかかる時間を指定する
デザインを変える要素にtranisitionで変化にかかる秒数を指定します。
header {
/* アニメーションの変化時間 */
transition: 0.5s;
}
/* ロゴ */
.logo {
/* アニメーションの変化時間 */
transition: 0.5s;
}
/* ナビゲーションのリンク */
a {
/* アニメーションの変化時間 */
transition: 0.5s;
}
JavaScript
Javascriptでスクロールされたことを感知し、
ヘッダーのクラス名を付け替えることによって、デザインの変化を実装します。
なので○○以上スクロールすると、
ヘッダーに特定のクラスをつけ外しするという指示が必要です。
JavaScriptの全体像はこんなかんじになっています。
window.addEventListener("scroll", function () {
// ヘッダーを変数の中に格納する
const header = document.querySelector("header");
// 100px以上スクロールしたらヘッダーに「scroll-nav」クラスをつける
header.classList.toggle("scroll-nav", window.scrollY > 100);
});
今回は 「window.scrollY > 100 」となっているので、100pxスクロールしたら「scroll-navクラス」が付与され、デザインが変わるようになっています。
この数字を調整すると、
どの程度スクロールした時点でクラスを付与するかの調整が可能です。
またJavaScriptからHTML要素を選択する方法については、
こちらの記事でまとめています。
以上、スクロールで変化するヘッダーナビゲーションの作り方でした。
最後までお読みいただき、ありがとうございました。