こんにちは、daimaです。
本日は以前ご紹介した
こちらのハンバーガーメニューにさらに
各親メニューに対する子ページへの開閉式リンクを追加した
機能追加版をご紹介します。
デモとソースコード
※メニュー内「ABOUT」と「WORKS」の右にある
+ボタンをクリックすると子ページへのリンクを開閉することができます。
<div class="el_humburger"><!--ハンバーガーボタン--> <div class="el_humburger_wrapper"> <span class="el_humburger_bar top"></span> <span class="el_humburger_bar middle"></span> <span class="el_humburger_bar bottom"></span> </div> </div> <header class="navi"> <div class="navi_inner"> <div class="navi_item js_openParent"><a href="">ABOUT</a> <div class="el_spChildNavOpen js_openSwitch"> <div class="el_spChildNavOpen_wrapper"></div> </div> <div class="nav_child js_openTarget"> <div class="nav_child_item"> <a href=""></a> ABOUTの子ページ </div> <div class="nav_child_item"> <a href=""></a> ABOUTの子ページ </div> <div class="nav_child_item"> <a href=""></a> ABOUTの子ページ </div> <div class="nav_child_item"> <a href=""></a> ABOUTの子ページ </div> <div class="nav_child_item"> <a href=""></a> ABOUTの子ページ </div> </div> <div class="bl_nav_item_spToggle"></div> </div> <div class="navi_item js_openParent"><a href="">WORKS</a> <div class="el_spChildNavOpen js_openSwitch"> <div class="el_spChildNavOpen_wrapper"></div> </div> <div class="nav_child js_openTarget"> <div class="nav_child_item"> <a class="hp_coverLink" href=""></a> WORKSの子ページ </div> <div class="nav_child_item"> <a class="hp_coverLink" href=""></a> WORKSの子ページ </div> <div class="nav_child_item"> <a class="hp_coverLink" href=""></a> WORKSの子ページ </div> <div class="nav_child_item"> <a class="hp_coverLink" href=""></a> WORKSの子ページ </div> <div class="nav_child_item"> <a class="hp_coverLink" href=""></a> WORKSの子ページ </div> </div> <div class="bl_nav_item_spToggle"></div> </div> <div class="navi_item"><a href="">GALLERY</a></div> <div class="navi_item"><a href="">FLOW</a></div> <div class="navi_item"><a href="">FAQ</a></div> <div class="navi_item"><a href="">CONTACT</a></div> </div> </header> <div class="mainView"> <!--ページコンテンツ--> </div> <!--CDNでjQuery読み込む--> <script src="https://code.jquery.com/jquery-2.2.4.min.js" integrity="sha256-BbhdlvQf/xTY9gja0Dq3HiwQF8LaCRTXxZKRutelT44=" crossorigin="anonymous"></script>
body{ margin: 0; } a{ color: #040404; text-decoration: none; } .mainView{ width: 100vw; height: 100vh; background-color: #ccc; } /*ハンバーガーボタン*/ .el_humburger { position: fixed; top: 45px; right: 60px; width: 46px; height: 25px; padding-top: 1px; -webkit-box-sizing: border-box; box-sizing: border-box; padding-top: 0px; z-index: 20; cursor: pointer; pointer-events: auto; color: #000; text-align: center;} @media screen and (max-width: 840px) { .el_humburger { display: block; right: 0; top: 0; padding-top: 20px; width: 70px; height: 70px;} #factory .el_humburger { display: none; } } .el_humburger_wrapper { margin-bottom: 5px; width: 42px; display: inline-block; } @media screen and (max-width: 840px) { .el_humburger_wrapper { margin-bottom: 5px; width: 30px; } } .el_humburger_text { font-size: 12px; letter-spacing: 0.1em; font-family: "游ゴシック Medium", YuGothic, "Yu Gothic", "ヒラギノ角ゴ Pro", "Hiragino Kaku Gothic Pro", "メイリオ", Meiryo, sans-serif; } .js_humburgerOpen .el_humburger_text.el_humburger_text__menu { display: none; } .el_humburger_text.el_humburger_text__close { display: none; } .js_humburgerOpen .el_humburger_text.el_humburger_text__close { display: block; } @media screen and (max-width: 840px) { .el_humburger_text { font-size: 10px; padding-top: 2px; } } @media screen and (max-width: 840px) { .el_humburger_text svg path { -webkit-transition: all 200ms cubic-bezier(0.16, 0.52, 0.25, 1); -o-transition: all 200ms cubic-bezier(0.16, 0.52, 0.25, 1); transition: all 200ms cubic-bezier(0.16, 0.52, 0.25, 1); fill: #000; } } @media screen and (max-width: 840px) { .js_humburgerOpen .el_humburger_text svg path { fill: #000; } } .el_humburger span.el_humburger_bar { display: block; width: 100%; margin: 0 auto 9px; height: 1px; background: #000; -webkit-transition: all .2s ease-in-out; -o-transition: all .2s ease-in-out; transition: all .2s ease-in-out; } .el_humburger span.el_humburger_bar:last-child { margin-bottom: 0; } .js_humburgerOpen .el_humburger span.el_humburger_bar { background: #000; } @media screen and (max-width: 840px) { .el_humburger span.el_humburger_bar { left: 0; top: 0; background: #000; } } .js_humburgerOpen .el_humburger span.el_humburger_bar.top { -webkit-transform: translateY(9px) rotate(-45deg); -ms-transform: translateY(9px) rotate(-45deg); transform: translateY(9px) rotate(-45deg); } .js_humburgerOpen .el_humburger span.el_humburger_bar.middle { opacity: 0; } .js_humburgerOpen .el_humburger span.el_humburger_bar.bottom { -webkit-transform: translateY(-11px) rotate(45deg); -ms-transform: translateY(-11px) rotate(45deg); transform: translateY(-11px) rotate(45deg); } .el_humburgerButton.el_humburgerButton__close { top: 2%; right: 2%; } .el_humburgerButton__close span.el_humburger_bar { display: block; width: 35px; margin: 0 auto; height: 4px; background: #000; } .el_humburgerButton__close span.el_humburger_bar.top { -webkit-transform: translateY(5px) rotate(-45deg); -ms-transform: translateY(5px) rotate(-45deg); transform: translateY(5px) rotate(-45deg); } .el_humburgerButton__close span.el_humburger_bar.bottom { -webkit-transform: translateY(-6px) rotate(45deg); -ms-transform: translateY(-6px) rotate(45deg); transform: translateY(-6px) rotate(45deg); } .navi { position: fixed; right: 0; height: 100%; background-color: rgba(255, 255, 255, 0.9); width: 450px; z-index: 3; padding-top: 100px; -webkit-box-sizing: border-box; box-sizing: border-box; -webkit-transition: all 600ms ease-out; -o-transition: all 600ms ease-out; transition: all 600ms ease-out; transform:translateZ(0) translateX(100%); overflow: auto; } .js_humburgerOpen .navi { transform:translateZ(0) translateX(0); } @media screen and (max-width: 840px) { .navi { padding: 100px 5% 0; } .js_humburgerOpen .navi { width: 100%;} } .navi_item { position:relative; margin-bottom: 28px; font-size: 20px; font-family: "Marcellus", serif !important; white-space: nowrap; margin-left: 90px; } .navi_item.op_innerLink { cursor: pointer; } @media screen and (max-width: 840px) { .navi_item { margin-left: 0; font-size: 18px; } } .el_spChildNavOpen { position: absolute; top: -6px; left: 80%; z-index: 20; -webkit-transition: all 200ms ease-out; -o-transition: all 200ms ease-out; transition: all 200ms ease-out; -webkit-transform-origin: center; -ms-transform-origin: center; transform-origin: center; padding: 10px; } .js_openParent.js_fire > .el_spChildNavOpen { -webkit-transform: rotate(180deg); -ms-transform: rotate(180deg); transform: rotate(180deg); } .js_openParent.js_fire > .el_spChildNavOpen > .el_spChildNavOpen_wrapper:after { -webkit-transform: rotate(90deg); -ms-transform: rotate(90deg); transform: rotate(90deg); opacity: 0; } .el_spChildNavOpen_wrapper { position: relative; width: 15px; height: 15px; -webkit-transition: all 200ms ease-out; -o-transition: all 200ms ease-out; transition: all 200ms ease-out; -webkit-transform-origin: center; -ms-transform-origin: center; transform-origin: center; } .el_spChildNavOpen_wrapper:before { content: ""; width: 100%; height: 1px; background-color: #111; position: absolute; top: calc(50% - 1px); } .el_spChildNavOpen_wrapper:after { content: ""; width: 1px; height: 100%; background-color: #111; position: absolute; left: calc(50% - 1px); -webkit-transition: all 200ms ease-out; -o-transition: all 200ms ease-out; transition: all 200ms ease-out; } .nav_child{ padding-top:20px; } .nav_child_item{ position: relative; font-size:16px; padding-left:20px; margin-bottom:10px; } .nav_child_item > a{ position:absolute; left:0; right:0; bottom:0; top:0; } .nav_child_item:last-child{ margin-bottom:0px; } .js_openSwitch { cursor: pointer; } .js_openTarget { display: none; }
//変数定義 var navigationOpenFlag = false; var navButtonFlag = true; var focusFlag = false; //toggle $(function(){ $(document).on('click','.js_openSwitch',function(){ $(this).parent('.js_openParent').find(' > .js_openTarget').slideToggle("fast"); $(this).parent('.js_openParent').toggleClass('js_fire'); }); }); //ハンバーガーメニュー $(function(){ $(document).on('click','.el_humburger',function(){ if(navButtonFlag){ spNavInOut.switch(); //一時的にボタンを押せなくする setTimeout(function(){ navButtonFlag = true; },200); navButtonFlag = false; } }); $(document).on('click touchend', function(event) { if (!$(event.target).closest('.navi,.el_humburger').length && $('body').hasClass('js_humburgerOpen') && focusFlag) { focusFlag = false; //scrollBlocker(false); spNavInOut.switch(); } }); }); //ナビ開く処理 function spNavIn(){ $('body').removeClass('js_humburgerClose'); $('body').addClass('js_humburgerOpen'); setTimeout(function(){ focusFlag = true; },200); setTimeout(function(){ navigationOpenFlag = true; },200); } //ナビ閉じる処理 function spNavOut(){ $('body').removeClass('js_humburgerOpen'); $('body').addClass('js_humburgerClose'); setTimeout(function(){ $(".uq_spNavi").removeClass("js_appear"); focusFlag = false; },200); navigationOpenFlag = false; } //ナビ開閉コントロール var spNavInOut = { switch:function(){ if($('body.spNavFreez').length){ return false; } if($('body').hasClass('js_humburgerOpen')){ spNavOut(); } else { spNavIn(); } } };
おわりに
画面の狭いスマートフォンなどに対しては
特にこういった省スペースの工夫が必須になります。
手間はかかりますが
訪問者が見やすいサイトを作るためと思って
頑張りたいところですね。
コメント
多階層ハンバーガーメニューを実装するためにdrawer.js+iscroll.js+bootstrapという大変複雑な仕組みを使用していましたが、daimaさんのページにたどり着きました。
すぐにでも使用させていただきたいのですが、スマホ(iphone)で確認したところ、クローズ時に一瞬引っかかるような動きをします。
このままでも大きな問題はないと思いますが、出来れば一階層タイプのようにスムーズな動きになって欲しいものです。
修正対応は可能でしょうか。