ヘッダー・ナビゲーションを変化させるアイデア5つ

最初から固定表示

基本なので言わずもがなですが一応。単なる固定表示ならCSSの「position: fixed;」だけです。簡単ですね。

HTML

<header class="site-header">
    <h1 class="site-logo"><img src="images/logo.png" alt="WEBDESIGNDAY"></h1>
    <nav class="gnav">
        <ul class="gnav__menu">
            <li class="gnav__menu__item"><a href="">About</a></li>
            <li class="gnav__menu__item"><a href="">Works</a></li>
            <li class="gnav__menu__item"><a href="">Recruit</a></li>
            <li class="gnav__menu__item"><a href="">News</a></li>
            <li class="gnav__menu__item"><a href="">Contact</a></li>
        </ul>
    </nav>
</header>
<div class="hero"><img src="images/hero.jpg" alt="hero"></div>
<div class="content">
    <!--省略-->
</div>
<footer class="site-footer">
    <p class="copyright">@2017 WEBDESIGNDAY</p>
</footer>

CSS

body{
    background: #81bcd8;
}
.site-header{
    background: #fff;
    display: flex;
    padding: 60px 20px;
    position: fixed;
    justify-content: space-between;
    width: 100%;
}
.site-logo img{
    height: 20px;
    width: auto;
}
.gnav__menu{
    display: flex;
}
.gnav__menu__item{
    margin-left: 20px;
}
.gnav__menu__item a{
    color: #333;
    text-decoration: none;
}
.hero{
    max-height: 500px;
    overflow: hidden;
}
.hero img{
    height: auto;
    width: 100%;
}
.content{
    line-height: 1.6;
    margin: 0 auto;
    padding-top: 100px;
    width: 800px;
}
.content p{
    margin-bottom: 40px;
}
.site-footer{
    background: #333;
    padding: 80px 0;
}
.copyright{
    color: #fff;
    font-size: 12px;
    text-align: center;
}

https://webdesignday.jp/samples/p4166/sample1

最初から固定表示、特定位置までスクロールでサイズ・色を変える

windowのスクロールイベントを受け取り、特定の位置までスクロースしたらヘッダーにクラスをつけてCSSを変更します。


HTML


変更無し


CSS

.site-header{
    background: rgba(255,255,255,0.5);  /2行目/
    display: flex;
    padding: 60px 20px;
    position: fixed;
    justify-content: space-between;
    transition: .5s;
    width: 100%;
}
.site-header.transform{            /11行目/
    background: rgba(255,255,255,0.9);
    padding: 20px;
}

2行目
変更後の違いをわかりやすくするためと、メインの画像の邪魔をしないように背景色を透過させています。


11行目
特定位置までスクロールするとjQueryで「transform」クラスをつけますので、スタイルを変えています。


Jquery

var _window = $(window),
    _header = $('.site-header'),
    heroBottom;
  
_window.on('scroll',function(){
    heroBottom = $('.hero').height();
    if(_window.scrollTop() > heroBottom){
        _header.addClass('transform');   
    }
    else{
        _header.removeClass('transform');   
    }
});
  
_window.trigger('scroll');

6行目
変数「heroBottom」にメイン画像エリアの高さを入れています。画像ですので、jQueryが読み込まれてすぐに変数に高さを入れようとすると正常な高さが取得できません。ですので、スクロール時に高さを変数に入れています。


7行目
今回は、「メイン画像エリアの「.hero」の下までスクロールしたら」というのを条件判定にクラスをつけていきます。


https://webdesignday.jp/samples/p4166/sample2

途中から固定表示

HTML


<div class="hero"><img src="images/hero.jpg" width="1600" height="1200" alt="hero"></div>
<header class="site-header">
    <h1 class="site-logo"><img src="images/logo.png" alt="WEBDESIGNDAY"></h1>
    <nav class="gnav">
        <ul class="gnav__menu">
            <li class="gnav__menu__item"><a href="">About</a></li>
            <li class="gnav__menu__item"><a href="">Works</a></li>
            <li class="gnav__menu__item"><a href="">Recruit</a></li>
            <li class="gnav__menu__item"><a href="">News</a></li>
            <li class="gnav__menu__item"><a href="">Contact</a></li>
        </ul>
    </nav>
</header> 
<div class="content">
    <!--省略-->
</div>
<footer class="site-footer">
    <p class="copyright">@2017 WEBDESIGNDAY</p>
</footer>

メイン画像とヘッダーの順番を入れ変えました。


CSS

.site-header{
    background: #fff;
    display: flex;
    padding: 20px;
    position: absolute;   5行目
    justify-content: space-between;
    width: 100%;
}
.site-header.fixed{
    position: fixed;   10行目
    top: 0;       11行目
}

5行目
「position: absolute;」にしておくのがポイントです。こうしておかないと固定表示にした途端、下のコンテンツがヘッダーの高さ分上にカクっとずれてしまいます。


10、11行目
jQueryで「.fixed」クラスをつけますので固定表示にします。


Jquery

var _window = $(window),
    _header = $('.site-header'),
    heroBottom;
  
_window.on('scroll',function(){     
    heroBottom = $('.hero').height();
    if(_window.scrollTop() > heroBottom){
        _header.addClass('fixed');   
    }
    else{
        _header.removeClass('fixed');   
    }
});
  
_window.trigger('scroll');

15行目
スクロールをきっかけにしているので、途中までスクロールしている状態でリロードされた場合、スクロールイベントが発生しません。ですので、「_window.trigger(‘scroll’);」でロード時に「スクロールしたよ」と通知しています。

あとは先ほどのサンプルとほとんど何も変わりません。つけるクラス名が「fixed」になっただけです。


https://webdesignday.jp/samples/p4166/sample3

comments

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です