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

インターネット
» info 
ドロワーメニュー、または三本線の形状からハンバーガーメニューとも呼ばれている開閉...
開閉式メニューをCSSのみで作る

ドロワーメニュー、または三本線の形状からハンバーガーメニューとも呼ばれている開閉式のボタン。

00916.png

Movable Typeの公式テンプレートに標準装備されていた機能だが、三本線表示が画像だったのを、スタイルシートだけで実装。

当サイトでは、以下の例より色などの変更もあるが、右上に表示中。

テンプレート

三行目の<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>
<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-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-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%;
   }
}

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

00917.png

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

00918.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;
   }
}
posted on April 19, 2025 -