JavaScript

ハンバーガメニューをつくってみた

ハンバーガーメニュー

簡易的なハンバーガーメニューです。
コピペしたら使えます。

デザインは好きなCSS当ててください。

HTML

<div id="hamburger_header" class="hamburger_header">

CSS例

.clearfix:after {
    content: " ";
    display: block;
    clear: both;
  }

  .navToggle {
    display: none;
    /*通常時は非表示にしておきます*/
    position: absolute;
    /*bodyに対しての絶対位置指定です*/
    right: 13px;
    top: 13px;
    width: 30px;
    height: 25px;
    cursor: pointer
  }

  .navToggle div {
    position: relative
  }
  /*spanの絶対位置指定の親にします*/

  .navToggle span {
    display: block;
    position: absolute;
    /*#navToggle div に対して*/
    width: 100%;
    border-bottom: solid 3px #999;
    -webkit-transition: .35s ease-in-out;
    -moz-transition: .35s ease-in-out;
    transition: .35s ease-in-out
  }

  .navToggle span:nth-child(1) {
    top: 0
  }

  .navToggle span:nth-child(2) {
    top: 11px
  }

  .navToggle span:nth-child(3) {
    top: 22px
  }

  .hamburger_header {
    position: fixed;
    top: 0;
    width: 100%;
  }

  .navTop {
    background-color: #ccc;
    height: 30px;
    margin: 0;
  }

  .nav {
    margin: 0;
    background: #eee;
    transition-property: all;
    transition-duration: 0.6s;
    transition-timing-function: ease-out;
  }

  .nav ul {
    margin: 0;
    list-style: none;
    padding-left: 15px;
  }

  .nav a {
    text-decoration: none;
    color: #000;
  }

  .navClose {
    opacity: 0;
  }

  .navOpen {
    opacity: 1;
  }

  .icon-animation {
    width: 30px;
    height: 30px;
    float: right;
    display: block;
    background: rgba(255, 255, 255, 0.02);
    position: relative;
    margin-right: 15px;
  }

  .icon-animation span {
    width: 30px;
    height: 1px;
    display: block;
    background: #000;
    position: absolute;
    right: 0;
    top: 50%;
    margin-left: -25px;
  }

  .type-1 span {
    -webkit-transition: all 0.3s;
    transition: all 0.3s;
    -webkit-transform: rotate(0deg);
    -ms-transform: rotate(0deg);
    transform: rotate(0deg);
  }

  .type-1 .top {
    -webkit-transform: translateY(-10px);
    -ms-transform: translateY(-10px);
    transform: translateY(-10px);
  }

  .type-1 .bottom {
    -webkit-transform: translateY(10px);
    -ms-transform: translateY(10px);
    transform: translateY(10px);
  }

  .type-1.is-open .middle {
    background: rgba(255, 255, 255, 0);
  }

  .type-1.is-open .top {
    -webkit-transform: rotate(-45deg) translateY(0px);
    -ms-transform: rotate(-45deg) translateY(0px);
    transform: rotate(-45deg) translateY(0px);
  }

  .type-1.is-open .bottom {
    -webkit-transform: rotate(45deg) translateY(0px);
    -ms-transform: rotate(45deg) translateY(0px);
    transform: rotate(45deg) translateY(0px);
  }

  body {
    animation-name: hamburger;
    animation-duration: 10s;
    position: relative;
  }

  .doAnim {
    animation: hamburger 2s forwards;
  }

JS

      var hamburgerMenuList = {
        'はじめに': 'https://***',
        'このサイトについて': 'https://***',
        'メイン': 'https://***',
        'お問い合わせ': 'https://***',
        'さいごに': 'https://***'
      };

      var myUtil = {
        debug: true,
        log: function() {
          if (!this.debug || !(window.console && typeof window.console.log === 'function')) {
            return;
          }
          for (var i = 0, s = arguments.length; i < s; i++) {
            console.log(arguments[i]);
          }
        },
        get: function(selector) {
          return document.querySelector(selector);
        },
        createElm: function(tagName, option) {
          var elm = document.createElement(tagName);
          for (key in option) {
            var value = option[key];
            elm.setAttribute(key, value);
          }
          return elm;
        },
        addEvent: function(elm, eventName, cb) {
          elm.addEventListener(eventName, cb);
        },
        addClass: function(elm, className) {
          return elm.classList.add(className);
        },
        removeClass: function(elm, className) {
          return elm.classList.remove(className);
        },
        toggleClass: function(elm, className) {
          return elm.classList.toggle(className);
        },
        hasClass: function(elm, className) {
          return elm.classList.contains(className);
        }
      };


      (function(hb) {

        /***********関数定義***********/

          //nav生成関数
          function navMake() {
            wrapElm.appendChild(navTopElm);

            var navToggleElm = hb.createElm('div', {
              'class': 'navToggle'
            });
            wrapElm.appendChild(navToggleElm);

            navElm = hb.createElm('nav', {
              'class': 'nav navClose'
            });
            wrapElm.appendChild(navElm);
          }

          //icon生成関数
          function iconMake() {
            //iconWrapElm = elmMake();
            iconWrapElm = hb.createElm('div', {
              'class': 'icon-animation type-1'
            });
            navTopElm.appendChild(iconWrapElm);

            var iconTopElm = hb.createElm('span', {
              'class': 'top'
            });
            iconWrapElm.appendChild(iconTopElm);

            var iconMiddleElm = hb.createElm('span', {
              'class': 'middle'
            });
            iconWrapElm.appendChild(iconMiddleElm);

            var iconBottomElm = hb.createElm('span', {
              'class': 'bottom'
            });
            iconWrapElm.appendChild(iconBottomElm);

            console.log(iconWrapElm);
            return iconWrapElm;

          }

          //list生成関数
          function listMake() {
            var listWrapElm = hb.createElm('ul');
            navElm.appendChild(listWrapElm);

            for (var key in hamburgerMenuList) {
              menuElm = hb.createElm('li');
              listWrapElm.appendChild(menuElm);
              menuLinkElm = hb.createElm('a', {
                'href': hamburgerMenuList[key]
              });

              menuLinkElm.innerHTML = key;
              menuElm.appendChild(menuLinkElm);

              var headerHight = navTopElm.clientHeight;
              var bodyElm = hb.get('body');
              var htmlElm = hb.get('body');
              var styleSheet = document.styleSheets[0];
              var targetRuleIndex = styleSheet.cssRules.length;
            }

          }


          //icon Open OR Close判定関数
          function menuClick(elm) {
            hb.addEvent(elm, 'click', function() {
              hb.toggleClass(navElm, 'navClose');
              hb.toggleClass(navElm, 'navOpen');
              hb.toggleClass(iconWrapElm, 'is-open');
            });
          }


          //指定リンク先への遷移関数
          function linkJump(){
            var href = this.getAttribute('href');
            location.href = href;
          }



        /***********処理実行***********/

          var wrapElm = hb.get('#hamburger_header');
          var iconWrapElm , navElm , menuLinkElm , menuElm;
          var navTopElm = hb.createElm('div', {
            'class': 'navTop clearfix'
          });


          iconMake();
          navMake();
          listMake();
          menuClick(iconWrapElm);

          //イベント
          hb.addEvent(menuLinkElm, 'click', linkJump);
          menuClick(menuElm);
      }(myUtil));