スクロールしてもついてくるスティッキーヘッダーをJSで実装する方法


スクロールしてもついてくるスティッキーヘッダーをJSで実装する方法

どうもです。フロントエンドエンジニアのはやちです。

健康診断の結果が届き結果がオールAの超絶健康体だというのがわかって浮かれてるはやちです♪ギミギミ└( ^ω^ )」シェイク♪
野菜を食べ続けた結果ですね、みなさんも野菜を食べましょう( ˘ω˘)☝

そんなのどうでもいいですね。
さて、今回は縦に長いコンテンツなどでよく見かけるスティッキヘッダーを作ってみました。
ご紹介します( ˘ω˘)☝

スティッキーヘッダーとは?
スクロールしてもヘッダーがついてくる技法のことです。
ページ移動がしやすいため使用されることが多いです。また、縦に長いLPのページ内リンクで使用されることもあります。
なんだかスティッキーフィンガーみたいですね( ˘ω˘)<アリーデヴェルチ

HTMLとCSSの準備

まずは準備の方法をご紹介します( ˘ω˘)☝

HTML

ヘッダーは固定に配置しておくための#headerと、変化をつけるための#changeを用意します( ˘ω˘)☝

<header id="header">
     <div class="inner">
          <h1>Demo</h1>
          <ul>
               <li><a href="#">HOME</a></li>
               <li><a href="#">ABOUT</a></li>
               <li><a href="#">COMPANY</a></li>
               <li><a href="#">CONTACT</a></li>
          </ul>
     </div><!-- /inner -->
</header>

<div id="change">
     <div class="inner">
          <h1>Demo</h1>
          <ul>
               <li><a href="#">HOME</a></li>
               <li><a href="#">ABOUT</a></li>
               <li><a href="#">COMPANY</a></li>
               <li><a href="#">CONTACT</a></li>
          </ul>
     </div><!-- /inner -->
</div><!-- /change -->

<section id="top">
     <div class="inner">
          <h1><span>Demo</span></h1>
     </div>
</section><!--/top-->

<section id="content">
     <div class="inner">
          <h1>Title</h1>
          <p>Sumple text.Sumple text …</p>
     </div>
</section><!--/content-->

CSS

#changefixed固定にして、JSで表示のアニメーションをつけるために、display:none;で消しておきましょう( ˘ω˘)☝

#header {
  background: #1c262f;
}
#header .inner {
  overflow: hidden;
  padding: 8px 0px 10px 0;
}
#header .inner h1 {
  float: left;
  font-family: 'Dancing Script', cursive;
  font-size: 20px;
  font-size: 2rem;
}
#header .inner ul {
  float: left;
  font-family: 'Droid Sans', sans-serif;
  font-size: 8px;
  font-size: 0.8rem;
  margin: 20px 0 10px 20px;
}
#header .inner ul li {
  float: left;
  margin-right: 20px;
}
#header .inner ul li a {
  color: #ffffff;
  text-decoration: none;
}

#change {
  background: #f66f6f;
  position: fixed;
  top: 0px;
  left: 0px;
  width: 100%;
  display: none;
  z-index: 9999;
  padding: 8px 0 10px 0px;
}
#change h1 {
  font-family: 'Dancing Script', cursive;
  font-size: 20px;
  font-size: 2rem;
  float: left;
  font-weight: bold;
  color: #1c262f;
}
#change ul {
  float: left;
  font-family: 'Droid Sans', sans-serif;
  font-size: 8px;
  font-size: 0.8rem;
  margin: 20px 0 10px 20px;
}
#change ul li {
  float: left;
  margin-right: 20px;
}
#change ul li a {
  color: #1c262f;
  text-decoration: none;
}

スティッキーヘッダーの実装

次に実装の仕方をご紹介します( ˘ω˘)☝

実装をする前に

JSで動きを付ける前に仕組みを理解しましょう( ˘ω˘)☝

はじめは#chenge部分を消してスクロールのてっぺんが、#contentのてっぺんがくっついた時に#chengeが表示するしくみをつくります。

sticky3

JSを組んでみよう

仕組みがわかったところでJSを組んでみましょう。

ソースだけだとわかりづらいので実際このように設定をしています( ˘ω˘)

sticky2

実際のソースはこちらになります( ˘ω˘)

//スティッキーヘッダー
var $window = $(window), //ウィンドウを指定
$content = $("#content"), //#content部分
$chenge = $("#change"), //#change部分
topContent = $content.offset().top; //#contentの位置を取得

var sticky = false;

 $window.on("scroll", function () {
      if ($window.scrollTop() > topContent) { //scroll位置が#contentの上にある場合
           if ( sticky === false ){
                $chenge.slideDown(); //#change部分が上がる。
                sticky = true;
           }
      } else {
           if ( sticky === true ){ //scroll位置が下にある場合
                $chenge.slideUp();//#change部分が降りてくる。
                sticky = false;
           }
      }
 });
 $window.trigger("scroll");

これで完成です✌(´ʘ‿ʘ`)✌

実装したものはコチラでご確認いただけます( ˘ω˘)☞三☞シュッシュッDEMO

まとめ

いかがでしたでしょうか。

今回.slideDown();で上から降りてくる動きにしましたが、.fadeIn();に変えればふわっとしたアニメーションのスティッキーヘッダーを作ることができます!

また、ここではご紹介できませんでしたが、.animete();でスクロールさせる位置ごとに色を変化させるなど、仕組みがわかってくると色々試すことができます。実装の幅が広がると夢も広がりますね( ˘ω˘)☝

今回図解説をつけたのでJS初心者さんやデザイナーさんにもご理解いただけたら幸いです( ˘ω˘)

この記事を書いた人

はやち
はやち フロントエンドエンジニア 2010年入社
フロントエンドエンジニアのはやちです( ˘ω˘)☝
以前までは顔隠しておりましたが思い切ることにしました…。
相変わらず顔文字乱舞ですがブログもコーディングも楽しくやっていこうと思います✌(´ʘ‿ʘ`)✌
今までに作ったDemoたちはGithubにて公開しております!よろしければ是非( ˘ω˘)☞三☞シュッシュッ

こちらもおすすめ

JavaScript 第6版

JavaScript 第6版

  • 著者David Flanagan
  • 価格¥ 4,536(2015/12/10 12:07時点)
  • 出版日2012/08/10
  • 商品ランキング10,803位
  • 大型本840ページ
  • ISBN-104873115736
  • ISBN-139784873115733
  • 出版社オライリージャパン