こんにちは、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)で確認したところ、クローズ時に一瞬引っかかるような動きをします。
このままでも大きな問題はないと思いますが、出来れば一階層タイプのようにスムーズな動きになって欲しいものです。
修正対応は可能でしょうか。