JavaScriptやjQueryを使わずに、CSSだけでハンバーガーメニューが作りたい。
やむを得ない事情でJavaScriptやjQueryが使えないことがあると思います。
そこで今回は、CSSのみでハンバーガーメニューを作ってみましょう。
CSSのみで作るハンバーガーメニュー【全体像】
下記が、今回の作成見本です。
右上のハンバーガーボタンをクリックすると、右からメニューが現われます。
今回JavaScriptやjQueryは使わず、CSSのみで作りました。
See the Pen CSSのみで作るハンバーガーメニュー by たけち (@kwxteqls-the-scripter) on CodePen.
コード全体は下記になります。
「解説は不要。コピペだけさせて」という方は、こちらをどうぞ。
<header class="header">
<div class="header__container">
<h1 class="header__logo"><a href="/">logo</a></h1>
<input type="checkbox" id="check">
<label for="check" class="hamburger">
<span></span>
</label>
<nav class="nav">
<ul class="nav__lIst">
<li class="nav__item"><a href="/">home</a></li>
<li class="nav__item"><a href="#">事業内容</a></li>
<li class="nav__item"><a href="#">会社概要</a></li>
<li class="nav__item"><a href="#">採用情報</a></li>
<li class="nav__item"><a href="#">お問い合わせ</a></li>
</ul>
</nav>
</div>
</header>
/* ===============================================
ヘッダーのスタイリング
=============================================== */
.header {
height: 80px;
background-color: #0f5474;
position: fixed;
top: 0;
left: 0;
right: 0;
}
.header__container {
max-width: 1000px;
display: flex;
justify-content: space-between;
align-items: center;
height: inherit;
color: #fff;
padding: 0 25px;
margin-right: auto;
margin-left: auto;
}
.header__logo a {
text-decoration: none;
font-size: 30px;
text-transform: uppercase;
color: #fff;
font-weight: bold;
}
/* ===============================================
ハンバーガーボタンのスタイリング
=============================================== */
input[type="checkbox"] {
opacity: 0;
visibility: hidden;
position: absolute;
}
.hamburger {
display: block;
width: 50px;
height: 80px;
position: relative;
display: flex;
justify-content: center;
align-items: center;
cursor: pointer;
}
.hamburger span,
.hamburger span::before,
.hamburger span::after {
position: absolute;
display: block;
content: "";
width: 100%;
height: 2px;
background-color: #fff;
transition: all 0.5s;
}
.hamburger span::before {
top: -10px;
}
.hamburger span::after {
bottom: -10px;
}
input[type="checkbox"]:checked + .hamburger span {
background-color: transparent;
}
input[type="checkbox"]:checked + .hamburger span::before {
top: 0;
transform: rotate(45deg);
}
input[type="checkbox"]:checked + .hamburger span::after {
bottom: 0;
transform: rotate(-45deg);
}
/* ===============================================
メニューのスタイリング
=============================================== */
.nav {
position: fixed;
width: 80%;
height: 100vh;
top: 80px;
right: -120%;
background-color: #0f5474;
color: #fff;
padding: 50px 0;
transition: all 0.5s;
}
.nav__item a {
display: block;
font-size: 20px;
padding: 20px 0 20px 50px;
text-transform: uppercase;
}
.nav__item a:hover {
color: #0f5474;
background-color: #fff;
}
input[type="checkbox"]:checked ~ .nav {
right: 0;
}
最大のポイントは、ハンバーガーボタンに<input type="checkbox">(チェックボックス)を利用している点です。
なぜチェックボックスを使うかというと、「チェックボックスがチェックされたかどうか」でメニューの開閉を制御するためです。
もちろん、このままじゃ使えないので、CSSでハンバーガーメニューっぽく加工していきます。
CSSのみでハンバーガーメニューを作る方法【パーツごとに解説】
パーツごとに解説していきます(ヘッダーは割愛します)。
ハンバーガーボタン(三本線)を作る
まずは、ハンバーガーボタン(三本線)を作りましょう。
なお、このパーツが今回の最重要ポイントです。
HTML
<input type="checkbox" id="check">
<label for="check" class="hamburger">
<span></span>
</label>
ポイントは、下の3つです。
- <input type="checkbox">を一番上に書く
- input要素のid属性とlabel要素のfor属性を同じ名前にする
- label要素の中にspanタグを入れる
まず、input要素は一番上に書くという点に注意してください(※順番を間違えると上手くいきません)。
2つめのポイントは、inputの「id属性」とlabelの「for属性」を同じにすることです。
これにより、labelをクリックしてもチェックボックスのON・OFFを切り替えできるようになります。
今回は「check」としましたが、名前は何でもOKです。
そして3つめのポイントが、label要素の中にspanタグを入れる点です。
spanタグでハンバーガーの三本線を表現するためです。
CSS
CSSでハンバーガーボタンをスタイリングしましょう。
全体のコードはこちらです。
/* ===============================================
ハンバーガーボタンのスタイリング
=============================================== */
input[type="checkbox"] {
opacity: 0;
visibility: hidden;
position: absolute;
}
.hamburger {
display: block;
width: 50px;
height: 80px;
position: relative;
display: flex;
justify-content: center;
align-items: center;
cursor: pointer;
}
.hamburger span,
.hamburger span::before,
.hamburger span::after {
position: absolute;
display: block;
content: "";
width: 100%;
height: 2px;
background-color: #fff;
transition: all 0.5s;
}
.hamburger span::before {
top: -10px;
}
.hamburger span::after {
bottom: -10px;
}
input[type="checkbox"]:checked + .hamburger span {
background-color: transparent;
}
input[type="checkbox"]:checked + .hamburger span::before {
top: 0;
transform: rotate(45deg);
}
input[type="checkbox"]:checked + .hamburger span::after {
bottom: 0;
transform: rotate(-45deg);
}
ポイントは以下の通りです。
- <input type="checkbox">を非表示にする
- spanタグと疑似要素で三本線を表現する
- :checkedでチェックされたときの挙動を表現する
デフォルトのチェックボックスはいらないので、下記CSSで非表示にします。
input[type="checkbox"] {
opacity: 0;
visibility: hidden;
position: absolute;
}
次に三本線です。
ハンバーガーボタンは「幅50px・高さ80px」でスタイリングし、その中に三本線を描写します。ハンバーガーボタンはヘッダーと同じ高さにしておくと、クリック領域が広くなってユーザーの使い勝手がよくなります。
中央の線はspan、上下2本は疑似要素(before、after)とし、それぞれposition: absolute
で配置しました。
なお、線の幅や太さ、間隔などは案件ごとに調整してください。
.hamburger {
display: block;
width: 50px;
height: 80px;
position: relative;
display: flex;
justify-content: center;
align-items: center;
cursor: pointer;
}
.hamburger span,
.hamburger span::before,
.hamburger span::after {
position: absolute;
display: block;
content: "";
width: 100%;
height: 2px;
background-color: #fff;
transition: all 0.5s;
}
.hamburger span::before {
top: -10px;
}
.hamburger span::after {
bottom: -10px;
}
チェックボックスがチェックされたときの挙動をスタイリングします。
「チェックされたとき」は:checkedで表現できます。
中央の線はtransparentで透明にし、上下2本をそれぞれ45度回転。topとbottomの位置を調整して「×」を表現しています。
なお「+」は「隣接兄弟結合子」と呼ばれ、直後の兄弟要素にのみCSSが適用されます。
input[type="checkbox"]:checked + .hamburger span {
background-color: transparent;
}
input[type="checkbox"]:checked + .hamburger span::before {
top: 0;
transform: rotate(45deg);
}
input[type="checkbox"]:checked + .hamburger span::after {
transform: rotate(-45deg);
bottom: 0;
}
ハンバーガーボタンをクリックすると、三本線が「×」に変化するようになりました。
See the Pen CSSのみで作るハンバーガーメニュー(ボタン) by たけち (@kwxteqls-the-scripter) on CodePen.
メニューを作る
メニューを作ります。
HTML
<nav class="nav">
<ul class="nav__lIst">
<li class="nav__item"><a href="/">home</a></li>
<li class="nav__item"><a href="#">事業内容</a></li>
<li class="nav__item"><a href="#">会社概要</a></li>
<li class="nav__item"><a href="#">採用情報</a></li>
<li class="nav__item"><a href="#">お問い合わせ</a></li>
</ul>
</nav>
1つだけポイントがありまして、それはinputと同階層に置くという点です。
こういうことですね。
<input type="checkbox" id="check">
<label for="check" class="hamburger">
<span></span>
</label>
<nav class="nav">
<ul class="nav__lIst">
<li class="nav__item"><a href="/">home</a></li>
<li class="nav__item"><a href="#">事業内容</a></li>
<li class="nav__item"><a href="#">会社概要</a></li>
<li class="nav__item"><a href="#">採用情報</a></li>
<li class="nav__item"><a href="#">お問い合わせ</a></li>
</ul>
</nav>
inputと同じ階層に置くことで、「チェックされたとき」のCSSが当てやすくなります。
CSS
メニューのCSSを書いていきましょう。
メニュー全体は、横幅80%・高さは100vh(画面いっぱい)です。
今回は右からスライドインさせたいので、positionをfixedとした上で、rightを-120%にして見た目上「非表示」にしています。
.nav {
position: fixed;
width: 80%;
height: 100vh;
top: 80px;
right: -120%;
background-color: #0f5474;
color: #fff;
padding: 50px 0;
transition: all 0.5s;
}
.nav__item a {
display: block;
font-size: 20px;
padding: 20px 0 20px 50px;
text-transform: uppercase;
}
.nav__item a:hover {
color: #0f5474;
background-color: #fff;
}
「チェックボックスがチェックされたときメニューを表示させる」の部分をCSSで書いていきます。
:checkedを使い、rightの位置を0にすると、メニューが右から現われます。
なお、隣接していない兄弟要素なので「~(一般兄弟接合子)」を使っている点に気を付けてください。
input[type="checkbox"]:checked ~ .nav {
right: 0;
}
これで、CSSのみで作るハンバーガーメニューが完成しました。
See the Pen CSSのみで作るハンバーガーメニュー by たけち (@kwxteqls-the-scripter) on CodePen.
CSSのみでハンバーガーメニューを作るデメリット
CSSだけでハンバーガーメニューを作るにあたり<input type="checkbox">を使いましたが、実は大きなデメリットがあります。
それはアクセシビリティの低下です。
まず、視覚障害者の方向けのスクリーンリーダー(読み上げ機能)が無効になります。
また、input要素を非表示にしているので、キーボード操作ができません。
つまり、使い勝手が悪い、という事ですね。
そもそもチェックボックの機能をまったく果たしていないのも問題かもしれません。
いずれにしても、よほどの理由がない限り、JavaScriptやjQueryを使って実装した方がおすすめです。
まとめ
今回は、CSSのみでハンバーガーメニューを作る方法を解説しました。
先述したとおりおすすめの方法ではありませんが、JavaScriptやjQueryがどうしても使えないという場面で重宝するので、今後そのような場面があればこの記事を再度確認してください。