固定headerをスクロールすると背景色が変わる実装【JS】
こんにちは。
大学4回生で現在WEBコーダーとして働いているYUJIROです。
「headerを固定にして、一定距離スクロールすると、背景色を変えたい」
「しかし、headerをスクロールして背景色を変えるには、どうすればいいだろう?」
この記事を読んでいる方は、このような悩みがあるのではないでしょうか?
今回はそんな方に向けて、「固定headerをスクロールすると、背景色が変わる実装【JS】」について解説していきます。
HTML・CSS・JavaScriptの順でコードの紹介をしていくので、興味ある方は是非参考にしてください。
☑️ デモページ
[codepen_embed height=”265″ theme_id=”dark” slug_hash=”abZKjQZ” default_tab=”css,result” user=”yujiron”]See the Pen abZKjQZ by ゆーじろー (@yujiron) on CodePen.[/codepen_embed]
目次
HTML
<header class="header">
<div class="header__inner">
<div class="header__title">
<h1>プログラミング</h1>
</div>
<nav class="header__nav">
<ul>
<li>
HTML
</li>
<li>
CSS
</li>
<li>
JavaScript
</li>
<li>
PHP
</li>
</ul>
</nav>
</div>
</header>
<h2>下に300pxスクロールすると、headerの背景色が「ピンク」に変わります。</h2>
<h3>スクロールすると、固定headerの背景色が「ピンク」に変わりましたね!</h3>
HTMLの解説
・固定headerをまずは作成しました。
・そしてh2タグの下にある、改行を表す「brタグ」は、スクロールして固定headerの色の変化がわかるように高さを持たせました。
・後でJavaScriptを書く際に、「jQuery」を使う予定にしています。
なので、bodyタグのすぐ上にjQueryのCDNコードを入れておきましょう。
これがないと、jQueryを反映させることが出来ませんので。
CSS
/* http://meyerweb.com/eric/tools/css/reset/
v2.0 | 20110126
License: none (public domain)
*/
html, body, div, span, applet, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
a, abbr, acronym, address, big, cite, code,
del, dfn, em, img, ins, kbd, q, s, samp,
small, strike, strong, sub, sup, tt, var,
b, u, i, center,
dl, dt, dd, ol, ul, li,
fieldset, form, label, legend,
table, caption, tbody, tfoot, thead, tr, th, td,
article, aside, canvas, details, embed,
figure, figcaption, footer, header, hgroup,
menu, nav, output, ruby, section, summary,
time, mark, audio, video {
margin: 0;
padding: 0;
border: 0;
font-size: 100%;
font: inherit;
vertical-align: baseline;
}
/* HTML5 display-role reset for older browsers */
article, aside, details, figcaption, figure,
footer, header, hgroup, menu, nav, section {
display: block;
}
body {
line-height: 1;
}
ol, ul {
list-style: none;
}
blockquote, q {
quotes: none;
}
blockquote:before, blockquote:after,
q:before, q:after {
content: '';
content: none;
}
table {
border-collapse: collapse;
border-spacing: 0;
}
/* ◎ここから */
* {
box-sizing: border-box;
}
body {
text-align: center;
}
/* header */
.header {
padding: 30px;
transition: all .5s;
position: fixed;
width: 100%;
z-index: 100;
}
.header__inner {
max-width: 1100px;
margin: 0 auto;
display: flex;
align-items: center;
justify-content: space-between;
}
.header__nav ul {
display: flex;
}
.header__nav ul li {
margin-left: 30px;
}
.header.change-color {
background-color: pink;
}
h2,
h3 {
padding: 200px 20px;
line-height: 1.5;
}
/* header */
/* レスポンシブ */
@media (max-width: 600px) {
.header__nav {
display: none;
}
h2,
h3 {
font-size: 12px;
}
}
・まずは「◎ここから」と書かれた部分までに、リセットCSSコードを入れました。これを入れることで、ブラウザがデフォルトで持っている余白などを消してくれます。
・そして「.header」に
position: fixed;
→headerをスクロールしても固定にしたままにする
width: 100%;
→「position: fixed;」を書いた際には、「width: 100%;」も入れておきましょう。これがないと、横一杯にheaderが広がらなくなります。
z-index: 100;
→固定headerが一番上の要素になるように、数字を記載しておきましょう。数字は大きいほど、上の要素になります。
transition: all .5s;
→固定headerがスクロールした際に、0.5秒で背景色が変わるように、アニメーションを設定しました。
・「.header.change-color」の「.change-color」は、スクロールした際に「.header」につけるclassになります。
「.header.change-color」の中に、スクロールしたら表示したい色を入れましょう。
JavaScript
'use strict';
jQuery(window).on('scroll', function () {
if (jQuery('.header').height() < jQuery(this).scrollTop()) {
jQuery('.header').addClass('change-color'); }
else {
jQuery('.header').removeClass('change-color'); } });
JavaScriptの解説
・jQueryを今回は使います。
・「.header」分の高さまでスクロールすると、「.header」に対して「change-color」のclassがつく。つまりここで固定headerの背景色が変わります。そして「.header」の高さ以下の場合は、「change-color」を外す。つまり背景色が元に戻る。
jQuery( window ).on( ‘scroll’, function() { if ( 300 < jQuery( this ).scrollTop() ) { jQuery( ‘.header’ ).addClass( ‘change-color’ ); } else { jQuery( ‘.header’ ).removeClass( ‘change-color’ ); }});
→このように書くと、300pxスクロールしたときに、固定headerの背景色を変えることが出来ます。300pxの部分はお好きな数値を入れてもらえると。
まとめ
如何でしたでしょうか?
スクロールすると固定headerの色が変わる実装は、頻繁にWEBサイトで使われています。
今回の実装が出来るようになると、WEB制作の幅も広がるので是非試してみてください。
また来週の水曜日に技術ブログを更新していきます。
それでは。




