上毛印刷株式会社

【JavaScript】スクロールでグローバルナビゲーションを画面上部に追従させる

【JavaScript】スクロールでグローバルナビゲーションを画面上部に追従させる

2024年01月17日
WEBサイト制作
  • #備忘録
  • #HTML
  • #css
  • #JavaScript
  • #tips

こんにちは!
上毛印刷WEB制作担当のソーヤです。

今回は実装要望が非常に多いギミックを紹介します。

実装例


こんな感じでグローバルナビゲーションを画面上部に追従させることで、ページの下部にいても常にグローバルナビゲーションにアクセスすることができます。
便利ですよね!

HTML例

<div class="gnav-inc">
    <nav class="gnav">
        <div class="gnav-inner">
            <ul class="gnav-list">
                <li class="gnav-list__item">
                    <a href="javascript:void(0);">トップ</a>
                </li>
                <li class="gnav-list__item">
                    <a href="javascript:void(0);">選手一覧</a>
                </li>
                <li class="gnav-list__item">
                    <a href="javascript:void(0);">訓練方法</a>
                </li>
                <li class="gnav-list__item">
                    <a href="javascript:void(0);">大会結果</a>
                </li>
            </ul>
        </div>
    </nav>
</div>

CSS例

.gnav-inc{
    height: 90px;
    position: relative;
    z-index: 60;
    transition: .2s;
    background: rgba(36,42,44,1);
}
.is-fixed{
    position: fixed;
    z-index: 10000;
    width: 100vw;
    top: 0;
    left: 0;
    margin: 0;
}    
.gnav{
    -webkit-transition: 0.4s ease;
    -o-transition: 0.4s ease;
    transition: 0.6s ease;
    height: 90px;
    background: rgba(36,42,44,1);
}
.gnav-list{
    display: -webkit-flex;
    display: -ms-flex;
    display: flex;
    justify-content: center;
    align-items: center;
    list-style: none;
    margin: 0;
}
.downMenu{
    position: absolute;
    display: none;
    top: 90px;
}
.gnav-list__item{
    text-align: center;
}
.gnav-list__item a{
    color: #fff;
    -webkit-transition: 0.4s ease;
    -o-transition: 0.4s ease;
    transition: 0.4s ease;
}
.gnav-list__item > a{
    position: relative;
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 16px;
    width: 250px;
    height: 90px;
    transition: 0.4s ease;
    border-bottom: 0px solid transparent;
    background-position: top 25px center;
    background-repeat: no-repeat;
    background-size: auto;
}
.gnav-list__item > a span{
    color: #fff;
    display: block;
    margin: 0 0 -10px;
}
.gnav-list__item > a::after{
    content: '';
    position: absolute;
    right: -1px;
    top: 0;
    background-size: contain;
    background-position: center center;
    background-repeat: no-repeat;
    width: 1px;
    height: 90px;
    z-index: 100;
}

JavaScript例

let fixElement = document.querySelector('.gnav-inc');
let baseFixPoint = fixElement.offsetTop + 80;
let fixClass = 'is-fixed';
function fixFunction() {
let windowScrollTop = window.scrollY || document.documentElement.scrollTop;
    if (windowScrollTop >= baseFixPoint) {
        fixElement.classList.add(fixClass);
    } else {
        fixElement.classList.remove(fixClass);
    }
}
window.addEventListener('load', fixFunction);
window.addEventListener('scroll', fixFunction);

まとめ

今回もjQueryではなく、Vanilla.jsで実装してみました。

コピペしてガンガン使ってください!

WEB制作担当ソーヤ

ソーヤ

上毛印刷WEB制作担当
前職は東証プライム企業の本社WEB受託チームにてフロントエンドエンジニアを3年経験。


この記事に対するご意見・ご感想・ご質問等ありましたら、
ぜひ下記フォームにてお送りください。

    お名前必須
    メールアドレス必須
    お問い合わせ内容必須
    PAGE TOP