LoginSignup
1
1

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-12-18

ハンバーガーメニュー

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

デザインは好きな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));
1
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1