CSSのみで作る追従ドロワーメニュー【jQuery不要】
ほとんどのスマホサイトやアプリで採用されている、3本線のボタンを押すとメニューが表示される「ドロワーメニュー」。
※ハンバーガーメニューやスライドメニューなどとも呼ばれています。
ドロワーメニューはHTML+CSSのみで実装が可能で、jQueryやfontawesomeなどのライブラリを読み込む必要もなく、お手軽に実装できます。
完成ソースコードはこちら
作成したソースコードと共に解説していきますので、まずはソースコードを見てみてください。
HTML
ドロワーメニューを機能させるHTMLの記述です。
<body>タグの直下に置いてください。
中央にサイトアイコンなどの表示が不要な場合は、.header-site-iconの部分は削除してください。
<body>
<div class="header-fixed">
<div class="header-fixed-in">
<input type="checkbox" id="header-hamburger"><!-- チェックボックス非表示 -->
<label for="header-hamburger" class="header-hamburger-icon"><span></span></label><!-- チェックボックスラベルのハンバーガーメニュー -->
<label id="header-close" for="header-hamburger"></label><!-- 背景暗くする用 -->
<div id="header-content">
<!-- 表示時のコンテンツの中身 -->
<ul>
<li>コンテンツ1</li>
<li>コンテンツ2</li>
<li>コンテンツ3</li>
<li>コンテンツ4</li>
<li>コンテンツ5</li>
</ul>
</div>
<!-- サイトアイコンを中央に表示 -->
<div class="header-site-icon">
<img src="https://kinocolog.com/wp-content/uploads/2019/07/kinocolog_white.png">
</div>
</div>
</div>
</body>
記述の内容はごく単純で、
「チェックボックス(#header-hamburger)にチェックが入る」
↓
「#header-closeと#header-contentを表示」
としているだけです。
チェックボックスはform部品そのまま使用しているわけではなく、ラベル要素を使用して、チェックボックスの仕組みを担っています。
ラベルにあたる部分は、三本線の←これで、タップするとチェックが入る⇒特定の要素が表示される仕組みをCSSに仕組んでいます。
CSS
次に、肝となるCSSの設定です。
各項目ごとに、ソースコードで簡単な解説を添えておりますのでご確認ください。
.header-fixed{
/* 追従 */
position: -webkit-sticky;
position: sticky;
top: 0;
padding: 10px;
z-index: 100000;
background-color: #00AA13;
box-sizing: border-box;
}
.header-fixed-in{
position: relative;
height: 30px; /* ヘッダーの縦幅を指定 */
}
/* チェックボックスは非表示(ラベルで操作するため) */
#header-hamburger{
display: none;
}
/* ハンバーガーアイコンの位置を指定(左) */
.header-hamburger-icon{
position: absolute;
top: 50%;
left: 0;
-webkit-transform: translateY(-50%);
transform: translateY(-50%);
}
/* ハンバーガーアイコンの三本線をCSSで書く(上下の線) */
.header-hamburger-icon span{
display: block;
position: relative;
width: 30px;
height: 20px;
border-top: solid 4px #FFF;
border-bottom: solid 4px #FFF;
box-sizing: border-box;
cursor: pointer;
}
/* ハンバーガーアイコンの三本線をCSSで書く(中央の線) */
.header-hamburger-icon span:before{
position: absolute;
content: '';
width: 100%;
height: 4px;
top: 4px;
background-color: #FFF;
}
/* 中央にサイトロゴを表示 */
.header-site-icon{
height: 100%;
position: absolute;
top: 50%;
left: 50%;
-webkit-transform: translateY(-50%) translateX(-50%);
transform: translateY(-50%) translateX(-50%);
}
.header-site-icon img{
width: auto;
height: 100%;
}
/* 背景を暗くする(デフォルトは非表示) */
#header-close{
display: none;
position: fixed;
z-index: 150000;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: #000;
opacity: 0;
}
/*スライドで表示させるコンテンツ*/
#header-content{
z-index: 200000;
overflow: auto;
position: fixed;
top: 0;
left: 0;
height: 100%;
width: 60%;
max-width: 300px;
box-sizing: border-box;
padding: 5px;
transition: .3s;
background: #FFF;
/* デフォルト非表示(左側の見えないところに位置させる) */
-webkit-transform: translateX(-100%);
transform: translateX(-100%);
}
/*チェックが入ったらコンテンツを表示*/
#header-hamburger:checked ~ #header-content{
-webkit-transform: translateX(0%);
transform: translateX(0%);
}
/*チェックが入ったらコンテンツ外を暗くする*/
#header-hamburger:checked ~ #header-close{
display: block;
opacity: .7;
}
追従するメニュー全体を「.header-fixed」で囲んであります。
そしてこの要素に「position: sticky」と記述することで、親要素に自動的に追従するようになります。
参考 CSSのposition:stickyの使い方と効かないケースを解説
.header-hamburger-icon spanは、ハンバーガーメニューを再現するための記述です。
要素の上と下に太いボーダーを付けて、疑似要素の:beforeで中央に線を引いています。
そして、#header-hamburger:checked ~ は、「チェックボックスにチェックが入ったら、このスタイルを適用する」という記述です。
「~」は同階層に位置する要素を指定するものなので、チェックが入ると「#header-content」と「#header-close」のスタイルが変化します。
transitionを設定することで、CSSのみでアニメーション的な動きも取り入れることが出来ますね。
昔はこの手の機能はjQueryありきでしたが、今はCSSだけで簡単に追従及びドロワーメニュー(ハンバーガーメニュー)を実装できるようになりました。
スマホでは最も主流かつ、ユーザーになじみのあるメニュー操作なので、是非実装してみましょう。
以上、CSSのみで作る追従ドロワーメニュー、でした。

ディスカッション
コメント一覧
まだ、コメントがありません