開閉式メニューをCSSのみで作る

ドロワーメニュー、または三本線の形状からハンバーガーメニューとも呼ばれている開閉式のボタン。当サイトでは常に右上に表示中。

8320.png

Movable Typeの公式テンプレートに標準装備されていた機能だが、パソコン表示時はカテゴリーがずらりと並ぶ仕様で。

8308.gif

カテゴリー数が多いと、メニューがごちゃごちゃに。

8309.gif

タブレットやスマートフォン表示時はすっきりしているが、この三本線は画像使用だった。

8310.gif

そもそも常時これでいい、と弄ってるうち、画像不使用、スタイルシートだけで実装出来ると分かり。

8317.png

参考にしたのは以下サイト様。

テンプレート

三行目の<div id="menu">から最後から二行目の</div>がメニュー部分。大体こんな感じでheaderに収めてある。

<header>
<h1><a href="<mt:BlogURL>" title="<mt:BlogName>"><mt:BlogName></a></h1>
 
<div id="menu">
<input type="checkbox" id="menu-btn-check">
<label for="menu-btn-check" id="menu-btn"><span></span></label>
<span id="menu-label">menu</span>
<nav id="menu-content">
<ul>
<mt:TopLevelCategories><mt:If tag="CategoryCount">
<li><a href="<mt:CategoryArchiveLink>"><mt:CategoryLabel></a></li>
</mt:If></mt:TopLevelCategories>
</ul>
</nav>
</div>
 
</header>

checkboxは機能上必要なだけで、スタイルシートで非表示に。空の<span></span>で三本線を出力。「menu」の文字が不要ならば、その行も不要。menu-content内にカテゴリーリンクを収納。

スタイルシート

濃い背景色(灰色 #999999)のheaderにボタンという前提で配色して、大体こんな感じ。

#menu-btn{
cursor: pointer;
z-index: 90;
position: fixed;
display: flex;
top: 10px;
right: 20px;
height: 40px;
width: 40px;
justify-content: center;
align-items: center;
background-color: #f5f5f5;
border-radius: 5px;
}
#menu-btn span, #menu-btn span:before, #menu-btn span:after{
position: absolute;
display: block;
width: 24px;
height: 3px;
background-color: #999999;
border-radius: 3px;
content: '';
}
#menu-btn span:before{
bottom: 8px;
}
#menu-btn span:after{
top: 8px;
}
#menu-btn-check{
display: none;
}
#menu-btn-check:checked ~ #menu-btn span{
background-color: rgba(255, 255, 255, 0);
}
#menu-btn-check:checked ~ #menu-btn span::before{
bottom: 0;
transform: rotate(45deg);
}
#menu-btn-check:checked ~ #menu-btn span::after{
top: 0;
transform: rotate(-45deg);
}
#menu-label{
position: fixed;
top: 55px;
right: 20px;
color: #ffffff;
font-size: 0.9em;
}
#menu-content{
z-index: 80;
position: fixed;
top: 0;
right: 100%;
overflow: auto;
width: 400px;
max-height: 100%;
background-color: #ffffff;
opacity: 0.9;
padding: 30px 20px 3px 20px;
}
#menu-content ul li{
display: block;
padding: 3px;
border-bottom: solid 1px #cccccc;
font-size: 0.9em;
text-align: left;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
-webkit-text-overflow: ellipsis;
}
#menu-content ul li a{
display: block;
}
#menu-btn-check:checked ~ #menu-content{
right: 0;
box-shadow: 0 0 7px 7px rgba(0, 0, 0, 0.16);
}

ボタンを開くと、三本線のうち一本を消し、二本をクロスさせて「×」印を描画するという仕組み。元ページの上に被せてあるのを示すため、カテゴリーリンクの背景色は半透明化してある。「z-index」の数値は適宜設定で。

カテゴリーリンク枠について、パソコンでは幅400px指定で右上にちんまり表示させているが、タブレット以下では画面幅いっぱいに表示されるよう設定。

@media(max-width:768px) {
   #menu-content{
   width: 100%;
   }
}

パソコンなど大画面表示時。

8316.png

タブレットやスマートフォンなど狭い画面での表示。

8318.png

また、スマートフォン表示のみ、サイト名部分の上部ヘッダーを固定し、「menu」の文字を隠してある。

8315.png

8317.png

大体こんな感じ。

@media(max-width:480px) {
   body{
   padding-top: 60px;
   }
   header{
   position: fixed;
   top: 0;
   left: 0;
   width: 100%;
   height: 60px;
   padding: 14px 0px;
   z-index: 1000;
   }
   #menu-label{
   display: none;
   }
}

Java Script(任意)

例えば、Aカテゴリーページを表示中にメニューを開き、カテゴリーリンクに載せてあるAカテゴリーへ移動する場合、つまり同ページなので移動になっていないので、カテゴリーリンクが画面に残ってしまう。「×」でメニューを閉じれば良いが、それを自動的に閉じたい場合はJava Scriptで対応。

以下を記したファイル「menu.js」を作成。既存のjsファイルに追記するも可。

$(function() {
   $('#menu-content a').click(function() {
     $('#menu-checkbox').removeAttr('checked').prop('checked', false).change();
   });
});

share