Written by Billy

コピペでOK!基本的なハンバーガーメニュー

未分類

ハンバーガーメニューについて調べてるけど、結局なにをどう使えばいいかよくわからないんだ。

というヒトのために、「これをコピペするだけでOK!」なカタチでコードをまとめました。

記事の後半では詳しい使い方を説明するので、気になるヒトは最後までお読みください

  • コピペでOK!基本的なハンバーガーメニュー
  • ハンバーガーメニューをファイル分け

コピペでOK!基本的なハンバーガーメニュー

<style>
    .header {
    position: fixed;
    width: 100%;
    z-index: 100;
}

.header__inner {
    /* max-width: 1440px; */
    max-width: 1220px;
    margin: 17px auto;
    padding-right: 40px;
    padding-left: 40px;
    /* position: relative; */
    display: flex;
}

.header__logo {
    width: 161px;
    height: 46px;
    /* flex-shrink: 0; */
    /* position: absolute;
    left: 10.5%;
    top: 5px; */
}

.header__menu-area {
    /* width: 513px; */
    display: flex;
    margin-left: auto;
    /* justify-content: space-between; */
    /* position: absolute;
    left: 54%; */
    /* right: 10%; */
}

.header__menu {
    margin-top: 5px;
}

.header__menu_list {
    display: flex;
    border-radius: 30px;
    background: #FFF;
    white-space: nowrap;
    padding: .65em 1em;
    box-shadow: 0px 0px 20px 0px rgba(0, 0, 0, 0.15);
}

.header__menu_link {
    color: #283436;
    font-family: Noto Sans JP;
    font-size: 16px;
    font-style: normal;
    font-weight: 400;
    line-height: 150%; /* 24px */
    letter-spacing: 0.8px;
    padding: 8px;
}

/* --------------- */
/* 「ご利用ガイド」タッチで出てくるカーソル */
.has-child {
    position: relative;
}
.has-child__list {
    display: none;
}
.has-child:hover .has-child__list,
.has-child:hover .has-child__list,
.has-child:active .has-child__list,
.has-child:active .has-child__list{
    display: block;
    position: absolute;
    background: #fff;
    margin-top: 4px;
    width: 343px;
    padding: 7px 0 12px 23px;
    line-height: 25px;
}

.header__reception {
    margin-left: 7px;
}

.reception__button {
    border-radius: 40px;
    background: #EDD837;
    box-shadow: 0px 3px 0px 0px #C0AF2C;
    text-align: center;
    line-height: 1em;
    transition: all 0.3s;
}

.reception__button_link {
    display: block;
    padding: 0.63em 1em;
    text-decoration: none;
    font-size:clamp(10px, 0.293rem + 0.58vw, 13px);
    font-weight: bold;
    line-height: 130%;
    color: #283436;
    white-space: nowrap;
}

.reception__button:hover {
    transform: translate(5px, 5px);
}

.headerSP__inner {
    display: none;
}

@media screen and (max-width: 950px) {
    .header__inner {
        display: none;
    }

    .headerSP__inner {
        display: block;
        position: relative;
    }
    .header__logo{
        padding-top: 18px;
        padding-left: 12px;
    }

    #g-nav {
        position: fixed;
        z-index: 999;
        top:0;
        left: -120%;
        width:100%;
        height: 100vh;
        background: linear-gradient(180deg, #40E0D0 0%, #5DC1CF 100%);
        transition: all 0.6s;
    }

    #g-nav.panelactive{
        left: 0;
    }

    #g-nav li{
        list-style: none;
        text-align: left;
    }
        
    .openbtn{
        position:fixed;
        z-index: 9999;
        top:10px;
        right: 10px;
        cursor: pointer;
        width: 50px;
        height:50px;
    }

    .openbtn span {
        display: inline-block;
        transition: all .4s;
        position: absolute;
        left: 14px;
        height: 3px;
        border-radius: 2px;
        background-color: #000;
        width: 28.5px;
    }

    .openbtn span:nth-of-type(1) {
        top: 15px;
    }
    .openbtn span:nth-of-type(2) {
        top: 23px;
    }
    .openbtn span:nth-of-type(3) {
        top: 31px;
    }
    .openbtn.active span:nth-of-type(1) {
        top: 18px;
        left: 18px;
        transform: translateY(6px) rotate(-45deg);
        width: 23px;
    }
    
    .openbtn.active span:nth-of-type(2) {
        opacity: 0;
    }
    
    .openbtn.active span:nth-of-type(3){
        top: 30px;
        left: 18px;
        transform: translateY(-6px) rotate(45deg);
        width: 23px;
    }


    .header__menu_nav {
        position: fixed;
        z-index: 999;
        top: 0;
        left: -120%;
        width: 100%;
        height: 100vh;
        background: linear-gradient(180deg, #40E0D0 0%, #5DC1CF 100%);
        transition: all .6s;
    }
    
    .header__menu-area.panelactive {
        left: 0;
        background: blue;
    }

    .header__menu_list {
        position: absolute;
        top:50%;
        left:50%;
        transform: translate(-50%,-50%);
        z-index: 999;
        display: flex;
        flex-direction: column;
        justify-content: center;
        height: 100%;
        background: none;
        box-shadow: none;
        padding: 0;
        gap: 8px;
    }
    .header__menu_title--mb{
        margin-bottom: 12px;
    }

    .header__menu_title {
        color: #283436;
        font-size: 16px;
        font-style: normal;
        font-weight: 700;
        line-height: 150%; /* 24px */
        letter-spacing: 0.8px;
        text-indent: 1em;
        position: relative;
    }

    .header__menu_title::before,
    .header__menu_title::after {
        content: "";
        position: absolute;
        top: 0;
        bottom: 0;
        left: 0;
        margin: auto;
        vertical-align: middle;
    }

    .header__menu_title::before {
        content: "";
        box-sizing: border-box;
        width: 12px;
        height: 12px;
        border: 1px solid #fff;
        -webkit-border-radius: 50%;
        border-radius: 50%;
    }

    .header__menu_title::after {
        content: "";
        left: 3.5px;
        width: 4px;
        height: 4px;
        border-top: 1px solid #fff;
        border-right: 1px solid #fff;
        -webkit-transform: rotate(45deg);
        transform: rotate(45deg);
    }

    .header__menu_item {
        color: #283436;
        font-size: 16px;
        font-style: normal;
        font-weight: 400;
        line-height: 150%; /* 24px */
        letter-spacing: 0.8px;
    }

    .header__menu_link {
    }
    
    .header__menu_guidelink {
        text-decoration: none;
        color: #283436;
    }
}

</style>

<header class="header">
        <div class="header__inner">
        <div class="header__logo">
            <a href="/">
                <img src="." alt="ロゴ">
            </a>
        </div>
        <div class="header__menu-area">
            <div class="header__menu">
                <nav class="header__menu_nav">
                    <ul class="header__menu_list">
                        <li class="header__menu_item"><a href="">テキスト</a></li>
                        <li class="header__menu_item"><a href="">テキスト</a></li>
                        <li class="header__menu_item has-child"><a href="">テキスト</a></li>
                        <li class="header__menu_item"><a href="">テキスト</a></li>
                    </ul>
                </nav>
            </div>
        </div><!--header__menu-area-->
    </div><!--header__inner-->

    <div class="headerSP__inner">
        <div class="header__logo">
            <a href="/">
                <img src="" alt="ロゴ">
            </a>
        </div>
        <div class="header__menu-area">
            <div class="header__menu">
                <div class="openbtn">
                    <span></span>
                    <span></span>
                    <span></span>
                </div>

                <nav id="g-nav" class="header__menu_nav">
                    <ul class="header__menu_list">
                        <li class="header__menu_title">テキスト</li>
                        <li class="header__menu_item"><a href="">テキスト</a></li>
                        <li class="header__menu_item"><a href="">テキスト</a></li>
                        <li class="header__menu_item"><a href="">テキスト</a></li>
                        <li class="header__menu_item"><a href="">テキスト</a></li>
                        <li class="header__menu_item"><a href="">テキスト</a></li>
                        <li class="header__menu_title header__menu_title--mb"><a href="">テキスト</a></li>                        
                        <li class="header__menu_title">テキスト</li>
                        <li class="header__menu_item"><a href="">テキスト</a></li>
                        <li class="header__menu_item"><a href=""">テキスト</a></li>
                        <li class="header__menu_item"><a href="">テキスト</a></li>
                    </ul>
                </nav>
            </div>
        </div><!--header__menu-area-->
    </div>
</header>

<script src="https://code.jquery.com/jquery-3.4.1.min.js" integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo=" crossorigin="anonymous"></script>
    <script>
        $(".openbtn").click(function () {
            $(this).toggleClass('active');
                $("#g-nav").toggleClass('panelactive');//ナビゲーションにpanelactiveクラスを付与
            });

            $("#g-nav a").click(function () {//ナビゲーションのリンクがクリックされたら
                $(".openbtn").removeClass('active');//ボタンの activeクラスを除去し
                $("#g-nav").removeClass('panelactive');//ナビゲーションのpanelactiveクラスも除去
            });
    </script>

ハンバーガーメニューをファイル分け

ここからは初学者向けになります。中級者以上の方は上記のコードをコピペして活用してください。

ーーーーーーーーーーーーーーーー

さて、上記のコードをコピペするだけで、ヘッダーとハンバーガーメニューは出来上がります。

しかしこのままだとコードがキレイとはいえないので、言語ごとにファイルを分けていきましょう。

3つのファイルに分かれます

上記のコードは3つのファイルに分けられます。

  • HTML
  • CSS
  • JavaScript

これらをそれぞれ分けていきましょう。

CSS

コードの上から順番に処理していきます。

なのでまずはCSSから。

<style>
    .header {
    position: fixed;
    width: 100%;
    z-index: 100;
}

.header__inner {
    /* max-width: 1440px; */
    max-width: 1220px;
    margin: 17px auto;
    padding-right: 40px;
    padding-left: 40px;
    /* position: relative; */
    display: flex;
}

.header__logo {
    width: 161px;
    height: 46px;
    /* flex-shrink: 0; */
    /* position: absolute;
    left: 10.5%;
    top: 5px; */
}

.header__menu-area {
    /* width: 513px; */
    display: flex;
    margin-left: auto;
    /* justify-content: space-between; */
    /* position: absolute;
    left: 54%; */
    /* right: 10%; */
}

.header__menu {
    margin-top: 5px;
}

.header__menu_list {
    display: flex;
    border-radius: 30px;
    background: #FFF;
    white-space: nowrap;
    padding: .65em 1em;
    box-shadow: 0px 0px 20px 0px rgba(0, 0, 0, 0.15);
}

.header__menu_link {
    color: #283436;
    font-family: Noto Sans JP;
    font-size: 16px;
    font-style: normal;
    font-weight: 400;
    line-height: 150%; /* 24px */
    letter-spacing: 0.8px;
    padding: 8px;
}

/* --------------- */
/* 「ご利用ガイド」タッチで出てくるカーソル */
.has-child {
    position: relative;
}
.has-child__list {
    display: none;
}
.has-child:hover .has-child__list,
.has-child:hover .has-child__list,
.has-child:active .has-child__list,
.has-child:active .has-child__list{
    display: block;
    position: absolute;
    background: #fff;
    margin-top: 4px;
    width: 343px;
    padding: 7px 0 12px 23px;
    line-height: 25px;
}

.header__reception {
    margin-left: 7px;
}

.reception__button {
    border-radius: 40px;
    background: #EDD837;
    box-shadow: 0px 3px 0px 0px #C0AF2C;
    text-align: center;
    line-height: 1em;
    transition: all 0.3s;
}

.reception__button_link {
    display: block;
    padding: 0.63em 1em;
    text-decoration: none;
    font-size:clamp(10px, 0.293rem + 0.58vw, 13px);
    font-weight: bold;
    line-height: 130%;
    color: #283436;
    white-space: nowrap;
}

.reception__button:hover {
    transform: translate(5px, 5px);
}

.headerSP__inner {
    display: none;
}

@media screen and (max-width: 950px) {
    .header__inner {
        display: none;
    }

    .headerSP__inner {
        display: block;
        position: relative;
    }
    .header__logo{
        padding-top: 18px;
        padding-left: 12px;
    }

    #g-nav {
        position: fixed;
        z-index: 999;
        top:0;
        left: -120%;
        width:100%;
        height: 100vh;
        background: linear-gradient(180deg, #40E0D0 0%, #5DC1CF 100%);
        transition: all 0.6s;
    }

    #g-nav.panelactive{
        left: 0;
    }

    #g-nav li{
        list-style: none;
        text-align: left;
    }
        
    .openbtn{
        position:fixed;
        z-index: 9999;
        top:10px;
        right: 10px;
        cursor: pointer;
        width: 50px;
        height:50px;
    }

    .openbtn span {
        display: inline-block;
        transition: all .4s;
        position: absolute;
        left: 14px;
        height: 3px;
        border-radius: 2px;
        background-color: #000;
        width: 28.5px;
    }

    .openbtn span:nth-of-type(1) {
        top: 15px;
    }
    .openbtn span:nth-of-type(2) {
        top: 23px;
    }
    .openbtn span:nth-of-type(3) {
        top: 31px;
    }
    .openbtn.active span:nth-of-type(1) {
        top: 18px;
        left: 18px;
        transform: translateY(6px) rotate(-45deg);
        width: 23px;
    }
    
    .openbtn.active span:nth-of-type(2) {
        opacity: 0;
    }
    
    .openbtn.active span:nth-of-type(3){
        top: 30px;
        left: 18px;
        transform: translateY(-6px) rotate(45deg);
        width: 23px;
    }


    .header__menu_nav {
        position: fixed;
        z-index: 999;
        top: 0;
        left: -120%;
        width: 100%;
        height: 100vh;
        background: linear-gradient(180deg, #40E0D0 0%, #5DC1CF 100%);
        transition: all .6s;
    }
    
    .header__menu-area.panelactive {
        left: 0;
        background: blue;
    }

    .header__menu_list {
        position: absolute;
        top:50%;
        left:50%;
        transform: translate(-50%,-50%);
        z-index: 999;
        display: flex;
        flex-direction: column;
        justify-content: center;
        height: 100%;
        background: none;
        box-shadow: none;
        padding: 0;
        gap: 8px;
    }
    .header__menu_title--mb{
        margin-bottom: 12px;
    }

    .header__menu_title {
        color: #283436;
        font-size: 16px;
        font-style: normal;
        font-weight: 700;
        line-height: 150%; /* 24px */
        letter-spacing: 0.8px;
        text-indent: 1em;
        position: relative;
    }

    .header__menu_title::before,
    .header__menu_title::after {
        content: "";
        position: absolute;
        top: 0;
        bottom: 0;
        left: 0;
        margin: auto;
        vertical-align: middle;
    }

    .header__menu_title::before {
        content: "";
        box-sizing: border-box;
        width: 12px;
        height: 12px;
        border: 1px solid #fff;
        -webkit-border-radius: 50%;
        border-radius: 50%;
    }

    .header__menu_title::after {
        content: "";
        left: 3.5px;
        width: 4px;
        height: 4px;
        border-top: 1px solid #fff;
        border-right: 1px solid #fff;
        -webkit-transform: rotate(45deg);
        transform: rotate(45deg);
    }

    .header__menu_item {
        color: #283436;
        font-size: 16px;
        font-style: normal;
        font-weight: 400;
        line-height: 150%; /* 24px */
        letter-spacing: 0.8px;
    }

    .header__menu_link {
    }
    
    .header__menu_guidelink {
        text-decoration: none;
        color: #283436;
    }
}

</style>

このコードの、
一番上にある<style>
と、
一番下にある</style>
までがCSSになります。

なので、<style>と/style>に挟まれてる中身をCSSファイルをつくってコピペして、
<style>と/style>は削除します。

HTMLはそのまま

次のパートはそのままです。

なぜならHTMLコードの中に、HTMLを書いているので、何もする理由がないからですね。

JavaScript

基本的に</footer>の下に書かれることが多いので、まぁ移動させなくても問題ないです。

一般的によく見かけるのは、

<script src="https://code.jquery.com/jquery-3.4.1.min.js" integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo=" crossorigin="anonymous"></script>

↑はそのままフッターの閉じタグ</footer>の下に。
 <script>
        $(".openbtn").click(function () {
            $(this).toggleClass('active');
                $("#g-nav").toggleClass('panelactive');//ナビゲーションにpanelactiveクラスを付与
            });

            $("#g-nav a").click(function () {//ナビゲーションのリンクがクリックされたら
                $(".openbtn").removeClass('active');//ボタンの activeクラスを除去し
                $("#g-nav").removeClass('panelactive');//ナビゲーションのpanelactiveクラスも除去
            });
    </script>

↑をjsファイルに移動させます。
CSSとやり方は同じで、<script>と</script>の中身を移動させます。
<script>と</script>は消しちゃってOKです。

コピペでできるハンバーガメニュー、完成です!

最後までお読みいただき、ありがとうございました。