NTTドコモ様_dカーシェア
NTTドコモ様_dカーシェア
2015.09.02

スマホサイトに特化したアコーディオンメニューを作ってみた

はやち

どうもです、はやちです٩( ᐛ )و
秋に近づいて涼しくなってきましたね、皆様夏はいかがお過ごしでしたか?
はやちは夏のコミケに思わず三日間連続で参加してしまい、腕がこんがり焼けてしまいました( ˇωˇ )<健康的

そんなことはどうでもいいですね٩( ᐛ )و
今回はアコーディオンメニューを、もうちょいスマホに特化させた作りにしてみました! ご紹介します!

アコーディオンメニューの準備をしよう

まず、HTMLとSCSSの準備をします。

HTML

headerとアコーディオンさせるナビゲーションは別々に置きます( ˇωˇ )

<header id="js-accordion" class="header">
        <div class="header__heading">
            <h1 class="logo">accordion menu</h1>
                <span class="menu-button">
                    <i></i>
                </span>
        </div>
        <nav class="nav-content">
            <ul>
                <li><a href="#">Home</a></li>
                <li><a href="#">About</a></li>
                <li><a href="#">Blog</a></li>
                <li><a href="#">Gallery</a></li>
                <li><a href="#">Company</a></li>
                <li><a href="#">Contact</a></li>
            </ul>
        </nav>
</header>

SCSS

全体のスタイルはこちらです。

全体のレイアウト

今回アコーディオンの動きは、CSSのtransitionで対応します。
メニュー部分は、あらかじめ高さ分のポジションを設定します( ˇωˇ )

//headerのレイアウト
.header {
  width: 100%;
  z-index: 3;
  h1{
    font-family: 'Codystar', cursive;
    text-align: center;
    font-size:25rem
    padding: 20px 40px 20px 0px;
    color: #fff;
  }
  .header__heading{
    background:#000;
    position: absolute;
    width: 100%;
    z-index: 3;
  }
}

//アコーディオンメニューの中身
.nav-content{
  position: absolute;
  width: 100%;
  top: -735px;
  z-index: 2;
  ul li{
    font-family: 'Codystar', cursive;
    font-size:22rem;
    a{
      text-align: center;
      display: block;
      padding: 20px 0px;
      color: #fff;
    }
  }
  transition: 1.5s top;
}

//アコーディオンメニューの背景
#js-cover{
  background:#000;
  width: 100%;
  height: 100%;
  display: block;
  position: absolute;
  top: 0px;
  opacity: 0;
  z-index: 1;
}
アニメーションの動き

jsで.is-openがつくと動き出す用に設定します。
top:0pxだとヘッダー部分などに被ってしまうので、ヘッダーの高さ分topをつけてあげましょう( ˇωˇ )

//アコーディオンメニューの動き
.is-open{
  .nav-content{
    top: 65px;
  }
}

ハンバーガーメニューの作り方

お次にハンバーガーアイコンを設定します。

ハンバーガーアイコンは、menu-buttonの中のiが真ん中の棒、iの擬似要素beforeで上の棒、iの擬似要素afterで下に棒を設定。
それぞれの位置をtranslateYで調整します( ˇωˇ )
ポジションでやってしまうとpositionの中心が取れず、ガタついた動きになってしまうのでお気をつけくださいませ( ˇωˇ )

beforeの上の棒とafterの下の棒には、あらかじめ傾きをrotate(0deg)にしてあげます。
真ん中の棒は背景色で見えないようにするため、transition: background 0.5sを指定してあげましょう( ˇωˇ )

//ハンバーガーアイコン
.menu-button{ 
  width: 30px;
  height: 30px;
  display: block;
  position: absolute;
  right: 14px;
  top: 15px;
  i{
    display: block;
    width: 20px;
    height: 2px;
    border-radius: 3px;
    background: #fff;
    transition: background 0.5s;
    position: relative;
    left: 5px;
    top: 14px;
    &:before,
    &:after{
      content: "";
      display: block;
      width: 20px;
      height: 2px;
      border-radius: 3px;
      background: #fff;
      position: absolute;
      transform: rotate(0deg);
      transition: all 0.3s !important;
    }
    &:before{
      transform:translateY(8px);
    }
    &:after{
      transform:translateY(-8px);
    }
  }
}
アニメーションの動き

jsで.is-openがつくと動き出す用に設定します。
iはheader色で見えなくさせて、beforeとafterはtranslateY(0px)でiと同じ位置に寄せ、rotateで45ずつ傾けます( ˇωˇ )

//ハンバーガーアイコンのアニメーション
.is-open{
  .menu-button{
    i{
      background: #000;
      &:after{
        transform:translateY(0px) rotate(-45deg);
      }
      &:before{
        transform:translateY(0px) rotate(45deg);
      }
    }
  }
}