昔から使用させてもらっているライブラリ『Pushy』。
筆者の備忘録として、雛形と利用方法をこの記事にて紹介します。jQueryで簡単実装できますのでドロワーメニューを実装したいという方はぜひご活用ください。
デモ
まずは挙動イメージを確認。
メニューアイコンにクリック(タップ)イベントが起きると、メニューコンテンツが現れるようになっています。
隠れていたメニューコンテンツの表示と同時に、コンテンツ要素もメニューと同横幅分ズラすようにCSSで調整しています。
ワラ
HTML
HTMLは以下。そのままコピーして利用いただけます。
※jqueryの読み込み部分はhead内で行った方がいいです。
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script> <nav class="pushy pushy-left"> <div class="pushy-content"> <ul> <li class="pushy-link"><a href="#">メインメニュー 1</a></li> <li class="pushy-link"><a href="#">メインメニュー 2</a></li> <li class="pushy-submenu"> <button>ドロップダウンメニュー 1</button> <ul> <li class="pushy-link"><a href="#">ドロップダウンメニュー 1-1</a></li> <li class="pushy-link"><a href="#">ドロップダウンメニュー 1-2</a></li> <li class="pushy-link"><a href="#">ドロップダウンメニュー 1-3</a></li> </ul> </li> <li class="pushy-submenu"> <button>ドロップダウンメニュー 2</button> <ul> <li class="pushy-link"><a href="#">ドロップダウンメニュー 2-1</a></li> <li class="pushy-link"><a href="#">ドロップダウンメニュー 2-2</a></li> <li class="pushy-link"><a href="#">ドロップダウンメニュー 2-3</a></li> </ul> </li> </ul> </div> </nav> <button class="menu-btn"> <span class="menu-btn__lines"> <span class="menu-btn__line"></span> <span class="menu-btn__line"></span> </span> </button> <div class="site-overlay"></div> <section class="container">hoge</section> <section class="container">hogehoge</section> <section class="container">huga</section> <section class="container">hugahuga</section> <script src="https://cdnjs.cloudflare.com/ajax/libs/pushy/1.1.2/js/pushy.min.js"></script>
メニューコンテンツ要素を編集したい場合は、<div class="pushy-content">の中を編集、追加したい要素を記述してください。
雛形では左からのメニュー出現としておりますが、右からの出現とすることもできます。2行目の<nav class="pushy pushy-left">のクラス『pushy-left』を『pushy-right』に置き換えてください。
メニューが右から出現するようになります。
CSS
CSSは以下。
body{margin: 0;padding: 0;border: 0;outline: 0;-webkit-text-size-adjust: 100%;} *:not(.pushy):not(.menu-btn):not(.site-overlay){-webkit-transition: -webkit-transform .2s ease-out;transition: -webkit-transform .2s ease-out;transition: transform .2s ease-out;transition: transform .2s ease-out, -webkit-transform .2s ease-out;} /* ================================== menu ================================== */ /* menu-btn */ .menu-btn{text-align: center;border: 0;-webkit-appearance: button;cursor: pointer;border-radius: 50%;background-color: #fff;box-shadow: 0 0 36px 0 rgba(10,10,50,0.15);cursor: pointer;-webkit-transition: box-shadow 0.5s cubic-bezier(0.19, 1, 0.22, 1),opacity 0.5s cubic-bezier(0.19, 1, 0.22, 1);transition: box-shadow 0.5s cubic-bezier(0.19, 1, 0.22, 1),opacity 0.5s cubic-bezier(0.19, 1, 0.22, 1);width: 64px;height: 64px;position: fixed;z-index: 15;top: 40px;left: 40px;} .menu-btn:hover{box-shadow:0 0 0 0 rgba(10,10,50,0.15)} .menu-btn .menu-btn__lines {position: absolute;top: 50%;left: 50%;-webkit-transform-origin: center center;-ms-transform-origin: center center;transform-origin: center center;-webkit-transform: translate(-50%, -50%);-ms-transform: translate(-50%, -50%);transform: translate(-50%, -50%);-webkit-transition: -webkit-transform .2s ease-out;transition: -webkit-transform .2s ease-out;transition: transform .2s ease-out;transition: transform .2s ease-out, -webkit-transform .2s ease-out; width: 20px;height: 13px;} .menu-btn .menu-btn__line {display: block;position: absolute;left: 0;background-color: #200706;-webkit-transition: all .3s ease-out;transition: all .3s ease-out;height: 3px;width: 20px;} .menu-btn .menu-btn__line:first-of-type {top:0;} .menu-btn .menu-btn__line:last-of-type {bottom:0;} .pushy-open-left .menu-btn .menu-btn__line:first-of-type {-webkit-transform: rotate(45deg);-ms-transform: rotate(45deg);transform: rotate(45deg);top: 5px;} .pushy-open-left .menu-btn .menu-btn__line:last-of-type {bottom: 5px;-webkit-transform: rotate(-45deg); -ms-transform: rotate(-45deg);transform: rotate(-45deg);} @media screen and (max-width:640px){ .menu-btn{width: 50px;height: 50px;top: 20px;left: 20px;} .menu-btn .menu-btn__lines {} .pushy-open-left .menu-btn .menu-btn__line:first-of-type {top: 5px;} .pushy-open-left .menu-btn .menu-btn__line:last-of-type {bottom: 5px;} } .pushy {position: fixed;width: 240px;height: 100%;top: 0;z-index: 9999;background: #191918;overflow: auto;-webkit-overflow-scrolling: touch;/* enables momentum scrolling in iOS overflow elements */} .pushy a{display:block; color:#b3b3b1; padding:15px 30px; text-decoration:none} .pushy a:hover{color:#fff} .pushy.pushy-left {left: 0;} .pushy.pushy-right {right: 0;} .pushy-content {visibility: hidden;} @media screen and (max-width:640px){ .pushy {width: 200px;} } /* menu Movement */ .pushy-left {-webkit-transform: translate3d(-240px, 0, 0);-ms-transform: translate3d(-240px, 0, 0);transform: translate3d(-240px, 0, 0);} .pushy-open-left .menu-btn, .pushy-open-left > *:not(.pushy):not(.menu-btn):not(.site-overlay){-webkit-transform: translate3d(240px, 0, 0) ;-ms-transform: translate3d(240px, 0, 0) ;transform: translate3d(240px, 0, 0) ;} .pushy-right {-webkit-transform: translate3d(240px, 0, 0);-ms-transform: translate3d(240px, 0, 0);transform: translate3d(240px, 0, 0);} .pushy-open-right > *:not(.pushy):not(.menu-btn):not(.site-overlay), .pushy-open-right .push {-webkit-transform: translate3d(-240px, 0, 0);-ms-transform: translate3d(-240px, 0, 0);transform: translate3d(-240px, 0, 0);} .pushy-open-left .pushy, .pushy-open-right .pushy {-webkit-transform: translate3d(0, 0, 0);-ms-transform: translate3d(0, 0, 0);transform: translate3d(0, 0, 0);} .pushy-open-left .pushy-content, .pushy-open-right .pushy-content {visibility: visible;} @media screen and (max-width:640px){ .pushy-left {-webkit-transform: translate3d(-200px, 0, 0);-ms-transform: translate3d(-200px, 0, 0);transform: translate3d(-200px, 0, 0);} .pushy-open-left .menu-btn, .pushy-open-left > *:not(.pushy):not(.menu-btn):not(.site-overlay) {-webkit-transform: translate3d(200px, 0, 0) ;-ms-transform: translate3d(200px, 0, 0);transform: translate3d(200px, 0, 0) ;} .pushy-right {-webkit-transform: translate3d(200px, 0, 0);-ms-transform: translate3d(200px, 0, 0);transform: translate3d(200px, 0, 0);} .pushy-open-right .push {-webkit-transform: translate3d(-200px, 0, 0);-ms-transform: translate3d(-200px, 0, 0);transform: translate3d(-200px, 0, 0);} } /* menu Transitions */ .pushy, .push {transition: transform 0.2s cubic-bezier(0.16, 0.68, 0.43, 0.99);} .pushy-content {transition: visibility 0.2s cubic-bezier(0.16, 0.68, 0.43, 0.99);} /* Site Overlay */ .site-overlay {display: none;} .pushy-open-left .site-overlay, .pushy-open-right .site-overlay {display: block;position: fixed;top: 0;right: 0;bottom: 0;left: 0;z-index: 14;background-color: rgba(0, 0, 0, 0.5);-webkit-animation: fade 500ms;animation: fade 500ms;} @keyframes fade {0% {opacity: 0;}100% {opacity: 1;}} @-webkit-keyframes fade { 0% {opacity: 0;} 100% {opacity: 1;}} /* menu */ .pushy-content ul{ padding:0; margin:0; list-style:none} .pushy-submenu ul{padding-left:15px; transition:max-height .2s ease-in-out,visibility .2s ease-in-out; font-size: 13px} .pushy-submenu ul .pushy-link{transition:opacity .2s ease-in-out} .pushy-submenu button{width:100%; color:#b3b3b1; padding:15px 30px; text-align:left; background:0 0; border:0;font-size: 13px} .pushy-submenu button:hover{color:#fff} .pushy-submenu>a, .pushy-submenu>button{position:relative} .pushy-submenu>a::after, .pushy-submenu>button::after{content:''; display:block; height:11px; width:8px; position:absolute; top:50%; right:15px; background:url(../img/arrow.svg) no-repeat; -webkit-transform:translateY(-50%); -ms-transform:translateY(-50%); transform:translateY(-50%); transition:transform .2s} .pushy-submenu-closed ul{max-height:0; overflow:hidden; visibility:hidden} .pushy-submenu-closed .pushy-link{opacity:0} .pushy-submenu-open ul{max-height:1000px; visibility:visible} .pushy-submenu-open .pushy-link{opacity:1} .pushy-submenu-open a::after, .pushy-submenu-open button::after{-webkit-transform:translateY(-50%) rotate(90deg); -ms-transform:translateY(-50%) rotate(90deg); transform:translateY(-50%) rotate(90deg)} /* ================================== contents ================================== */ .container{width: 100%; height: 500px; background: #00A676; color: #fff; display: flex;align-items: center;justify-content: center;} .container:nth-of-type(2){background: #09634A} .container:nth-of-type(3){background: #36F9C2} .container:nth-of-type(4){background: #2C473F}
基本的には編集の必要はありません。
メニューの出現を右からとした場合、メニューボタンの位置を変更したくなるかもしれません。その場合、11行目〜のメニューボタンに関するCSSを調整してください。
対応ブラウザ
一通り以下ブラウザでの挙動確認は取れております。
※古いバージョンでの確認はおこなっておりませんので、使用前に一度ご確認いただくことをお勧めします。
Safari / Google Chrome / InternetExplorer / Microsoft Edge / Mozilla Firefox
そのほかのおすすめフレーム
あらかじめ深い階層を想定したフレーム。カテゴリ階層の深いサイトではこちらがおすすめです。
http://mmenu.frebsite.nl/
以上、簡単なページを作成する際によく使うことがあるので書き残しました。