LoginSignup
17
17

More than 5 years have passed since last update.

チェックボックスとCSSだけでハンバーガーメニューを実装する ボタン編

Last updated at Posted at 2016-01-03

ハンバーガーメニューの作成

今回の投稿では単純にハンバーガーメニューのボタンを作成しようと思います
こんな感じのやつですね
screencast 2016-01-03 23-54-51.gif

まずはHTML

HTMLはこれだけです。
<input type="checkbox" class="menuopen">

 チェックボックスを消す

ハンバーガーメニューにしたいのでデフォルトのチェックボックスは消します。

.menuopen {
    -webkit-appearance: none;
    -moz-appearance: none;
    appearance: none;
    border-width: 0;
}

iOSの場合、ボーダーを消さないとしつこく生き残るのでご注意ください(多分他のreset.cssとかで消してると思うけど)
…でここから更に注意点がひとつ
この状態だと確かに一見チェックボックスは見えませんが、ボックスがあるはずのところをiOSでタップするとチェックマークの黒い点が出てきます。それでは色々面倒なのでこの点も消します。

.menuopen {
    -webkit-appearance: none;
    -moz-appearance: none;
    appearance: none;
    border-width: 0;
    width: 0;
    height: 0;
}

縦横共に0を指定することで完全に消えました。

投稿した後で気づいたのですが、このままではAndroidで見た時にアウトラインが生成されます。
なのでフォーカス時にアウトラインが生成されないように以下のCSSを追記します

.menuopen:focus{outline:0;}

3本線を作る

作り方は簡単!
擬似要素(before,after)に上下のボーダーを付けるだけです。
今回は縦横40pxぐらいで作りました。
次からの説明を楽にするためボーダーの色を赤と青で分けてみました。

.menuopen{position:absolute;}
.menuopen:before,.menuopen:after{  
    position: absolute;
    content: "";
    display: block;
    height: 12px;
    width: 40px;
    border-top-style: solid;
    border-bottom-style: solid;
}
.menuopen:before{
    top: 4px;
    border-top-width: 4px;
    border-bottom-width: 2px;
    border-color: red;
}
.menuopen:after{    
    top: 22px;
    border-top-width: 2px;
    border-bottom-width: 4px;
    border-color: blue;
}

真ん中の線は二つの擬似要素のボーダーが触れ合うことで表現します。
screencapture 8.png

閉じるボタンを作る

先ほどのハンバーガを変形させて(CSSの上書きで)閉じるボタンを作ります。
以下のコードで擬似要素の高さをなくし、位置を同じ位置にし、回転させてXを作ります

.menuopen:checked:before, .menuopen:checked:after {
    top: 20px;
    height: 0;
}

.menuopen:checked:before {
    -webkit-transform: rotate(135deg);
    -moz-transform: rotate(135deg);
    -ms-transform: rotate(135deg);
    -o-transform: rotate(135deg);
    transform: rotate(135deg)
}

.menuopen:checked:after {
    -webkit-transform: rotate(45deg);
    -moz-transform: rotate(45deg);
    -ms-transform: rotate(45deg);
    -o-transform: rotate(45deg);
    transform: rotate(45deg)
}

これでチェックを入れると閉じるボタンを作れるようになりました。
screencapture 9.png

アニメーションを加える

お待たせいたしました!あとはアニメーションを加えれば完成ですね。
ではまずは展開時のアニメーションを展開後のcssに書きます
これはメニューの開閉でアニメーションが2つ必要であり、通常時の方に書いたアニメーションは展開時にもう一つのアニメーションで消されるからです。
screencast 2016-01-04 01-11-06.gif

.menuopen:checked:before, .menuopen:checked:after {
    -webkit-transition: 0.5s transform 0.5s, 0.2s height 0s, 0.25s top 0s;
    -moz-transition: 0.5s transform 0.5s, 0.2s height 0s, 0.25s top 0s;
    transition: 0.5s transform 0.5s, 0.2s height 0s, 0.25s top 0s;
}

解説すると最初に高さと位置の調節を0.25秒間で行います。二つの秒数が異なるのは、なんとなくです。そこらへんを細かく指定するとなると、色々面倒なのでここでは省略します。あとは完全に重なってから少し時間を空けて回転させてあげれば完成です。
メニューを閉じる時は先ほどの逆になるので
.menuopen:before,.menuopen:after{
-webkit-transition: 0.5s transform 0s, 0.2s height 0.5s, 0.25s top 0.5s;
-moz-transition: 0.5s transform 0s, 0.2s height 0.5s, 0.25s top 0.5s;
transition: 0.5s transform 0s, 0.2s height 0.5s, 0.25s top 0.5s;
}

このような感じになります。
基本的に実行タイミングが変わるだけですね(^^;;

まとめ

今回のコードをまとめるとこうなります

.menuopen{
    position: absolute;
    -webkit-appearance: none;
    -moz-appearance: none;
    appearance: none;
    border-width: 0;
    width: 0;
    height: 0;
}
.menuopen:focus{outline:0;}
.menuopen:before,.menuopen:after{  
    position: absolute;
    content: "";
    display: block;
    height: 12px;
    width: 40px;
    border-color: black;
    border-top-style: solid;
    border-bottom-style: solid;
    -webkit-transition: 0.5s transform 0s, 0.2s height 0.5s, 0.25s top 0.5s;
    -moz-transition: 0.5s transform 0s, 0.2s height 0.5s, 0.25s top 0.5s;
    transition: 0.5s transform 0s, 0.2s height 0.5s, 0.25s top 0.5s;
}
.menuopen:before{
    top: 4px;
    border-top-width: 4px;
    border-bottom-width: 2px;
}
.menuopen:after{    
    top: 22px;
    border-top-width: 2px;
    border-bottom-width: 4px;
}
.menuopen:checked:before, .menuopen:checked:after {
    top: 20px;
    height: 0;
    -webkit-transition: 0.5s transform 0.5s, 0.2s height 0s, 0.25s top 0s;
    -moz-transition: 0.5s transform 0.5s, 0.2s height 0s, 0.25s top 0s;
    transition: 0.5s transform 0.5s, 0.2s height 0s, 0.25s top 0s
}

.menuopen:checked:before {
    -webkit-transform: rotate(135deg);
    -moz-transform: rotate(135deg);
    -ms-transform: rotate(135deg);
    -o-transform: rotate(135deg);
    transform: rotate(135deg)
}

.menuopen:checked:after {
    -webkit-transform: rotate(45deg);
    -moz-transform: rotate(45deg);
    -ms-transform: rotate(45deg);
    -o-transform: rotate(45deg);
    transform: rotate(45deg)
}
17
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
17