ログイン

問題7 ハンバーガーメニューを作ろう!

jQueryAnimationの問題

jQueryAnimation

ハンバーガーメニューを作ろう!

問題

今回はハンバーガーメニューを作りましょう!アイコンは別の回で作っているので今回は省かせていただきます。

自分の環境に書くコード

              <div class="icon" id="open">
  <span class="top bar"></span>
  <span class="middle bar"></span>
  <span class="bottom bar"></span>
</div>
<nav class="menus">
  <ul class="menu-list">
    <li><a href="#">ホーム</a></li>
    <li><a href="#">コンタクト</a></li>
    <li><a href="#">アクセス</a></li>
    <li><a href="#">ニュース</a></li>
  </ul>
</nav>
¥HTML¥
            
              body{
  margin: 0;
  padding: 0;
}
.icon{
  position: relative;
  width: 30px;
  height: 30px;
  background-color: #000;
  padding: 10px;
  cursor: pointer;
  z-index: 2;
}
.bar{
  position: absolute;
  width: inherit;
  height: 3px;
  background-color: #fff;
  border-radius: 5px;
}
.top{
  top: 28%;
}
.middle{
  top: 48%;
}
.bottom{
  top: 68%;
}
#close .top{
  transform: rotate(45deg);
}
#close .bottom{
  transform:rotate(-45deg);
}
.menus{
  background-color: #000;
  width: 300px;
  position: fixed;
  top: 0;
}
.menu-list{
  list-style: none;
}
.menu-list a{
  text-decoration: none;
  color: #fff;
  display: block;
}
.menu-list li{
  line-height: 2em;
}
¥CSS¥
            
              $(function () {
  $("body").on("click", "#open", function () {
    $(".top").animate({ top: "48%" }, 300),
    $(".bottom").animate({ top: "48%" }, 300, function () {
      $(".middle").animate({ opacity: 0 }, 0);
      $(".bar").css("transition", ".3s");
      $("#open").attr("id", "close");
    });
  });
  $("body").on("click", "#close", function () {
    $("#close").attr("id", "open");
    $(".middle").animate({ opacity: 1 }, 300, function () {
      $(".bar").css("transition", "none");
      $(".top").animate({ top: "28%" }, 300);
      $(".bottom").animate({ top: "68%" }, 300);
    });
  });
});
¥JavaScript¥
            

期待する画面

ログインして解答を見る
コードのアイコン

解答ソースコード

              $(function () {
  var iconHeight=$(".icon").innerHeight();
  var menuWidth=$(".menus").innerWidth();
  $(".menus").css({
    "padding-top":iconHeight,
    "left":-menuWidth
  });
  //ここからメニューアイコン
  $("body").on("click", "#open", function () {
    $(".bottom").animate({ top: "48%" }, 300, function () {
      $(".menus").animate({left:0},300);
    });
  });
  $("body").on("click", "#close", function () {
    $(".middle").animate({ opacity: 1 }, 300, function () {
      $(".menus").animate({left:-menuWidth},300);
    });
  });
});
¥JavaScript¥
            
答えのアイコン

解説

まずアイコンとメニュが重なっているのでメニュの上側を開けなければなりません。なのでアイコンの縦幅をinnerHeightで取得し、menuにpadding-topを用いてあけてあげます。そして次に初期状態ではメニュは隠れていなければならないのでleftで画面外左にメニュの横幅分移動させておきます。あとは簡単でメニュがクリックされた時、メニュを画面左からの距離を0にし、フェードイン。もう一度クリックされた時はその逆でフェードアウトさせれば終わりです。
完了にする!
LINEの友達追加でお役立ち動画をGET!!